
将AppDomain Manager注入与shellcode嵌入签名的二进制文件相结合,以规避EDR/AV检测,用于红队载荷。
过去几天我一直在尝试 AppDomain 管理器注入 技术,在之前的红队演练中,它针对某些 EDR 取得了不错的成功。虽然这对于初始访问向量来说非常不错,但我想发布一个 POC,帮助你将 shellcode 隐藏在其他地方。不再需要嵌入 shellcode 的 DLL 文件!
虽然这是一项独立使用时非常出色的技术,但当与诸如通过 ISO/ZIP/VHD/VHDX 文件发送 C# ClickOnce 之类的投递技术结合时,真正的问题是:有十分之一的概率,用于 appdomain 的 DLL 会被 AV/EDR 的 AI/ML 启发式检测到。这是因为在初始化 appdomain 之前,DLL 文件需要先被释放到磁盘上。暂时忽略远程 DLL 加载(.config 中的 UNC 路径),appdomain 的 DLL 会包含 shellcode,我强烈认为这是可能导致静态检测的原因,因为其余代码(即 WINAPI 调用)可以动态解析并很好地混淆。
我想在最小化 DLL 初始内容方面改进这项技术。起初,我尝试将加密的 shellcode 放在磁盘上的单独文件中,同时保留注入器 DLL,但后来我偶然发现了 Checkpoint 关于 Zloader 活动 的精彩博客。
TLDR 版本:我们可以将任意数据嵌入 PE 的某些字段中,且不会破坏文件的签名。这样我们的数据就会被嵌入,而 exe 文件仍能保持数字签名。
所以思路是:将一个加密的 shellcode 存根嵌入到已知的已签名可执行文件中,同时设法保持其签名,就像 Zloader 恶意软件所做的那样。这样一来,AppDomain 管理器 DLL 内部将不再包含 shellcode,而只包含从加载它的 PE 二进制文件中解析 shellcode 并解密、作为单独线程执行的逻辑。这样做可能会降低 DLL 的静态检测率,同时你的 shellcode 被巧妙地放置在已签名的二进制文件中。
我试图通过手动篡改从 VirusTotal 获取的 ZLoader 样本来实现这一点,但后来发现了一个已经很好地实现了所有这些技术的项目——Sigflip。在这个 POC 中,我利用 Sigflip 的加载器代码来构建 AppDomain DLL,并使用 SigFlip 注入器将加密的 shellcode 嵌入到我们的 C# exe 中。
像 Cobalt Strike 的无阶段 shellcode 这样的大块 shellcode 将不再驻留在磁盘上未签名的 DLL 中,无论使用何种混淆/编码技术。DLL 更加干净、小巧、隐蔽,代码量极少,从而降低检测几率。
SigFlip.exe -i "Z:\ZLoader\CasPol.exe" "Z:\ZLoader\x64-stageless.bin" "Z:\ZLoader\update.exe" "S3cretK3y"update.exe 的二进制文件,它将是一个嵌入了加密 shellcode 的数字签名 PE。csc /target:library /out:test.dll test.cs这个 POC 只是我脑海中的一个想法,将两种完全不同的防御规避技术组合在一起,帮助我和其他红队成员为其行动构建更好的初始执行载荷。本项目以 AppDomain 管理器注入为例,但该思路同样适用于其他注入技术,如 DLL 侧加载、DLL 劫持等。
特别感谢 med0x2e,本 POC 基于他的 SigFlip 项目构建