利用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. Neo23x0/signature-base
  2. advanced-threat-research/Yara-Rules
  3. elastic/protections-artifacts

四、内存威胁狩猎实战

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按顺序尝试以下注入技术:

  1. CreateThread "ntdll!RtlUserThreadStart+0x42"
  2. SetThreadContext | NtQueueApcThread
  3. NtQueueApcThread
  4. CreateRemoteThread
  5. 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
}

七、总结

  1. Yara是快速特征检测的有效工具,适用于内存、磁盘和日志分析
  2. 编写高效规则需要理解目标程序的汇编指令和独特特征
  3. 内存狩猎需结合工具扫描和手工分析线程调用栈
  4. 攻防是成本比拼,防御方需不断更新规则应对攻击方的规避技术

八、参考资料

  1. elastic/protections-artifacts
  2. Windows系统进程概述
利用Yara快速狩猎内存中的威胁 - 教学文档 一、Yara规则基础 1. Yara语法结构 Yara规则由三大部分组成: strings :定义要匹配的字符串或十六进制模式 condition :定义匹配条件 规则名称 :用 rule 关键字包裹 2. 字符串定义方式 文本字符串:用双引号包裹 十六进制字符串:用花括号包裹 3. 特殊匹配技巧 通配符:使用 ? 匹配任意字符 长度不确定:使用 [min-max] 指定长度范围 4. 常用关键字 可以在字符串后追加关键字进行特殊处理: 二、编写高效的Yara规则 1. 分析目标程序 示例C++程序: 2. 从汇编指令提取特征 for_test(1, 2, 3) 对应的汇编指令: 对应的Yara规则: 3. 查找独有字符串 使用Sysinternals中的 strings 工具提取程序中的所有字符串: 对于独特的字符串(如"endlessparadox"),可以直接作为特征: 三、优秀Yara规则资源 Neo23x0/signature-base advanced-threat-research/Yara-Rules elastic/protections-artifacts 四、内存威胁狩猎实战 1. 修改Yara工具批量扫描内存 默认Yara工具只能扫描单个进程,可以修改为批量扫描所有进程: 2. 扫描命令示例 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代理检测规则: 2. 日志分析 示例webshell检测规则: 七、总结 Yara是快速特征检测的有效工具,适用于内存、磁盘和日志分析 编写高效规则需要理解目标程序的汇编指令和独特特征 内存狩猎需结合工具扫描和手工分析线程调用栈 攻防是成本比拼,防御方需不断更新规则应对攻击方的规避技术 八、参考资料 elastic/protections-artifacts Windows系统进程概述