用 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逆向分析
- 使用IDA Pro加载生成的exe文件
- 使用热键
P初始化所有相关函数引用 - 定位到关键函数
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 关键函数分析
-
定位到
sub_1F0636A70CC函数 -
函数行为分析:
// 伪代码表示 void sub_1F0636A70CC() { // 疑似异或加密/解密函数 // 根据NumberOfSymbols决定是否执行异或操作 } -
调用链分析:
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生成的恶意代码与正常程序代码。