描述:
这是内存扫描器的一种新绕过技术。它有助于隐藏可能被防病毒软件供应商标记的问题代码。
这基本上是Voidgate的改进版本,但没有所有以前的限制。
该技术与所有 C2 信标兼容,它可以处理多线程有效负载,并且可以处理由pe_to_shellcode等工具生成的可执行文件,从而允许它运行几乎任何非 .NET 可执行文件。
在调试器下它看起来是这样的:
工作原理:
该技术由两个程序组成:
1.)Dismantle
该程序记录所有唯一执行的指令及其偏移量。它将使用这些数据创建一个头文件,该文件需要包含在Voidmaw负责有效载荷执行的第二个程序()中。
该程序接受包含所需有效负载的输入文件(可以是 Cobaltstrike 信标或可执行文件(如 mimikatz),转换为 shellcode 并将其读入缓冲区。
然后程序将PAGE_GUARD对该页面设置保护,并安装一个向量异常处理程序 ( VEH)。此 VEH 负责两件事:
-
处理STATUS_GUARD_PAGE_VIOLATION程序在内存中有效载荷处创建新线程并将偏移量和执行的汇编代码保存在结构中的指令指针处后将引发的任何问题unordered_map,然后设置TRAP_FLAG触发EXCEPTION_SINGLE_STEP这对于恢复PAGE_GUARD该内存页上的保护是必要的,因为触发它将删除它。
-
处理由我们的处理程序配置的EXCEPTION_SINGLE_STEP触发的任何异常并恢复保护,以便下次 CPU 尝试在该内存页面上执行某些操作时,我们可以生成异常。这对于记录所有执行的指令是必需的。TRAP_FLAGPAGE_GUARD
一旦程序完成了所有执行指令的记录,它将在unordered_map中对它们进行加密。
之后,程序将创建先前执行的有效载荷的副本,并使用 INT3 指令屏蔽所有记录的执行汇编。
完成上述所有步骤后,程序将生成一个输出文件。此文件是您必须包含在Voidmaw程序中的头文件。
重要的:
该程序仅记录已执行的代码分支。如果某个分支未执行,我们的应用程序将不会记录该代码。如果您想要记录 C2 信标,则在记录过程中必须确保负责网络的代码已成功执行,因为如果在记录过程中失败,则负责处理失败的分支将是在我们的 unordered_map 中注册的分支。
必须按下OK录音开始后弹出的消息框中的按钮来手动停止录音。
建议您使用 Dismantle 的环境与红队交战的环境相似(例如:主机必须具有网络),以确保执行与目标上的执行相同。
录制时使用相同级别的权限非常重要(例如:如果您想录制 mimkatz,您需要在以管理员身份运行时录制它,这样您就可以获得负责调整执行和捕获权限的正确代码分支并且不会失败)。
如果您要运行的可执行文件需要 CLI 参数,您可以使用该-a选项提供它们。主机程序将在有效负载中创建新线程之前更改其自己的参数。
2.)Voidmaw
该程序负责执行新生成的有效载荷。
上面提到的生成的头文件有4个重要元素:
-
原始有效载荷被 INT3 屏蔽,覆盖所有执行的指令
-
用于解密 unordered_map 中的数据的 XOR 加密密钥
-
无序映射作为全局变量
-
“InitMap”函数负责初始化 unordered_map,其中包含加密的汇编指令及其发生的偏移量
该程序将首先调用 InitMap 函数,然后创建一个内存区域来写入有效载荷,然后安装一个VEH。
该车辆负责处理EXCEPTION_BREAKPOINT。
当我们在复制的有效载荷上创建新线程时,每当我们遇到 INT3(在我们记录期间执行并被屏蔽的指令)时,我们都会触发此 VEH。然后,VEH 将检查发生这种情况的偏移量。一旦找到偏移量,它将在 unordered_map 中查找该偏移量,并将加密的程序集复制到缓冲区并解密并将其写入发生异常的指令指针处。
此后,指令的偏移量和大小被放入队列中,在下一次异常发生时,它将被 INT3 屏蔽,从而基本上隐藏其先前的步骤。每个线程只能看到一条汇编指令。
汇编指令只有 2 种可能的状态:1.) 被 INT3 屏蔽 2.) 被原始汇编指令替换
如果有效载荷在其代码段的某个地方创建新线程,如果指令被屏蔽,我们将得到一个新的异常并处理它。这使得该技术能够处理多线程有效载荷,而无需在 NtCreateThread 上设置钩子或其他可能创建新线程的方法。
重要的:
-
如果您想在 Visual Studio 中调试 VEH,则需要在 x64 上使用操作码 0x6 更改 INT3 掩码以触发 EXCEPTION_ILLEGAL_INSTRUCTION,因为 Visual Studio 不允许您在其调试器中处理 EXCEPTION_BREAKPOINT。
-
如果有效载荷的前两个字节是“MZ”,程序在执行它们后不会将其屏蔽掉。这很重要,因为许多反射加载器需要找到它才能自行加载。
用法:
1.) 卸载程序:
.Dismantle.exe -p "C:mimikatz.bin" -o "./out.h" -a "privilege::debug"
在哪里:
-
-p 是初始有效载荷的路径
-
-o 是包含最终有效载荷的头文件的保存路径
-
-a 是需要传递给进程的参数。这是可选的。如果未配置此参数,程序将清除其参数,以避免向有效负载提供垃圾参数。
2.) Voidmaw.exe:使用上面生成的头文件进行编译并运行。此程序不带任何参数,可以作为独立可执行文件交付到目标机器上。
编译依赖项:
-
Zycore - https://github.com/zyantific/zycore-c
-
Zydis - https://github.com/zyantific/zydis
注意:编译后的库包含在项目中,但建议您自行编译。
演示:
Cobaltstrike 信标:
注意:这是绕过内存扫描仪和 YARA 规则的方法,并非万无一失。不良 OPSEC(例如默认 cobaltstrike 配置文件)将使您的信标被标记!
1.)有效载荷生成: 2.)有效载荷执行:
Mimikatz:
1.)有效载荷生成:
2.)有效载荷执行:
免责声明:
该存储库仅用于学术目的,该软件的使用由您负责。
项目地址:
https://github.com/vxCrypt0r/Voidmaw
原文始发于微信公众号(Ots安全):一种可用于绕过内存扫描仪的新技术
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论