1. 项目概述:从海量HTTP流量中嗅探攻击痕迹
做安全分析或者网络运维的朋友,对Wireshark这个“瑞士军刀”肯定不陌生。它功能强大,能抓取和分析网络上的每一个数据包,但面对动辄几个G的抓包文件(pcap),尤其是里面混杂着海量的HTTP/HTTPS流量时,新手往往会感到无从下手:攻击者的痕迹到底藏在哪里?今天,我就结合一个真实的pcap文件,和大家聊聊如何像老猎手一样,在HTTP流量的丛林里,快速定位那些狡猾的攻击痕迹。这不是一个泛泛而谈的教程,而是一次聚焦于实战场景的深度剖析,我会把分析思路、关键过滤器和那些容易被忽略的“异常信号”掰开揉碎了讲清楚。
无论你是刚入门的安全分析师、负责排查线上问题的运维工程师,还是对网络安全感兴趣的技术爱好者,掌握这套方法都能让你在面对可疑网络活动时,不再两眼一抹黑。我们最终的目标是:给你一个pcap,你能快速回答“这里有没有攻击?”、“攻击大概是什么类型?”以及“攻击者干了什么?”这三个核心问题。
2. 分析前的核心准备与思路构建
在打开Wireshark加载pcap文件之前,盲目的点击和查看只会浪费时间。一套清晰的预分析思路,能让你事半功倍。
2.1 明确HTTP流量中的攻击特征维度
攻击不会在数据包上写着“我是坏人”,它们通常表现为对正常通信模式或协议规范的偏离。我们可以从以下几个维度来构建侦查网络:
- 协议行为异常:这是最基础的层面。比如,一个IP在极短时间内向同一个Web服务器发起大量连接(SYN包),这可能是SYN Flood攻击;大量相同的HTTP请求(如GET /login.php)以极高频率发送,这可能是暴力破解或CC攻击。
- URI与参数异常:攻击载荷常常隐藏在URL路径、查询字符串(?后面的参数)或POST数据中。寻找超长URI、包含大量特殊字符(如
../,|,&,',",<,>)、尝试遍历目录(如../../../etc/passwd)或包含典型攻击关键词(如union select,exec,system,<script>,eval()的请求。 - 状态码与响应异常:服务器返回的状态码是重要的线索。短时间内出现大量
4xx(客户端错误,如401未授权、403禁止、404未找到)可能意味着扫描或爆破;大量5xx(服务器错误,如500内部错误)可能意味着攻击触发了应用漏洞导致服务崩溃。此外,注意响应体大小异常(极大或极小)的报文。 - 流量时序与模式异常:正常用户浏览会产生有节奏的、间隔不一的请求。而自动化工具或攻击脚本产生的流量,其请求间隔往往非常规律(如精确到毫秒级),或者呈现明显的“爆破字典”模式(用户名/密码参数依次变化)。
- 协议合规性异常:检查HTTP头部的完整性、格式是否正确。例如,
User-Agent字段为空、为默认值(如libwww-perl)或明显是攻击工具的特征(如sqlmap、nmap);Host头被篡改或缺失;存在非标准的、可疑的HTTP头部字段。
实操心得:不要一开始就陷入单个数据包的细节。先用Wireshark的统计功能(Statistics)对流量有个整体画像,比如“对话”(Conversations)看哪些IP之间话最多,“协议分级”(Protocol Hierarchy)看HTTP流量占比是否正常,“HTTP”统计看请求方法分布(GET/POST比例)和状态码分布。这能帮你快速定位“异常区”。
2.2 Wireshark环境与过滤器的关键配置
工欲善其事,必先利其器。正确的配置能让分析效率倍增。
- 着色规则定制:Wireshark默认的着色方案可能不适合安全分析。我强烈建议自定义规则,将可疑流量高亮。
- 红色高亮SQL注入尝试:可以创建一条规则,匹配HTTP请求URI或POST数据中包含
union,select,insert,'or'等关键词的流量。 - 黄色高亮扫描探测:匹配状态码为
404或403的HTTP响应包。 - 紫色高亮可能的上传/下载行为:匹配包含
Content-Disposition: attachment或大尺寸application/octet-stream类型响应的包。 设置路径:视图->着色规则。
- 红色高亮SQL注入尝试:可以创建一条规则,匹配HTTP请求URI或POST数据中包含
- 必备显示过滤器的准备:我们将频繁使用显示过滤器来缩小范围。记住几个核心的:
http:只看HTTP协议流量。http.request:只看HTTP请求。http.response:只看HTTP响应。http contains "keyword":在HTTP协议范围内搜索特定关键词。ip.addr == x.x.x.x:聚焦特定IP的流量。tcp.port == 80:只看80端口的TCP流量(通常为HTTP)。
- 启用协议解析深度:确保Wireshark能完整解析HTTP协议。在
编辑->首选项->Protocols->HTTP中,检查“TCP端口”是否包含了所有HTTP服务端口(如80, 8080, 8000等)。对于HTTPS流量,如果没有服务器私钥,我们只能分析TCP层,看不到明文,所以本文聚焦HTTP。
3. 实战分析:逐层解剖pcap中的攻击痕迹
现在,我们假设手头有一个名为suspicious_traffic.pcap的文件。让我们一步步揭开它的面纱。
3.1 第一层过滤:快速定位异常会话与流量基线
加载pcap后,第一件事不是看包,而是看统计。
- 打开“统计”->“对话”。这里按IP对列出了所有通信会话。我首先关注的是“数据包数量”或“字节数”排名最前的几对IP。如果有一个外部IP(非内网)与你的服务器IP之间有成千上万个包,而其他会话只有几十个,那它立刻成为重点怀疑对象。记下这个可疑IP,比如
198.51.100.1。 - 打开“统计”->“协议分级”。看看HTTP流量占总流量的比例。在一个以Web服务为主的抓包中,HTTP占比高是正常的。但如果出现了大量不明协议或碎片化的TCP流量,也需要留意。
- 应用基础过滤器:在过滤栏输入
http and ip.addr == 198.51.100.1。这样我们就只关注这个可疑IP的HTTP行为。
3.2 第二层侦查:攻击模式识别与关键词筛查
聚焦到可疑IP的HTTP流量后,我们开始寻找具体的攻击模式。
识别扫描与爆破:
- 过滤器:
http.request and ip.src == 198.51.100.1。只看它发起的请求。 - 观察要点:
- URI规律性:请求的路径是否在系统性地遍历?例如连续请求
/admin,/login,/phpmyadmin,/config.ini等。 - 参数爆破:如果是登录请求,观察POST数据中的用户名和密码字段是否在快速变化。你可以通过
文件->导出分组解析结果->作为JSON导出,然后分析JSON文件来快速查看参数序列。 - 状态码风暴:对上述请求,追踪其响应。使用过滤器
http.response and ip.dst == 198.51.100.1,并查看状态码。如果短时间内密集出现401、403、404,这几乎是扫描行为的铁证。
- URI规律性:请求的路径是否在系统性地遍历?例如连续请求
- 技巧:在包列表面板,右键点击“Info”列标题,选择“作为过滤器应用” -> “选中”。你可以快速筛选出所有
404 Not Found的响应,然后查看它们的对应请求来自哪些IP。
- 过滤器:
筛查注入与跨站攻击载荷:
- 这是重点。攻击者常在GET参数或POST数据中夹带恶意代码。
- 过滤器:
http.request.uri contains "select" or http.request.uri contains "union" or http.file_data contains "<script>"。这是一个组合过滤器,用于查找URI或文件数据中包含典型SQL关键词或XSS标签的请求。 - 更精细的搜索:Wireshark的搜索功能(
Ctrl+F)很强大。选择“分组详情”和“字符串”,在搜索框输入诸如'(单引号)、../、eval(、onerror=等。单引号是测试SQL注入的常见起点,目录遍历也很典型。 - 分析案例:假设我们找到一个请求:
GET /product.php?id=1' AND '1'='1。这显然是一个经典的SQL注入探测。接下来,我们应追踪这个TCP流(右键包 ->追踪流->TCP流),看看攻击者在同一个会话中还尝试了哪些其他Payload。
发现文件上传与Webshell:
- 攻击者获得权限后,常会上传Webshell以维持控制。
- 寻找上传请求:过滤器
http.request.method == "POST" and http.content_type contains "multipart/form-data"。这能筛选出所有通过表单上传文件的请求。 - 检查上传内容:对于筛选出的POST请求,追踪其TCP流。在流窗口,你可能会看到明显的文件内容,如PHP代码(
<?php ... ?>)、JSP代码等。注意观察上传的路径,比如是否上传到了可执行目录(如/uploads/,/images/)。 - 寻找Webshell连接:攻击者上传Webshell后,会通过浏览器访问它。可以搜索访问可能包含Webshell的路径的请求,如过滤器
http.request.uri contains ".php" and http.request.uri contains "upload",或者搜索响应中包含典型Webshell输出关键词,如http contains "uid="(查看系统用户)或http contains "Directory of"(列目录)。
3.3 第三层深度挖掘:追踪会话与还原攻击链条
找到可疑的单个数据包只是开始,我们需要还原整个攻击会话(Session)甚至攻击链条(Chain)。
- 使用“追踪流”功能:这是Wireshark最强大的功能之一。在任何HTTP请求或响应包上右键,选择“追踪流” -> “TCP流”。Wireshark会弹出一个新窗口,将这个TCP连接的所有请求和响应按顺序排列,并用颜色区分(红色为客户端请求,蓝色为服务器响应)。这让你能像看对话记录一样,完整看到一次攻击交互的全貌。例如,你可以看到攻击者:① 访问登录页 -> ② 进行爆破 -> ③ 爆破成功返回Session Cookie -> ④ 利用Cookie访问管理后台 -> ⑤ 上传文件。
- 导出对象功能:如果攻击过程中上传或下载了文件,我们可以直接将其导出。点击
文件->导出对象->HTTP。Wireshark会列出所有HTTP传输中识别出的文件(图片、文档、脚本等)。你可以在这里直接保存可疑的文件(如一个.php文件),然后进行离线分析。这对于获取Webshell样本至关重要。 - 绘制I/O图观察流量模式:对于疑似DDoS或CC攻击,时间模式很重要。点击
统计->I/O图。在图形中,你可以添加过滤器,比如http and ip.src == 攻击IP,观察其请求速率是否在某一时刻突然飙升,并持续保持高位。这能直观地证明攻击流量的存在。
4. 核心技巧与常见问题排查实录
理论结合实践,下面分享一些我踩过坑后总结的硬核技巧和常见问题的解决方法。
4.1 高效分析的五条黄金法则
- 先整体,后局部:永远先从“对话”、“协议分级”、“端点”等统计视图开始,找到异常点,再深入钻取。避免一开始就扎进海量数据包。
- 过滤器是生命线:熟练组合使用显示过滤器。常用的可以保存起来(过滤器输入框右侧的“+”号)。例如,我常备一个叫“可疑HTTP”的过滤器:
(http.request.uri matches ".*(\\'|\\%27|union|select|sleep|script).*") or (http.response.code >= 400 and http.response.code < 600),用于快速筛查。 - 善用“应用为过滤器”:在包详情面板,对任何你感兴趣的字段(如IP、端口、URI、状态码)右键,都可以快速将其加入或排除出当前过滤器,这是动态探索数据的利器。
- 关注时间戳与相对时间:在包列表面板,右键点击“时间”列,选择“时间显示格式” -> “相对于前一个分组”。这能让你清晰看到每个请求之间的间隔。自动化攻击的间隔往往非常均匀,而人工操作的间隔则波动很大。
- 保存你的发现:当找到关键证据包时,可以选中它们,然后
文件->导出特定分组,保存为一个新的、更小的pcap文件。这对于撰写报告或与团队共享证据非常方便。
4.2 典型攻击痕迹的Wireshark特征速查表
为了更快定位,我将常见攻击在Wireshark中的特征整理成下表:
| 攻击类型 | 关键Wireshark特征/过滤器思路 | 备注 |
|---|---|---|
| SQL注入探测 | http.request.uri contains "'"http.file_data contains "union select"大量包含 AND,OR,--,#的异常参数。 | 注意观察错误响应(如MySQL语法错误泄露在500响应中)。 |
| 路径遍历/文件包含 | http.request.uri contains "../"http.request.uri contains "/etc/passwd"参数中包含 ..\\或file=等关键字。 | 常与本地文件包含(LFI)漏洞利用结合。 |
| XSS探测 | http.request.uri contains "<script>"http.request.uri contains "alert("参数值中包含大量HTML标签或JavaScript事件(如 onerror=)。 | 可能尝试多种编码绕过。 |
| 暴力破解 | 短时间内,同一源IP向同一目标(如/login.php)发起大量POST请求。请求体中的用户名/密码字段规律变化。 伴随大量 401或302(重定向到失败页)响应。 | 使用“对话”视图和“I/O图”辅助识别。 |
| 目录/文件扫描 | 同一源IP快速、连续请求大量不同且不存在的路径(.php,.bak,.git/)。产生大量 404或403响应。 | 扫描工具(如DirBuster)的User-Agent可能有特征。 |
| Webshell通信 | 访问非常规路径的.php、.jsp文件(如/images/cmd.php)。请求中包含命令执行参数(如 ?cmd=whoami)。响应内容为系统命令输出(如目录列表、 uid=信息)。 | 追踪该TCP流,能看到完整的“命令行”交互。 |
| 命令注入 | POST或GET参数中包含管道符 ` | 、分号;、反引号 ```` 或系统命令(ping,ls,dir)。 |
4.3 常见问题与排查技巧
问题:过滤器语法正确,但过滤不出任何包?
- 排查:首先确认当前是否在显示所有包(过滤器框为绿色)。检查协议名称是否正确,比如HTTP流量可能跑在非标准端口(8080)上,此时用
http过滤器无效,需要用tcp.port == 8080。对于HTTPS,若无密钥,http过滤器永远无效。 - 技巧:对一个已知的HTTP包,在详情面板里展开“Hypertext Transfer Protocol”,看看Wireshark是否将其识别为
HTTP。如果不是,可能需要调整HTTP协议的解析端口。
- 排查:首先确认当前是否在显示所有包(过滤器框为绿色)。检查协议名称是否正确,比如HTTP流量可能跑在非标准端口(8080)上,此时用
问题:如何从加密的HTTPS流量中找线索?
- 虽然看不到内容,但元数据很有价值:观察TLS握手阶段。大量失败的TLS握手(
Alert报文)可能意味着扫描工具在探测HTTPS服务。观察连接的模式:短期、大量的TLS连接来自同一IP,可能是加密层的DDoS或扫描。 - 服务器名称指示(SNI):在TLS握手的
Client Hello报文中,有一个明文的Server Name字段,显示了客户端想要访问的域名。你可以用过滤器tls.handshake.extensions_server_name来查看。攻击者扫描时,这个字段可能指向一些敏感的管理后台域名。
- 虽然看不到内容,但元数据很有价值:观察TLS握手阶段。大量失败的TLS握手(
问题:pcap文件太大,Wireshark卡死怎么办?
- 不要一次性加载:使用
tshark(Wireshark的命令行版本)先进行预处理。例如,用命令tshark -r suspicious_traffic.pcap -Y "http" -w http_only.pcap可以提取出所有HTTP流量,生成一个更小的文件,再用Wireshark GUI分析。 - 使用捕获过滤器:如果是在已知攻击时段抓包,可以在抓包前就设置捕获过滤器,如
host 目标IP and port 80,只抓取相关流量。 - 分而治之:如果已经有一个大pcap,可以先用“文件”->“导出特定分组”,根据时间范围或IP地址,将其切割成多个小文件再分析。
- 不要一次性加载:使用
问题:如何确认找到的痕迹是攻击而非误报?
- 上下文关联:单个可疑请求可能是误触或测试。要形成证据链:扫描行为(大量404)-> 漏洞探测(带Payload的请求)-> 利用尝试(如上传文件)-> 维持访问(访问Webshell)。这一系列动作在时间线上有逻辑关联。
- 源IP信誉:查询可疑IP的地理位置和信誉(可通过在线威胁情报平台,注意使用合规方式)。如果来自已知的恶意IP段或僵尸网络,则增加其恶意可能性。
- 与正常流量对比:在同一个pcap中,找一个你确认为正常的用户会话(比如一个完整的浏览购物流程),对比其请求频率、模式、参数与可疑会话的差异。自动化攻击与人工操作在“节奏感”上区别明显。
5. 案例复盘:一个真实的pcap分析演练
为了让大家更有体感,我描述一个虚拟但典型的分析场景。假设我们拿到一个pcap,通过上述方法,发现了以下线索:
- 统计发现:“对话”视图显示,IP
203.0.113.5与我们的服务器192.168.1.100在短时间内有超过1万个数据包交换,远超其他会话。 - 聚焦分析:应用过滤器
ip.addr == 203.0.113.5 and http。发现几乎全是GET请求。 - 模式识别:查看请求URI,呈现明显的目录爆破特征:
/admin/,/wp-admin/,/phpmyadmin/,/config.ini,/backup.sql…… 对应的响应大多是404 Not Found。 - 发现漏洞探测:在众多请求中,发现一个:
GET /product.php?id=1' AND SLEEP(5)--。这是一个基于时间的盲注探测。追踪这个TCP流,发现攻击者在同一个会话中,紧接着尝试了UNION SELECT等更多Payload。 - 找到突破口:继续浏览,发现一个请求:
GET /admin/login.php返回了200 OK(找到了后台)。随后,同一IP开始对/admin/login.php发起密集的POST请求,参数username和password在不断变化,响应是302重定向到失败页。这是典型的登录爆破。 - 攻击成功:在某一刻,一个
POST请求之后,服务器的响应变成了一个设置Cookie的302重定向到/admin/index.php。这意味着爆破可能成功了。 - 后续行为:攻击者使用这个
Cookie,访问了/admin/upload.php,并通过一个multipart/form-data的POST请求,上传了一个名为shell.php的文件。在TCP流中,可以清晰看到该文件的PHP代码内容。 - 维持访问:最后,攻击者访问了
/images/uploads/shell.php?cmd=whoami,服务器响应中包含了Web服务器进程的运行用户信息。
至此,一个从信息收集(扫描)、漏洞探测(SQL注入)、权限获取(爆破)、到植入后门(上传Webshell)的完整攻击链条就被清晰地还原出来了。你的分析报告就可以基于这些确凿的包序列来撰写。
6. 总结与工具链延伸
经过以上步骤,你应该已经掌握了从浩如烟海的HTTP流量中定位攻击痕迹的核心方法。这套方法的核心在于分层递进和模式识别:从宏观统计到微观解析,从协议异常到语义理解。
Wireshark虽然是核心,但在实际工作中,它往往是一个更大的分析工具链的一环。你可以将过滤后的关键流量导出,用其他工具进行深度分析,比如:
- NetworkMiner:更专注于网络取证,能自动从pcap中提取文件、证书、会话信息等,图形化展示网络资产。
- Zeek (原Bro):它是一个被动的网络流量分析器,不仅记录网络活动,还能通过脚本实时分析,生成结构化的日志(如
http.log、conn.log),非常适合与SIEM(安全信息与事件管理)系统集成,进行自动化威胁检测。 - Moloch:一个大规模PCAP捕获、索引和数据库系统。如果你需要处理TB级别的全流量数据并长期存储检索,Wireshark就力不从心了,Moloch是更好的选择。
最后,再分享一个我的个人习惯:每分析完一个有趣的攻击pcap,我都会把关键的过滤器、发现的特征和攻击链条图保存到一个笔记里。日积月累,这就成了我自己的“攻击模式特征库”,下次再遇到类似情况,分析速度能快上好几倍。网络攻防是动态的,攻击手法在变,我们的分析思路和工具库也需要不断更新。保持好奇,持续练习,你就能在流量的世界里,看清更多真相。