新手友好!用Wireshark分析PHPStudy环境下的Webshell攻击:从可疑POST请求到CobaltStrike密钥提取
从零开始:用Wireshark追踪PHPStudy环境中的Webshell攻击链
最近在本地搭建PHPStudy环境测试时,发现服务器响应异常缓慢,查看日志发现大量可疑请求。作为刚接触网络安全的新手,我决定用Wireshark这个"网络显微镜"一探究竟。本文将完整记录如何从一个可疑的POST请求开始,逐步追踪到CobaltStrike密钥的全过程。
1. 环境准备与初始流量捕获
在开始分析之前,我们需要准备好以下工具和环境:
- PHPStudy集成环境(建议使用最新版本)
- Wireshark 3.6.0+(支持HTTP2解析的版本)
- Python Requests库(用于模拟攻击测试)
- 7-Zip(处理加密压缩包)
关键配置步骤:
- 在PHPStudy中创建一个测试站点(例如
http://test.local) - 确保Wireshark能捕获本地回环流量(需要安装Npcap驱动)
- 设置Wireshark只监控PHPStudy相关的网络接口
# 快速检查本地网络接口 ipconfig /all注意:在Windows上分析本地流量时,选择"Npcap Loopback Adapter"接口
首次捕获流量时,建议先进行基准流量采集——即在没有任何操作时记录1-2分钟的正常流量。这能帮助我们后续快速识别异常流量。
2. 识别可疑HTTP POST请求
在启动Wireshark约10分钟后,我注意到一个异常的流量模式:多个来自同一IP的POST请求,间隔时间异常规律(每37秒一次)。通过以下过滤条件快速定位这些请求:
http.request.method == POST && http.user_agent contains "python"可疑请求特征分析:
| 特征项 | 正常值 | 观察值 | 异常点 |
|---|---|---|---|
| User-Agent | 浏览器标识 | Python/3.9 | 非浏览器客户端 |
| Content-Type | application/x-www-form-urlencoded | 缺失 | 不符合常规表单提交 |
| 请求长度 | 通常<1KB | 4.8KB | 过大且固定 |
| 响应时间 | 毫秒级 | 3-5秒 | 明显处理延迟 |
在追踪该HTTP流时(右键→Follow→TCP Stream),发现请求体中包含特殊字符串:
AAA*VGhpcyBpcyBhIHRlc3Q=*AAA这种以AAA*开头、*AAA结尾的编码格式引起了我的注意。通过查询公开漏洞数据库,发现这与Laravel框架的CVE-2021-3129漏洞利用特征高度吻合。
3. 解码漏洞利用流量
针对发现的异常编码,我们需要进行多层解码:
- 初步清理:去除
AAA*前缀和*AAA后缀 - 字符替换:将所有
=替换为00 - Base64解码:对处理后的字符串进行解码
import base64 def decode_payload(payload): # 示例解码函数 cleaned = payload.replace("AAA*", "").replace("*AAA", "") cleaned = cleaned.replace("=", "00") return base64.b64decode(cleaned).decode('utf-8', errors='ignore') sample = "AAA*VGhpcyBpcyBhIHRlc3Q=*AAA" print(decode_payload(sample)) # 输出: This is a test通过分析多个类似请求,发现攻击者正在尝试写入Webshell。关键写入路径为:
POST /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.phpWebshell写入特征:
- 利用Laravel的phpunit组件漏洞
- 文件写入路径通常包含
/tmp/或/vendor/ - 响应包会返回写入文件的MD5值
4. 定位并分析Webshell活动
成功写入Webshell后,攻击者开始执行更多操作。通过以下过滤条件捕获相关流量:
http contains "14433" || http contains "eval("发现一个关键的大马(功能更强大的Webshell)通信过程:
- 请求中包含密码参数
pass=14433 - 响应使用特定格式加密:
- 前两位为随机字符
- 剩余部分为Base64编码
解密示例:
def decrypt_webshell(resp): # 示例:去除前两位后Base64解码 return base64.b64decode(resp[2:]).decode('utf-8')在分析这些通信时,注意到攻击者执行了以下可疑操作:
cd /d "D:\phpstudy_pro\WWW\secret"&"C:\Program Files\7-Zip\7z.exe" x secret.zip -pP4Uk6qkh6Gvqwg3y这提示我们系统中可能存在一个名为secret.zip的加密压缩包。
5. 提取并解密CobaltStrike密钥文件
回到Wireshark中,通过搜索PK文件头(压缩文件特征)定位到可疑数据包:
frame contains "PK\x03\x04"导出和修复压缩文件的步骤:
- 右键包含PK头的数据包→Follow→TCP Stream
- 选择"Raw"格式保存为
.bin文件 - 使用WinHex或HxD编辑器:
- 删除PK头前后的Webshell代码
- 确保文件以PK头开始并以
\x50\x4B\x05\x06结束
使用之前发现的密码P4Uk6qkh6Gvqwg3y解压后,得到.cobaltstrike.beacon_keys文件——这是CobaltStrike后门的密钥文件。
密钥文件结构解析:
00000000 00 00 00 01 00 00 00 20 [... ...] 00000008 9A 02 3B 92 1D 8B 6D E6 [..;...m.] 00000010 A7 5D 5E 5B 3D 4D 9D 9A [.]^[=M..]6. 解密CobaltStrike通信流量
获得Beacon密钥后,我们可以解密攻击者的C2(命令与控制)通信。关键识别特征:
- 心跳包路径:
/en_US/all.js - 数据传输路径:
/submit.php?id=xxxxxx - Cookie中携带加密元数据
解密流程:
- 使用私钥解密元数据获取AES密钥
- 用AES密钥解密实际通信内容
- 解析解密后的数据(通常是Base64编码)
实际操作中,可以使用第三方工具如cobaltstrike_parser自动化这个过程:
python cs_parse.py -k beacon_keys -f traffic.pcap在分析解密后的流量中,发现了攻击者执行的完整操作链:
- 系统信息收集(用户名、网络配置、进程列表)
- 横向移动尝试(扫描内网其他主机)
- 持久化后门安装(计划任务、服务创建)
整个分析过程中,最关键的突破点是早期那个Python Requests的POST请求。如果没有注意到这个异常点,后续的Webshell和CobaltStrike活动很容易被当作正常流量忽略。这也提醒我们,在日常监控中要特别关注非浏览器客户端的HTTP请求。
