从零开始:用Wireshark追踪PHPStudy环境中的Webshell攻击链

最近在本地搭建PHPStudy环境测试时,发现服务器响应异常缓慢,查看日志发现大量可疑请求。作为刚接触网络安全的新手,我决定用Wireshark这个"网络显微镜"一探究竟。本文将完整记录如何从一个可疑的POST请求开始,逐步追踪到CobaltStrike密钥的全过程。

1. 环境准备与初始流量捕获

在开始分析之前,我们需要准备好以下工具和环境:

  • PHPStudy集成环境 (建议使用最新版本)
  • Wireshark 3.6.0+ (支持HTTP2解析的版本)
  • Python Requests库 (用于模拟攻击测试)
  • 7-Zip (处理加密压缩包)

关键配置步骤

  1. 在PHPStudy中创建一个测试站点(例如 http://test.local
  2. 确保Wireshark能捕获本地回环流量(需要安装Npcap驱动)
  3. 设置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. 解码漏洞利用流量

针对发现的异常编码,我们需要进行多层解码:

  1. 初步清理 :去除 AAA* 前缀和 *AAA 后缀
  2. 字符替换 :将所有 = 替换为 00
  3. 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.php

Webshell写入特征

  • 利用Laravel的phpunit组件漏洞
  • 文件写入路径通常包含 /tmp/ /vendor/
  • 响应包会返回写入文件的MD5值

4. 定位并分析Webshell活动

成功写入Webshell后,攻击者开始执行更多操作。通过以下过滤条件捕获相关流量:

http contains "14433" || http contains "eval("

发现一个关键的大马(功能更强大的Webshell)通信过程:

  1. 请求中包含密码参数 pass=14433
  2. 响应使用特定格式加密:
    • 前两位为随机字符
    • 剩余部分为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"

导出和修复压缩文件的步骤

  1. 右键包含PK头的数据包→Follow→TCP Stream
  2. 选择"Raw"格式保存为 .bin 文件
  3. 使用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中携带加密元数据

解密流程

  1. 使用私钥解密元数据获取AES密钥
  2. 用AES密钥解密实际通信内容
  3. 解析解密后的数据(通常是Base64编码)

实际操作中,可以使用第三方工具如 cobaltstrike_parser 自动化这个过程:

python cs_parse.py -k beacon_keys -f traffic.pcap

在分析解密后的流量中,发现了攻击者执行的完整操作链:

  1. 系统信息收集(用户名、网络配置、进程列表)
  2. 横向移动尝试(扫描内网其他主机)
  3. 持久化后门安装(计划任务、服务创建)

整个分析过程中,最关键的突破点是早期那个Python Requests的POST请求。如果没有注意到这个异常点,后续的Webshell和CobaltStrike活动很容易被当作正常流量忽略。这也提醒我们,在日常监控中要特别关注非浏览器客户端的HTTP请求。

更多推荐