当前位置: 首页 > news >正文

实战复盘:如何从混杂的Web流量中揪出Cobalt Strike Beacon?一份完整的解密指南

从混杂流量中解密Cobalt Strike信标的实战手册

当安全团队在例行流量审计中发现异常HTTP请求时,往往意味着内网已经存在失陷主机。最近处理的一起案例中,攻击者通过Laravel框架的已知漏洞植入Webshell后,在服务器上遗留了包含Cobalt Strike信标密钥的压缩包。本文将完整还原从流量识别到最终解密C2通信的全过程。

1. 初始线索发现与关键文件提取

在分析pcap文件时,首先需要关注异常HTTP POST请求。某次案例中,攻击者上传的Webshell响应包包含以下特征字符串:

AAA*VGhpcyBpcyBhIHRlc3Q=*AAA

这类经过伪装的Base64字符串通常需要特殊处理:

  1. 去除AAA*前缀和*AAA后缀
  2. =替换为00
  3. 进行标准Base64解码

通过反复解码多个类似字符串,最终发现了服务器上的关键文件线索:

cd /d "D:\phpstudy_pro\WWW\secret"&"C:\Program Files\7-Zip\7z.exe" x secret.zip -pP4Uk6qkh6Gvqwg3y

关键文件特征对比表

文件类型识别特征提取工具典型位置
secret.zipPK文件头被Webshell输出包裹WinHex修复/tmp或Web目录
.cobaltstrike.beacon_keysRSA密钥对特征7z解压攻击者指定目录

2. 压缩包修复与密钥提取

受损的压缩包需要通过十六进制编辑器手动修复。以下是使用WinHex的标准操作流程:

  1. 从原始流量中导出被污染的zip文件片段
  2. 搜索50 4B 03 04(PK头)和50 4B 05 06(中央目录结束记录)
  3. 删除头尾的非zip数据
  4. 保存为标准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流量包含两种类型:

  1. 心跳包(元数据):GET请求/en_US/all.js,密钥通过Cookie传输
  2. 数据回传: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;)

网络设备配置建议

  1. 对出站HTTP流量实施TLS拦截检查
  2. 限制服务器发起的异常HTTP POST请求
  3. 监控Web目录下的.zip文件创建行为

在一次实际事件中,攻击者在解密后的数据中泄露了其C2服务器的真实IP,这成为溯源突破的关键。通过交叉分析多个解密数据包的时间戳,我们还成功还原了攻击者在失陷主机上的完整操作链条。

http://www.gsyq.cn/news/1477528.html

相关文章:

  • 2026年口碑好的防锈油漆/长沙油漆/氟碳油漆/氟碳防腐油漆批量采购厂家推荐 - 品牌宣传支持者
  • SAP ABAP锁参数SCOPE实战避坑:为什么我的BAPI执行后锁就丢了?
  • 告别手动配置!在Ubuntu 22.04上用CMake+VS Code一键搞定OpenCV C++开发环境
  • 如何快速实现SketchUp模型3D打印:终极STL插件完整指南
  • PDMS二次开发避坑指南:从PML1到PML2,这些语法“雷区”千万别踩
  • 从GWR到GTWR再到MGWR:一文讲清地理加权回归家族的区别、选择与实战场景
  • Dirbuster扫描太慢或漏扫?可能是你没用好这些高级功能:代理、身份验证与内容分析模式详解
  • 别再死记硬背了!通过‘增删查改’四步,彻底搞懂C语言顺序表的内存模型
  • 国产硬件仿真工具在AI芯片和HPC大芯片验证中的应用现状
  • 【HarmonyOS实战】 @Builder构建函数:UI复用的正确姿势
  • SAP FIBF实战:手把手教你用BTE增强搞定会计凭证字段自动替换
  • 从WRF输出变量到天气分析:手把手教你用NCL提取关键气象要素(以一次暴雨过程为例)
  • 告别硬件SPI资源紧张:用GPIO模拟驱动ADS8684/8688的避坑指南与性能实测
  • Sobolev-Lorentz嵌入在Cartan-Hadamard流形上的最优性研究
  • 别再被‘抖振’劝退!用Python从零实现一个简单的滑模控制器(附完整代码)
  • 从论文拒稿到接收:LaTeX子图标签(label)和引用(ref)的避坑指南
  • 从Eclipse老手到STS新手:一份无缝迁移的避坑指南与个性化配置清单
  • Matlab鱼雷刚体运动仿真:俯仰/偏航/深度/航速四维动态可视化
  • ai一键生成vivado安装验证脚本,快速搭建fpga开发环境
  • 从数据到洞察:手把手教你用Python处理卫星测高数据计算SLA/SSHA
  • MicroPython固件“魔改”指南:以BLACK_F407ZG为例,自定义你的板载LED、串口和SPI引脚
  • 别再手动试错了!用Minitab 21做全因子DOE,5步搞定工艺参数优化
  • 瑞萨e2 studio调试配置全解析:Connection Settings里那个200mA选项到底该不该勾?
  • 告别环境冲突:用Docker一键部署Matconvnet(支持Matlab 2020b + CUDA 11)
  • AI虚拟城市主义:生成式模型与城市身份量化分析
  • 别再死记硬背了!用Proteus 8.9仿真51单片机,手把手教你搭建第一个流水灯电路
  • 物理信息神经网络与随机增广拉格朗日方法解析
  • 3分钟掌握Keyviz:让屏幕操作从此不再神秘
  • 从零开始搞懂SoC:芯片设计中的‘大脑’与‘高速公路’(AMBA总线篇)
  • 从《半日》到代码人生:一个程序员如何用技术工具高效啃下大学英语精读(附Anki+欧路词典配置)