从一个流量样本学习webshell及CS流量的解密与分析
字数 2437 2025-10-01 14:05:52
Cobalt Strike 与哥斯拉Webshell流量解密与分析技术详解
一、样本背景
本教学文档基于2025年"泰山杯"山东省网络安全大赛C组数据安全赛道流量样本,包含Webshell(哥斯拉)和Cobalt Strike流量的解密与分析技术。
二、哥斯拉Webshell流量分析
2.1 流量识别特征
-
初始握手包:
- 请求形式:
pass名=加密数据(示例:suger=加密数据) - 请求数据量较大
- 请求头不携带Cookie
- 响应包无数据但设置PHPSESSID
- 请求形式:
-
后续通信包:
- 请求包:
pass名=加密数据形式,数据量较小 - 响应包:固定格式"前后16位MD5值,中间32位加密字符串"
- 请求包:
-
Header弱特征:
- User-Agent、Accept、Accept-Language头包含固定值
2.2 加密方式分析
- 类型:XOR_BASE64
- 加密算法:Base64 + 异或加密
- 密钥参数:
- pass='suger'
- key='a5717a649d346ed0'(16字节固定XOR循环密钥)
2.3 解密算法实现
# 哥斯拉解密脚本核心逻辑
def decrypt_godzilla(data, key):
# 1. 去除pass=前缀(请求报文)
# 2. URL解码
# 3. Base64解码
# 4. 使用16字节XOR密钥循环异或解密
# 5. 响应报文需先去除前后16位MD5校验值
return decrypted_data
2.4 实战解密步骤
- 通过Wireshark大小排序定位最大流量包
- 使用解密脚本提取加密数据:
python3 哥斯拉解密.py req-dec ./request/request.txt --raw > ./response/1.bin - 修复文件头,提取压缩包
三、Cobalt Strike流量分析
3.1 CS架构与工作流程
-
三大组件:
- TeamServer(服务端)
- Client(客户端)
- Beacon(被控端代理)
-
通信流程:
- 初始投递 → Stager下载 → Beacon上线 → 心跳通信 → 指令执行
3.2 流量特征详解
3.2.1 初始投递阶段
- HTTP GET请求:
- 路径符合checksum8算法(32位结果92,64位结果93)
- 4-5位随机字母数字组合(如/Yle2, /FJwV)
- User-Agent异常:
- 拼写错误("WIndows NI")
- 非常见写法("W0W64")
- 异常参数("0 B01IE8_v1")
- 响应特征:
- Content-Type: application/octet-stream
- 包含PE文件头(MZ)
3.2.2 Beacon心跳阶段
- 周期性请求:固定间隔(默认60秒)GET请求
- Cookie元数据:
- 长Base64字符串(x86约172字符,x64约344字符)
- 包含RSA加密的主机信息(用户名、主机名、进程名等)
- SSL/TLS特征:
- JA3/JA3s指纹固定(如Windows 10 HTTPS Beacon的JA3:28a2c9bd18a11de089ef85a160da29e4)
- 证书Issuer CN和Subject CN均为"Major Cobalt Strike"
3.2.3 指令执行阶段
- POST请求回传:路径类似
/submit.php?id=xxx - 心跳包长度突变:响应数据长度突增(可达300%)
- 横向移动:异常SMB、RDP或WinRM协议流量
- 数据渗出:大流量HTTP POST外传数据
3.3 Beacon逆向分析
-
定位下载路径:
- Wireshark过滤器:
http.request.uri matches "/....$" - 验证checksum8值
- Wireshark过滤器:
-
Beacon配置提取:
- HTTP类型Beacon
- C2服务器:192.168.33.143:8080
- GET路径:/ptj
- POST路径:/submit.php
3.4 CS流量解密技术
3.4.1 获取解密密钥的两种方法
方法一:获取RSA私钥(从TeamServer)
- 私钥文件:
.cobaltstrike.beacon_keys(Java序列化对象) - 提取工具:使用
javaobj等Python库解析 - 解密流程:
- 解密Beacon元数据(HTTP Cookie/POST中的Base64数据)
- 获取16字节Raw Key
- SHA-256哈希:前16字节为AES密钥,后16字节为HMAC密钥
方法二:内存转储提取(从受害主机)
- 获取内存转储:
procdump -mp <pid> - 密钥搜索:
- CS 3.x:搜索
0x0000BEEF开头数据 - CS 4.x:暴力碰撞16字节候选密钥
- CS 3.x:搜索
3.4.2 实战解密过程
步骤1:获取元数据
- 过滤器:
http and ((ip.src == 192.168.33.143 and ip.dst == 192.168.33.142) or (ip.src == 192.168.33.142 and ip.dst == 192.168.33.143)) - 定位Cookie中的Base64元数据
步骤2:解密元数据
cs-decrypt-metadata.py -f .cobaltstrike.beacon_keys <metadata_base64>
输出:
- Raw key: b0dbd2e724e2a68105ba599a1ad8f30d
- AES key: e2d919d0bff758aeb1167e38ff293edf
- HMAC key: 25a496ed7274cb32d46d600205781afb
步骤3:解密流量
cs-parse-http-traffic.py -r b0dbd2e724e2a68105ba599a1ad8f30d -Y "http过滤表达式" traffic.pcap
步骤4:分析解密结果
- 服务端指令:ipconfig、whoami等系统命令
- 执行结果回传
- 提取压缩包密码等关键信息
四、防御检测建议
4.1 哥斯拉检测
- 检测HTTP请求中固定pass参数名
- 监控Base64+异或加密模式
- 识别Header中的固定特征
4.2 Cobalt Strike检测
-
初始访问检测:
- 实时计算URI的checksum8值(92/93告警)
- 检测异常User-Agent
- 监控包含PE头的下载响应
-
心跳通信检测:
- 识别固定间隔的外连请求
- 检测Cookie中长Base64字符串
- SSL/TLS指纹比对
-
行为检测:
- 监控心跳包长度异常波动
- 检测内网异常协议流量
- 监控非业务时间大流量外传
五、工具汇总
- 哥斯拉解密:自定义Python解密脚本
- CS元数据解密:cs-decrypt-metadata.py
- CS流量解析:cs-parse-http-traffic.py
- Beacon分析:1768.py(Didier Stevens工具)
通过本教学文档详细的分析流程和技术要点,安全分析人员可有效识别和解密Webshell与Cobalt Strike的加密流量,提取关键攻击证据并建立相应的防御检测策略。