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
  • 这些指纹与操作系统和CS版本相关,无法通过profile文件修改

二、CobaltStrike通信流程分析

初始通信阶段

  1. Stager发起的初始请求

    • 行为:向C2服务器发送HTTP/HTTPS请求(如GET /xxx)
    • 路径符合checksum8算法(如/Yle2)
    • 目的:下载完整Beacon载荷(200-300KB反射DLL或Shellcode)
    • 特征:
      • 无加密或简单XOR加密
      • 无固定心跳间隔(一次性行为)
      • 返回内容为Beacon二进制数据
  2. 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通信元数据

解密步骤

  1. 运行parse_beacon_keys.py脚本提取公私钥
  2. 将私钥存为key.pem
  3. 使用私钥解密cookie中的元数据

2. 通过进程内存提取密钥

操作流程

  1. 查看可疑进程命令行参数
  2. 使用DidierStevensSuite的cs-extract-key.py工具
  3. 查找并解码元数据
  4. 对于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流量特征识别

  1. 捕获HTTP请求路径如/FJwV
  2. 计算checksum8值:
    • F(70) + J(74) + w(119) + V(86) = 349
    • 349 % 256 = 93 → 64位后门特征
  3. 结合其他特征如/submit.php?id=xxx确认

案例2:通过内存提取密钥解密

  1. 获取可疑进程内存转储文件
  2. 使用cs-extract-key.py工具扫描内存
  3. 提取可能的AES/HMAC密钥
  4. 尝试解密通信数据包

七、防御建议

  1. 流量监测

    • 监控checksum8特征路径请求
    • 分析JA3/JA3s指纹异常
    • 检测周期性心跳通信模式
  2. 主机防护

    • 监控rundll32.exe异常行为
    • 检测可疑的进程注入行为
    • 审计计划任务和服务变更
  3. 日志分析

    • 收集和分析HTTP/TLS日志
    • 关注异常的文件操作和网络连接
    • 监控注册表关键项修改

通过深入理解CobaltStrike的通信机制、加密方式和操作指令,安全人员可以更有效地检测和防御此类高级威胁。

CobaltStrike流量解密技术详解 一、CobaltStrike流量特征识别 HTTP流量特征 checksum8算法特征 CobaltStrike的HTTP请求路径经过checksum8算法计算 32位后门结果为92,64位后门结果为93 算法计算方式:路径字符ASCII码之和与256取余 固定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 这些指纹与操作系统和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的通信机制、加密方式和操作指令,安全人员可以更有效地检测和防御此类高级威胁。