利用Yara快速狩猎内存中的威胁
字数 1411 2025-08-04 22:51:28
利用Yara快速狩猎内存中的威胁 - 教学文档
一、Yara规则基础
1. Yara语法结构
Yara规则由三大部分组成:
- strings:定义要匹配的字符串或十六进制模式
- condition:定义匹配条件
- 规则名称:用
rule关键字包裹
/* 注释内容 */
rule ExampleRule {
strings:
$my_text_string = "hacker"
$my_hex_string = { 41 B8 03 00 00 00 BA 02 00 00 00 B9 01 00 00 00 }
condition:
$my_text_string or $my_hex_string
}
2. 字符串定义方式
-
文本字符串:用双引号包裹
$my_text_string = "hacker" -
十六进制字符串:用花括号包裹
$my_hex_string = { 41 B8 03 00 00 00 BA 02 00 00 00 B9 01 00 00 00 }
3. 特殊匹配技巧
-
通配符:使用
?匹配任意字符$hex_string = { E2 34 ?? C8 A? FB } -
长度不确定:使用
[min-max]指定长度范围$hex_string = { F4 23 [4-6] 62 B4 }
4. 常用关键字
可以在字符串后追加关键字进行特殊处理:
$text_string = "foobar" nocase // 不区分大小写
$text_string = "foobar" base64 // 进行base64处理
$text_string = "foobar" xor // 进行xor处理
二、编写高效的Yara规则
1. 分析目标程序
示例C++程序:
#include <Windows.h>
#include <iostream>
std::string name = "endlessparadox";
int for_test(int a, int b, int c) {
return a+b+c;
}
int main() {
std::cout << "Hello Security service engineer!\n";
std::cout << "Address is " << &for_test << std::endl;
for_test(1, 2, 3);
std::cout << "Address is " << &name << std::endl;
int s = 100;
for (int i = 0; i < 10; i++) {
s = i + s;
}
std::cout << "PID is " << GetCurrentProcessId() << std::endl;
getchar();
}
2. 从汇编指令提取特征
for_test(1, 2, 3)对应的汇编指令:
mov r8d, 3
mov edx, 2
mov ecx, 1
call for_test(address)
对应的Yara规则:
$my_hex_string = { 41 B8 03 00 00 00 BA 02 00 00 00 B9 01 00 00 00 }
3. 查找独有字符串
使用Sysinternals中的strings工具提取程序中的所有字符串:
strings64.exe demo_foryara.exe
对于独特的字符串(如"endlessparadox"),可以直接作为特征:
$unique_string = "endlessparadox"
三、优秀Yara规则资源
四、内存威胁狩猎实战
1. 修改Yara工具批量扫描内存
默认Yara工具只能扫描单个进程,可以修改为批量扫描所有进程:
# 核心改动代码:设置pid=999999时扫描所有进程
if pid == 999999:
for proc in psutil.process_iter():
scan_process(proc.pid)
2. 扫描命令示例
yara64.exe Windows_Trojan_CobaltStrike.yar 999999
3. 注意事项
- 使用System权限扫描(红队可能阻止非System进程访问)
- 重要系统进程不可随意终止(如System、Registry、Lsass等)
五、手工清除恶意线程
1. 识别恶意线程特征
- 起始地址为
0x00000000 - 调用栈中包含
SleepEx(CS的休眠调用) - 存在自加密内存引用(CS休眠时加密内存的特征)
2. Cobalt Strike注入技术
CS按顺序尝试以下注入技术:
- CreateThread "ntdll!RtlUserThreadStart+0x42"
- SetThreadContext | NtQueueApcThread
- NtQueueApcThread
- CreateRemoteThread
- RtlCreateUserThread
3. 其他C2工具的线程特征
- Metasploit:默认使用syscall注入
- Sliver:默认使用syscall注入,TCP连接可见
4. 使用Process Explorer辅助分析
- 按"Start Address"排序,将
0x000可疑线程排在最前 - 分析线程调用栈,识别休眠和加密特征
六、其他威胁狩猎场景
1. 狩猎磁盘上的威胁
- DLL代理:检测DLL_PROCESS_ATTACH、LoadLibrary、GetProcAddress等特征
- Rootkit:检测有漏洞的驱动签名
- Webshell:匹配已知webshell特征
示例DLL代理检测规则:
rule DLLProxying {
condition:
uint16(0) == 0x6461 and
uint32(2) == 0x6C6C6100 and
uint32(6) == 0x6574726F and
uint32(10) == 0x72630067 and
uint32(14) == 0x61647079 and
(pe.exports("ProxyFunction") or pe.exports("ProxyFunction@0"))
}
2. 日志分析
示例webshell检测规则:
rule webshell_h4ntu_shell {
strings:
$s0 = "<TD><DIV STYLE=\"font-family: verdana; font-size: 10px;\"><b>Server Adress:</b"
$s3 = "<TD><DIV STYLE=\"font-family: verdana; font-size: 10px;\"><b>User Info:</b> ui"
condition:
all of them
}
七、总结
- Yara是快速特征检测的有效工具,适用于内存、磁盘和日志分析
- 编写高效规则需要理解目标程序的汇编指令和独特特征
- 内存狩猎需结合工具扫描和手工分析线程调用栈
- 攻防是成本比拼,防御方需不断更新规则应对攻击方的规避技术