实战复盘:如何从混杂的Web流量中揪出Cobalt Strike Beacon?一份完整的解密指南
从混杂流量中解密Cobalt Strike信标的实战手册
当安全团队在例行流量审计中发现异常HTTP请求时,往往意味着内网已经存在失陷主机。最近处理的一起案例中,攻击者通过Laravel框架的已知漏洞植入Webshell后,在服务器上遗留了包含Cobalt Strike信标密钥的压缩包。本文将完整还原从流量识别到最终解密C2通信的全过程。
1. 初始线索发现与关键文件提取
在分析pcap文件时,首先需要关注异常HTTP POST请求。某次案例中,攻击者上传的Webshell响应包包含以下特征字符串:
AAA*VGhpcyBpcyBhIHRlc3Q=*AAA这类经过伪装的Base64字符串通常需要特殊处理:
- 去除
AAA*前缀和*AAA后缀 - 将
=替换为00 - 进行标准Base64解码
通过反复解码多个类似字符串,最终发现了服务器上的关键文件线索:
cd /d "D:\phpstudy_pro\WWW\secret"&"C:\Program Files\7-Zip\7z.exe" x secret.zip -pP4Uk6qkh6Gvqwg3y关键文件特征对比表:
| 文件类型 | 识别特征 | 提取工具 | 典型位置 |
|---|---|---|---|
| secret.zip | PK文件头被Webshell输出包裹 | WinHex修复 | /tmp或Web目录 |
| .cobaltstrike.beacon_keys | RSA密钥对特征 | 7z解压 | 攻击者指定目录 |
2. 压缩包修复与密钥提取
受损的压缩包需要通过十六进制编辑器手动修复。以下是使用WinHex的标准操作流程:
- 从原始流量中导出被污染的zip文件片段
- 搜索
50 4B 03 04(PK头)和50 4B 05 06(中央目录结束记录) - 删除头尾的非zip数据
- 保存为标准zip格式
使用之前获得的密码P4Uk6qkh6Gvqwg3y解压后,得到.cobaltstrike.beacon_keys文件,其内容结构如下:
# 公钥 -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx6QZ6OZ7O8Z6O8Z6O8Z6 ... -----END PUBLIC KEY----- # 私钥 -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAx6QZ6OZ7O8Z6O8Z6O8Z6O8Z6O8Z6O8Z6O8Z6O8Z6O8Z6O8Z ... -----END RSA PRIVATE KEY-----3. C2流量解密实战
获得密钥对后,可以开始解密Cobalt Strike的通信流量。典型C2流量包含两种类型:
- 心跳包(元数据):GET请求
/en_US/all.js,密钥通过Cookie传输 - 数据回传:POST请求
/submit.php?id=xxxxxx,包含加密的失陷主机信息
3.1 解密元数据获取AES密钥
使用Python脚本解密元数据:
from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 private_key = RSA.import_key(open('beacon_keys').read()) cipher = PKCS1_v1_5.new(private_key) aes_key = cipher.decrypt(encrypted_metadata, None)关键参数说明:
encrypted_metadata:从HTTP Cookie中提取的Base64编码数据aes_key:解密后得到的32字节AES密钥
3.2 解密主机回传数据
获得AES密钥后,可以解密POST请求中的实际数据:
from Crypto.Cipher import AES import base64 def decrypt_c2_data(encrypted_data, aes_key): iv = encrypted_data[:16] cipher = AES.new(aes_key, AES.MODE_CBC, iv) return cipher.decrypt(encrypted_data[16:]) raw_data = base64.b64decode(http_post_data) decrypted = decrypt_c2_data(raw_data, aes_key)典型解密结果示例:
{ "hostname": "DC01.corp.local", "username": "admin", "process": "lsass.exe", "data": "收集的凭证数据..." }4. 防御建议与检测增强
基于多次事件响应的经验,建议在安全设备上部署以下检测规则:
Suricata规则示例:
alert http any any -> any any (msg:"Cobalt Strike Beacon Metadata Request"; http.method; content:"GET"; http.uri; content:"/en_US/all.js"; http.cookie; content:".cobaltstrike.beacon_keys"; sid:1000001;)网络设备配置建议:
- 对出站HTTP流量实施TLS拦截检查
- 限制服务器发起的异常HTTP POST请求
- 监控Web目录下的.zip文件创建行为
在一次实际事件中,攻击者在解密后的数据中泄露了其C2服务器的真实IP,这成为溯源突破的关键。通过交叉分析多个解密数据包的时间戳,我们还成功还原了攻击者在失陷主机上的完整操作链条。
