用 Yara 对红队工具 打标(四)——cobaltstrike 生成马浅析(三)
字数 1690 2025-08-06 18:08:01

CobaltStrike生成马Yara规则分析与检测技术详解

1. 环境准备与工具介绍

1.1 实验环境

  • 工具版本: Cobalt Strike 4.7
  • Payload类型: Stageless Payload Generator
  • Payload特点: 无阶段(stageless)的stager与请求数据的集合体,体积较大,常用于内网穿透

1.2 生成Payload类型

  • 可用类型: Raw、Process、Thread
  • 位数: 32位和64位版本
  • 缺失类型: 相比stager版本缺少COM Scriptlet、PowerShell、PowerShell Command、Veil类型

2. Google Yara规则匹配分析

2.1 规则匹配结果

  • 纯code数组类型: 未匹配任何Google Yara规则
  • Raw类型匹配情况:
    • 32位: 匹配2个规则集
    • 64位: 匹配1个规则集
    • Process和Thread类型在规则集中无差别

2.2 匹配规则代码修改

为显示匹配的具体规则,修改匹配代码增加规则打印功能:

# 示例匹配代码修改
for matched_rule in matched_rules:
    print(f"Matched rule: {matched_rule}")

3. Raw类型Payload深度分析

3.1 二进制转C风格数组

使用Python脚本将二进制Payload转换为C风格十六进制数组:

import os

f = open("D:\Cobaltstrike_payload\payload64_process.txt", "w")
file_bytes = list()
for a in open("D:\Cobaltstrike_payload\payload64_process.bin", "rb").read():
    file_bytes.append(hex(a).replace("0x", "\\x"))
f.write(''.join(i for i in file_bytes))
f.close()

3.2 免杀框架集成

64位免杀框架示例代码:

#include <stdio.h>
#include <windows.h>
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
unsigned char shellcode[] = { /* 填入转换后的shellcode */ };

void main() {
    LPVOID Memory = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    memcpy(Memory, shellcode, sizeof(shellcode));
    ((void(*)())Memory)();
}

4. 核心规则分析技术

4.1 core_sig规则分析

4.1.1 规则特征

  • 匹配动态加载操作中的特定字节码模式
  • 关注函数地址获取顺序和堆栈操作

4.1.2 IDA逆向分析

  1. 使用IDA Pro加载生成的exe文件
  2. 使用热键P初始化所有相关函数引用
  3. 定位到关键函数sub_1A1E6ED75BC

4.1.3 函数分析

// 伪代码表示
void sub_1A1E6ED75BC() {
    // 动态获取函数地址操作
    // a1数组存储函数地址: GetModuleHandleA, GetProcAddress, LoadLibraryA, 
    // LoadLibraryExA, VirtualAlloc, VirtualProtect
    // 典型的恶意软件动态加载模式
}

4.1.4 规则评估

  • 独特性: 规则要求精确匹配相对位置和堆栈操作(sub rsp,80h)
  • 有效性: 能准确识别CobaltStrike特有的动态加载模式

4.2 deobfuscator规则分析

4.2.1 规则特征

  • 匹配疑似异或加密/解密的函数模式
  • 关注PE文件结构操作和调试符号处理

4.2.2 关键函数分析

  1. 定位到sub_1F0636A70CC函数

  2. 函数行为分析:

    // 伪代码表示
    void sub_1F0636A70CC() {
        // 疑似异或加密/解密函数
        // 根据NumberOfSymbols决定是否执行异或操作
    }
    
  3. 调用链分析:

    • sub_1F0636A713C(): 定位PE结构(MZ和PE头)
    • sub_1F0636A780C(): 分配内存镜像
    • sub_1F0636A79DC(): 复制PE头
    • sub_1F0636A7B9C(): 处理导入表

4.2.3 PE结构操作流程

  1. 定位DOS头(0x5A4D 'MZ')和NT头(0x4550 'PE')
  2. 分配与bin文件相同大小的内存镜像
  3. 复制PE头到新内存区域
  4. 处理导入表:
    • 加载DLL(LoadLibraryA)
    • 获取导入函数地址(GetProcAddress或通过导出表定位)

4.2.4 规则评估

  • 独特性: 识别PE操作流程中的特殊异或处理
  • 有效性: 能检测CobaltStrike特有的调试符号处理逻辑

5. 分析技巧总结

5.1 逆向分析策略

  1. 局部优先: 从规则匹配的代码片段入手,逐步扩展分析范围
  2. 上下文推断: 结合函数调用关系和参数传递推断功能
  3. 特征对比: 对比正常PE加载流程,识别恶意代码特有模式

5.2 Yara规则优化建议

  1. 堆栈操作特征: 捕获特定的堆栈分配模式(sub rsp,XXh)
  2. API调用序列: 记录特有的API获取和使用顺序
  3. 异常PE处理: 检测对调试符号等非常规PE字段的操作

6. 参考资源

7. 结论

通过对CobaltStrike生成的stageless Payload的分析,可以提取出有效的Yara规则特征。核心检测点应关注:

  1. 特定的动态加载模式
  2. 异常的堆栈操作
  3. PE文件处理中的特殊逻辑
  4. 调试符号相关的处理流程

这些特征组合能有效区分CobaltStrike生成的恶意代码与正常程序代码。

CobaltStrike生成马Yara规则分析与检测技术详解 1. 环境准备与工具介绍 1.1 实验环境 工具版本 : Cobalt Strike 4.7 Payload类型 : Stageless Payload Generator Payload特点 : 无阶段(stageless)的stager与请求数据的集合体,体积较大,常用于内网穿透 1.2 生成Payload类型 可用类型 : Raw、Process、Thread 位数 : 32位和64位版本 缺失类型 : 相比stager版本缺少COM Scriptlet、PowerShell、PowerShell Command、Veil类型 2. Google Yara规则匹配分析 2.1 规则匹配结果 纯code数组类型 : 未匹配任何Google Yara规则 Raw类型匹配情况 : 32位: 匹配2个规则集 64位: 匹配1个规则集 Process和Thread类型在规则集中无差别 2.2 匹配规则代码修改 为显示匹配的具体规则,修改匹配代码增加规则打印功能: 3. Raw类型Payload深度分析 3.1 二进制转C风格数组 使用Python脚本将二进制Payload转换为C风格十六进制数组: 3.2 免杀框架集成 64位免杀框架示例代码: 4. 核心规则分析技术 4.1 core_ sig规则分析 4.1.1 规则特征 匹配动态加载操作中的特定字节码模式 关注函数地址获取顺序和堆栈操作 4.1.2 IDA逆向分析 使用IDA Pro加载生成的exe文件 使用热键 P 初始化所有相关函数引用 定位到关键函数 sub_1A1E6ED75BC 4.1.3 函数分析 4.1.4 规则评估 独特性 : 规则要求精确匹配相对位置和堆栈操作( sub rsp,80h ) 有效性 : 能准确识别CobaltStrike特有的动态加载模式 4.2 deobfuscator规则分析 4.2.1 规则特征 匹配疑似异或加密/解密的函数模式 关注PE文件结构操作和调试符号处理 4.2.2 关键函数分析 定位到 sub_1F0636A70CC 函数 函数行为分析: 调用链分析: sub_1F0636A713C() : 定位PE结构(MZ和PE头) sub_1F0636A780C() : 分配内存镜像 sub_1F0636A79DC() : 复制PE头 sub_1F0636A7B9C() : 处理导入表 4.2.3 PE结构操作流程 定位DOS头(0x5A4D 'MZ')和NT头(0x4550 'PE') 分配与bin文件相同大小的内存镜像 复制PE头到新内存区域 处理导入表: 加载DLL(LoadLibraryA) 获取导入函数地址(GetProcAddress或通过导出表定位) 4.2.4 规则评估 独特性 : 识别PE操作流程中的特殊异或处理 有效性 : 能检测CobaltStrike特有的调试符号处理逻辑 5. 分析技巧总结 5.1 逆向分析策略 局部优先 : 从规则匹配的代码片段入手,逐步扩展分析范围 上下文推断 : 结合函数调用关系和参数传递推断功能 特征对比 : 对比正常PE加载流程,识别恶意代码特有模式 5.2 Yara规则优化建议 堆栈操作特征 : 捕获特定的堆栈分配模式( sub rsp,XXh ) API调用序列 : 记录特有的API获取和使用顺序 异常PE处理 : 检测对调试符号等非常规PE字段的操作 6. 参考资源 Microsoft Memory Protection Constants PE文件结构官方文档 CobaltStrike官方文档(非公开) 7. 结论 通过对CobaltStrike生成的stageless Payload的分析,可以提取出有效的Yara规则特征。核心检测点应关注: 特定的动态加载模式 异常的堆栈操作 PE文件处理中的特殊逻辑 调试符号相关的处理流程 这些特征组合能有效区分CobaltStrike生成的恶意代码与正常程序代码。