CobaltStrike流量解密 - 总结
字数 3413 2025-09-01 11:26:03
CobaltStrike流量解密技术详解
一、CobaltStrike流量特征识别
HTTP流量特征
checksum8算法特征
- CobaltStrike的HTTP请求路径经过checksum8算法计算
- 32位后门结果为92,64位后门结果为93
- 算法计算方式:路径字符ASCII码之和与256取余
示例:路径/FJwV F(70) + J(74) + w(119) + V(86) = 349 349 % 256 = 93 → 64位后门特征
固定URL模式
- 常见默认路径:
/submit.php?id=xxx/pixel.gif/q.cgi
- 下载阶段路径示例:
/Yle2/cKTZ- 虽不固定但符合checksum8规则
TLS特征
- JA3/JA3s指纹:
- Windows 10 HTTPS Beacon的JA3指纹:
28a2c9bd18a11de089ef85a160da29e4 - CentOS CS4.4的JA3S指纹:
00447ab319e9d94ba2b4c1248e155917
- Windows 10 HTTPS Beacon的JA3指纹:
- 这些指纹与操作系统和CS版本相关,无法通过profile文件修改
二、CobaltStrike通信流程分析
初始通信阶段
-
Stager发起的初始请求:
- 行为:向C2服务器发送HTTP/HTTPS请求(如GET /xxx)
- 路径符合checksum8算法(如/Yle2)
- 目的:下载完整Beacon载荷(200-300KB反射DLL或Shellcode)
- 特征:
- 无加密或简单XOR加密
- 无固定心跳间隔(一次性行为)
- 返回内容为Beacon二进制数据
-
Beacon的首次心跳:
- 触发时机:Stager下载Beacon并注入内存后
- 特征:
- 携带主机信息(用户名、IP、进程名等)
- 通过RSA加密后放在Cookie或POST数据中
- 开始周期性通信(心跳间隔由C2配置决定)
三、Beacon配置文件解析
基础通信设置
| 参数 | 示例值 | 说明 |
|---|---|---|
| payload type | windows-beacon_http-reverse_http | 载荷类型为HTTP Beacon(反向连接) |
| port | 80 | C2服务器监听端口(HTTP) |
| sleeptime | 60000 | Beacon心跳间隔(毫秒,60秒) |
| maxgetsize | 1048576 | HTTP请求最大数据大小(1MB) |
| jitter | 0 | 心跳时间抖动(0表示无随机延迟) |
| publickey | RSA 30819f30... | 加密通信的RSA公钥(2048位) |
C2服务器设置
| 参数 | 示例值 | 说明 |
|---|---|---|
| server,get-uri | 192.168.31.170,/en_US/all.js | C2服务器地址和请求路径 |
| useragent | Mozilla/5.0 (compatible; MSIE 10.0...) | 伪装User-Agent |
| post-uri | /submit.php | POST请求路径 |
流量伪装与加密
| 参数 | 示例值 | 说明 |
|---|---|---|
| http_get_header | Cookie + BASE64 | GET请求元数据通过Cookie字段Base64编码传递 |
| http_post_header | Content-Type: application/octet-stream | POST请求伪装为二进制数据传输 |
| CryptoScheme | 0 | 默认加密方案(AES + RSA) |
四、密钥提取与解密技术
1. 通过.cobaltstrike.beacon_keys获取密钥
- 文件位置:团队服务器(Team Server)首次运行时自动生成
- 内容:存储RSA密钥对(公钥和私钥),用于加密Beacon与C2通信元数据
解密步骤:
- 运行parse_beacon_keys.py脚本提取公私钥
- 将私钥存为key.pem
- 使用私钥解密cookie中的元数据
2. 通过进程内存提取密钥
操作流程:
- 查看可疑进程命令行参数
- 使用DidierStevensSuite的cs-extract-key.py工具
- 查找并解码元数据
- 对于CS 4.x Beacon,可能需要碰撞尝试所有可能的16字节序列作为密钥
工具地址:
- DidierStevens工具包:https://blog.didierstevens.com/didier-stevens-suite/
五、CobaltStrike指令集详解
基础控制指令
| 指令名 | 类型 | 用途 |
|---|---|---|
| COMMAND_GET_SYSTEM_INFO | 请求指令 | 获取系统信息(OS版本、主机名等) |
| COMMAND_SLEEP | 请求指令 | 设置Beacon心跳间隔 |
| COMMAND_CHECKIN | 回调指令 | Beacon首次注册或重新连接TeamServer |
文件操作指令
| 指令名 | 类型 | 用途 |
|---|---|---|
| COMMAND_FILE_BROWSE | 请求指令 | 列出目标目录文件 |
| COMMAND_DOWNLOAD | 请求指令 | 从目标下载文件到TeamServer |
| COMMAND_UPLOAD | 请求指令 | 从TeamServer上传文件到目标 |
| COMMAND_TIMESTOMP | 请求指令 | 修改文件时间戳 |
进程操作指令
| 指令名 | 类型 | 用途 |
|---|---|---|
| COMMAND_PROCESS_LIST | 请求指令 | 列出运行中的进程 |
| COMMAND_PROCESS_INJECT | 请求指令 | 注入Shellcode到指定进程 |
| COMMAND_TOKEN_IMPERSONATE | 请求指令 | 窃取令牌并模拟用户权限 |
横向移动指令
| 指令名 | 类型 | 用途 |
|---|---|---|
| COMMAND_PIVOT_CONNECT | 请求指令 | 建立内网跳板连接(SMB/WMI) |
| COMMAND_PSEXEC | 请求指令 | 通过PsExec横向扩散 |
| COMMAND_SSH_COMMAND | 请求指令 | 在SSH会话中执行命令 |
权限维持指令
| 指令名 | 类型 | 用途 |
|---|---|---|
| COMMAND_MAKE_TOKEN | 请求指令 | 创建新的登录会话令牌 |
| COMMAND_REGISTRY_MODIFY | 请求指令 | 修改注册表 |
| COMMAND_PERSISTENCE | 请求指令 | 设置持久化(计划任务、服务等) |
六、解密实践案例
案例1:通过HTTP流量特征识别
- 捕获HTTP请求路径如/FJwV
- 计算checksum8值:
- F(70) + J(74) + w(119) + V(86) = 349
- 349 % 256 = 93 → 64位后门特征
- 结合其他特征如/submit.php?id=xxx确认
案例2:通过内存提取密钥解密
- 获取可疑进程内存转储文件
- 使用cs-extract-key.py工具扫描内存
- 提取可能的AES/HMAC密钥
- 尝试解密通信数据包
七、防御建议
-
流量监测:
- 监控checksum8特征路径请求
- 分析JA3/JA3s指纹异常
- 检测周期性心跳通信模式
-
主机防护:
- 监控rundll32.exe异常行为
- 检测可疑的进程注入行为
- 审计计划任务和服务变更
-
日志分析:
- 收集和分析HTTP/TLS日志
- 关注异常的文件操作和网络连接
- 监控注册表关键项修改
通过深入理解CobaltStrike的通信机制、加密方式和操作指令,安全人员可以更有效地检测和防御此类高级威胁。