Ssh… 别告诉他们我不是HTTPS:攻击者如何利用SSH.exe作为潜入您网络的后门
引言:LOLBAS的威胁
Living Off the Land Binaries、Scripts和Libraries(简称LOLBins或LOLBAS)是操作系统的合法组件,威胁行为者可以在针对组织的攻击活动中利用它们来实现目标。这样做是为了尝试避免终端保护产品的检测,并作为编写自定义恶意代码的替代方案。
在许多情况下,这些二进制文件是众所周知的,技术有文档记录,并且(希望)安全产品或威胁狩猎过程可以检测到恶意使用。然而,在最近的一次事件响应参与中,我们发现了一种LOLBAS技术,不属于那种有详细文档记录的类别。事实上,该技术目前似乎尚未纳入MITRE ATT&CK框架。
事件背景
场景是客户报告其笔记本电脑出现异常行为。当他们不在工作时,从工作系统上他们的个人账户进行了欺诈性购买。初步调查时,客户确定有从他们的域控制器到相关端点的远程桌面协议(RDP)连接。可以理解,客户变得非常担忧,并联系BHIS寻求事件响应协助。
我们在环境中部署了Velociraptor,并开始分析到互联网的网络连接。我们发现,在少数Windows服务器上,有一个非常可疑的安全外壳(SSH)命令连接到外部IP地址。
但等等!Windows服务器上的SSH?那不是Linux的东西吗?
我们在渗透测试和事件响应参与中发现,许多人仍然没有意识到微软在2018年决定在Windows Server和桌面操作系统中包含OpenSSH的影响。
我内心的老系统管理员喜欢这个决定,并认为“我终于不需要第三方SSH客户端了”。但我内心的安全分析师知道SSH是一个非常强大和多功能的工具。威胁行为者也知道它的力量和多功能性。它不仅仅能够登录到远程服务器并交互式运行命令。
攻击技术分析
以我们在此事件调查中发现的命令为例:
|
|
在此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客户,您已经具有对此威胁行为者的检测和主动威胁狩猎。