用 Yara 对红队工具 "打标"(三)——免杀类规则提取
字数 1080 2025-08-06 18:07:54
Yara规则对红队免杀工具的特征提取与分析
前言
本文是基于奇安信攻防社区文章《用Yara对红队工具"打标"(三)——免杀类规则提取》的详细教学文档,重点讲解如何通过Yara规则对红队免杀工具进行特征提取和分析。
混淆类工具特征提取回顾
混淆类和免杀类工具的特征提取方法类似,都是分析提取被"处理过"文件的特征。
PHPFuck特征提取
PHPFuck仅使用7个不同字符([、]、+、!、(、)、.)来编写和执行PHP代码,通过异或和加运算产生其他字符。
Yara规则示例:
rule PHPFuck {
meta:
decription = "phpfuck only uses 7 characters to write, so use these 7 characters as metadata."
strings:
$s1 = "[].[]"
$s2 = "[]^[]"
$s3 = "["
$s4 = "[][[]]"
condition:
all of ($s*) and for any of them:(# > 10 )
}
JSFuck特征提取
JSFuck与PHPFuck类似,仅使用6个不同字符。
Yara规则示例:
rule JSFuck {
meta:
decription = "jsfuck only uses 6 different characters, so just include the metadata of these characters directly."
strings:
$s1 = "[]+[]"
$s2 = " and for any of them:(# > 10 )
}
免杀类工具特征提取方法
bypassAV工具分析
项目特点:
- 条件触发式远控
- VT 5/70免杀率
- 可免杀国内杀软及Defender、卡巴斯基等主流杀软
源码结构:
go_shellcode_encode.py:简单base64加密payload并替换字符main.go:包含解密和执行逻辑
免杀原理:
- 动态加载函数调用(kernel32.dll的VirtualAlloc、RtlMoveMemory)
- 内存中自定义变形小算法解密
- 条件触发机制躲避沙盒检测
PE文件结构基础
了解PE文件结构对特征提取至关重要:
- PE文件头部:索引整个文件,编译时计算填充
- PE文件身体:
.text节:代码段.rdata节:常量段(含导入表).data节:变量段.reloc节:重定位表
特征提取策略
-
选择代码还是数据:
- 优先选择代码段(.text)特征
- 数据段(.rdata)特征通常过于通用
-
机器码特征分析:
- 从IDA反汇编中提取机器码
- 识别不变部分:
- 寄存器操作数和立即数
- 传入参数和局部变量的引用(相对于esp/rsp的位置)
- 可变部分:
- 内存操作数(受编译参数影响)
- 函数调用地址(段间相对偏移)
bypassAV的Yara规则
rule BypessAV {
meta:
reference = "https://github.com/Threekiii/Awesome-Redteam"
strings:
$x1 = {
49 3B 66 10 0F 86 85 01 00 00 48 83 EC 60 48 89
6C 24 58 48 8D 6C 24 58 48 89 44 24 68 48 8D 0D
00 BF 01 00 00 00 48 8D 35 ?? ?? ?? 00 49 89 F8
49 C7 C1 FF FF FF FF E8 48 8D 0D 00 BF 01 00 00
00 48 8D 35 ?? ?? ?? 00 49 89 F8 49 C7 C1 FF FF
FF FF 0F 1F 40 00 E8 48 8D 0D 00 BF 01 00 00 00
48 8D 35 ?? ?? ?? 00 49 89 F8 49 C7 C1 FF FF FF
FF E8 48 8D 0D 00 BF 01 00 00 00 48 8D 35 ?? ??
?? 00 49 89 F8 49 C7 C1 FF FF FF FF E8 48 8B 15
?? ?? ?? 00 48 89 D9 48 89 C3 48 89 D0 E8 48 89
44 24 48 48 89 5C 24 38 48 8D 05 ?? ?? ?? 00 E8
48 8B 54 24 38 48 89 50 08 48 C7 40 10 00 30 00
00 48 C7 40 18 40 00 00 00 4C 8B 15 ?? ?? ?? 00
48 89 C3 B9 04 00 00 00 48 89 CF 4C 89 D0 E8 48
8B 54 24 38 48 85 D2 76 73 48 89 44 24 40 48 8B
4C 24 48 48 89 4C 24 50 48 8D 05 ?? ?? ?? 00 E8
48 8B 4C 24 40 48 89 08 48 8B 54 24 50 48 89 50
08 48 8B 54 24 38 48 89 50 10 48 8B 15 ?? ?? ??
00 48 89 C3 BF 03 00 00 00 48 89 D0 48 89 F9 0F
1F 44 00 00 E8 48 8B 44 24 40 31 DB 48 89 D9 48
89 CF 48 89 CE E8 48 8B 6C 24 58 48 83 C4 60 C3
}
$x2 = {FF 20 47 6F 20 62 75 69 6C 64 20 49 44 3A}
condition:
uint16be(0) == 0x4D5A and all of them
}
规则绕过方法
- 添加无关代码:
func build(ddm string) {
str1 := strings.Replace(ddm, "#", "A", -1)
str2 := strings.Replace(str1, "!", "H", -1)
fmt.Println("666") // 添加无关代码
str3 := strings.Replace(str2, "@", "1", -1)
// ...其余代码
}
- 函数拆分:
func build1(ddm string) {
str1 := strings.Replace(ddm, "#", "A", -1)
str2 := strings.Replace(str1, "!", "H", -1)
return str2
}
func build2(ddm2 string) {
str3 := strings.Replace(ddm2, "@", "1", -1)
// ...其余代码
}
- 变量名随机化:
- 对基于二进制代码的规则无效
- 可能对抗基于字符串的规则
总结与思考
-
规则提取限制:
- 不能过于宽泛(导致误报)
- 不能过于狭窄(容易被绕过)
-
免杀对抗本质:
- 攻防一体,了解防御方法才能更好攻击
- 特征提取与免杀技术是持续对抗过程
-
其他检测方法:
- 特征代码法
- 校验和法
- 行为监测法
- 软件模拟法
- 启发式扫描
通过本文介绍的方法,可以系统性地分析和提取红队免杀工具的特征,同时也为绕过这些检测提供了思路。在实际应用中,需要结合多种检测方法才能构建更全面的防御体系。