YARA 规则规避概述
在 White Knight Labs 的一篇关于使用 Cobalt Strike 规避 EDR 的博客文章中,他们讨论了绕过针对 Cobalt Strike 的 YARA 规则的方法。最难绕过的规则之一是Windows_Trojan_CobaltStrike_f0b627fc。
此特定规则针对的是 Cobalt Strike 二进制文件中的 10 字节序列:
x25xffxffxffx00x3dx41x41x41x00
即使使用了睡眠掩码并利用睡眠掩码工具包生成自定义掩码,此字节序列仍会保留在最终的 shellcode 中。使用 Defuse.ca x64 反汇编程序,我们可以看到此 shellcode 转换为以下汇编指令:
and eax, 0xffffff cmp ecx, 0x414141
xB8xFFxFFxFFx00x3Dx41x41x41x00
然而,虽然这种方法改变了AND指令,但CMP指令保持不变,这意味着这个修改后的 shellcode 仍然可以被新编写的 YARA 规则检测到。
更有效的绕过方法
通过实验,我发现实际上可以完全删除 cmp 指令。只需将 EAX 设置为 0xFFFFFF,Cobalt Strike 信标即可正常运行。
以下是一些可用于避免检测的替代 shellcode 序列:
MOV EAX, 0x00414141XOR EAX, EAX; MOV EAX, 0x00414141
在这种情况下,在将寄存器设置为之前XOR EAX, EAX将其清零。EAX0x00414141
指令中的这种细微变化会改变 shellcode,但不会影响整体功能,从而使静态分析工具更难签名。
使用 NOP 指令随机化 Shellcode
虽然上述方法有助于逃避原来的规则,但新的shellcode仍然可以被签名。
x25xffxffxffx00x3dx41x41x41x00为了解决这个问题,我开发了一个脚本,可以自动用备用 shellcode替换原始字节序列,然后随机将 NOP 指令(x90和x87xC0)插入到 shellcode 中。
NOP(无操作)指令不会影响执行流程,但会为 shellcode 增加随机性。通过在 shellcode 的开始、中间或结尾等随机位置插入 NOP,您可以进一步混淆 shellcode,使其更难签名。
实现 Shellcode 替代方案的关键考虑因素
当实现替代 shellcode 时,请记住以下几点:
-
Shellcode 大小:总的 shellcode 大小不能超过 10 个字节,因为这是原始序列的长度。
-
更小的随机化尺寸:最好使用短于 10 个字节的 shellcode 序列,从而允许 Python 脚本插入 NOP 并在未来的迭代中重用它们以实现更好的规避。
本博客中提到的脚本使用示例和 GitHub 存储库
下面是一个使用示例,我替换了 http_x64.xthread.bin 的字节并将其保存到 beacon.bin:
你可以在我的 GitHub 上找到绕过 YARA 规则的 Python 脚本:
https://github.com/WafflesExploits/CobaltStrike-YARA-Bypass-f0b627fc
此外,我还添加了 White Knight Labs 的 Python 脚本,用于生成 Rich 标头和前置标头,并进行了一些小的改进。
原文始发于微信公众号(Ots安全):Mutex绕过 CobaltStrike 的 YARA 规则 f0b627fc 来逃避 EDR
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论