1. 项目概述:从流量中“听”到攻击者的心跳
在网络安全竞赛和日常渗透测试中,流量分析(Traffic Analysis)是还原攻击现场、定位攻击入口、提取关键证据的核心技能。想象一下,你面对的是一个被打包成.pcap或.pcapng格式的网络流量文件,它就像犯罪现场的监控录像,记录了攻击者与目标系统之间所有的“对话”。而Wireshark,就是你的“录像回放分析仪”。这个项目的核心,就是教会你如何像一位资深的安全分析师一样,熟练运用Wireshark,从海量、杂乱的数据包中,快速、精准地揪出两种最常见也最危险的攻击痕迹:SQL注入点和Webshell(木马)的通信密码。
这不仅仅是CTF夺旗赛中的必备技能,更是真实安全应急响应、渗透测试报告编写中不可或缺的实战能力。很多新手面对一个几百MB甚至上GB的流量文件时,往往感到无从下手,被成千上万个数据包淹没。本指南将为你梳理出一条清晰的排查路径,结合过滤语法、协议特征和攻击逻辑,让你能直击要害,避免在无关流量中浪费宝贵时间。无论你是CTF新手、安全爱好者,还是希望提升实战能力的运维人员,掌握这套方法都能让你在分析网络攻击时事半功倍。
2. 核心思路与排查框架设计
面对一个未知的流量文件,盲目地从头到尾浏览是效率最低的做法。我们需要建立一套系统性的分析框架,将“大海捞针”转变为“按图索骥”。这个框架的核心思想是:基于协议分层和攻击特征,进行由粗到细的逐层过滤与聚焦。
2.1 分析前的准备工作与第一印象
拿到流量文件后,不要急于点开。首先,用Wireshark打开它,先看一眼“统计”(Statistics)菜单下的“协议分级”(Protocol Hierarchy)报告。这个报告会告诉你这个流量文件中主要包含了哪些协议(如HTTP、TCP、TLS、DNS等)以及它们的占比。例如,如果HTTP/HTTPS流量占比超过80%,那么这很可能是一次针对Web应用的攻击;如果存在大量的ICMP或异常端口流量,则可能需要考虑其他攻击类型。这个步骤能在30秒内给你一个宏观的定向。
接下来,在开始过滤之前,我习惯先快速浏览一下最开始的几十个包。重点关注DNS查询和TCP三次握手。DNS查询能告诉你攻击者可能访问了哪些域名,而异常的TCP连接(如向服务器的3306端口MySQL、3389端口RDP发起连接)可能直接暴露攻击目标。这一步是建立初步的“战场态势图”。
2.2 构建三层递进式过滤策略
我们的分析将遵循一个三层策略,像剥洋葱一样层层深入:
协议层聚焦:首先将无关协议过滤掉。最常用的就是过滤出HTTP流量:
http或tcp.port == 80。如果涉及HTTPS,由于内容加密,直接分析载荷意义不大,除非你有密钥,否则我们更关注其元数据(如SNI域名)。在CTF中,为了考察能力,题目往往会使用未加密的HTTP流量,或者故意给出解密后的SSL流量文件。请求层筛选:在HTTP流量中,攻击行为往往体现在客户端发送的请求(Request)中。因此,我们可以过滤出HTTP请求包:
http.request。这样,视图里就只剩下浏览器或攻击工具向服务器发送的请求了,数量会大幅减少。特征层精确定位:这是最关键的一步。在HTTP请求中,我们根据SQL注入和木马连接的特征,构建特定的显示过滤器(Display Filter),将可疑的请求“钉”出来。
这套策略的优势在于,它避免了在成千上万的TCP重传、ACK确认包、图片资源请求中迷失方向,直接带你走到最可能发现“宝藏”的地方。记住,攻击者的操作必然会在流量中留下请求记录,我们的任务就是找到它们。
3. 实战精解:定位SQL注入点
SQL注入的流量特征非常明显:攻击者在正常的HTTP请求参数中,插入了用于操作数据库的SQL代码片段。我们的目标就是找到这些携带了特殊“载荷”的请求。
3.1 识别常见的SQL注入载荷特征
攻击者尝试SQL注入时,其输入通常包含以下关键词或符号,我们可以据此构建过滤器:
- 逻辑测试类:
'(单引号)、"(双引号)、1=1、1=2、OR、AND、--(SQL注释)、#(MySQL注释)、/*(多行注释)。 - 联合查询类:
UNION、SELECT、FROM、WHERE、CONCAT。 - 报错注入类:
extractvalue、updatexml、floor、exp等函数名。 - 时间盲注类:
SLEEP(、WAITFOR DELAY、BENCHMARK。
在Wireshark中,HTTP请求的参数存在于两个地方:URL(GET请求)和请求体(POST请求)。我们需要检查http.request.uri和http.file_data字段。
3.2 构建Wireshark过滤表达式
最有效的过滤器是组合使用http.request和参数包含特定关键词的条件。这里给出几个威力强大的“组合拳”:
基础侦查过滤器:这个过滤器能捕捉到绝大多数注入尝试,误报率低,是我首选的起始命令。
http.request and (http.request.uri contains "union" or http.file_data contains "union" or http.request.uri contains "select" or http.file_data contains "select" or http.request.uri contains "'or" or http.file_data contains "'or")注意:这里使用
contains进行字符串匹配,是大小写不敏感的。'or是一个常见模式,用于构造如admin' or '1'='1这样的永真条件。引号与注释探测过滤器:用于发现初步的注入点探测行为。
http.request and (http.request.uri matches "%27%20--%20" or http.file_data matches "%27%20--%20")提示:
%27是单引号'的URL编码,%20是空格。matches运算符支持使用百分号%进行十六进制字节匹配,这在搜索经过编码的特殊字符时非常精准。报错注入专用过滤器:
http.request and (http.request.uri contains "extractvalue" or http.file_data contains "extractvalue" or http.request.uri contains "updatexml" or http.file_data contains "updatexml")
将这些过滤器依次应用,Wireshark的包列表会迅速精简到只剩下高度可疑的请求。双击某个数据包,在下方详情面板中展开Hypertext Transfer Protocol,查看Full request URI或Line-based text data,就能清晰看到完整的恶意请求参数。
3.3 关键步骤:从请求到注入点还原
找到可疑包之后,我们需要做两件事:
- 定位注入参数:查看请求的完整URL或POST数据体,确定攻击者是在哪个参数里动的手脚。常见参数如
id、username、search、category等。 - 还原注入语句:将URL编码后的内容(如
%27、%20、%2C)进行解码,还原出攻击者输入的原始SQL片断。你可以使用Wireshark自带的“Follow -> HTTP Stream”功能,在一个连贯的视图中查看整个HTTP会话的请求和响应,这能帮你理解攻击的步骤和逻辑。
实操心得:不要只盯着找到的第一个注入包。攻击者通常会进行多次尝试。使用“Follow TCP Stream”功能追踪该IP地址的整个会话,你可能会发现他从简单的引号测试,到联合查询,再到最终获取数据的完整攻击链。这对于CTF解题(获取Flag)和理解攻击者意图至关重要。
4. 实战精解:揪出Webshell的密码
Webshell(俗称木马)通常是一个上传到服务器上的脚本文件(如shell.php、antsword.jsp),攻击者通过访问这个文件并提交密码(也称为“连接密码”或“密钥”)来获得一个Web端的控制台。我们的目标就是在流量中,找到访问这个特殊文件的请求,并从中提取密码。
4.1 Webshell通信的流量特征
与SQL注入不同,Webshell的通信更像是一次“认证”过程。其特征如下:
- 请求路径异常:访问的URL路径往往与网站正常业务无关,文件名可疑,如
/uploads/shell.php、/images/cmd.asp、/wp-content/backdoor.php等。 - 请求方法:通常为POST方法,因为密码等敏感数据放在请求体中更隐蔽。
- 参数名固定或隐蔽:密码往往通过一个特定的参数名传递。常见的有
pass、password、pwd、key、ant、x等。高级的Webshell可能会使用自定义的、不显眼的参数名,甚至对密码进行简单加密或编码。 - 响应内容异常:成功的Webshell连接,其HTTP响应内容可能包含命令执行结果、目录列表等,不同于普通页面的HTML。
4.2 构建密码定位过滤器
我们的策略是:先找到可疑的POST请求,再从中筛查密码。
定位所有POST请求:这是缩小范围的第一步。
http.request.method == "POST"搜索常见密码参数名:在POST请求体中搜索。
http.request.method == "POST" and (http.file_data contains "pass=" or http.file_data contains "pwd=" or http.file_data contains "key=" or http.file_data contains "ant=")这个过滤器能快速定位使用常见参数名的Webshell连接。
应对隐蔽情况:如果攻击者使用了不常见的参数名,或者密码被编码,上述过滤器会失效。此时需要更通用的方法:
- 方法A:检查响应。可以先过滤出状态码为200(成功)的POST请求,然后逐个查看其响应内容,寻找包含
>(命令行提示符)、Directory of、Linux、Microsoft等系统信息特征的包。命令是:http.request.method == "POST" and http.response.code == 200。 - 方法B:追踪可疑文件。如果你通过其他线索(如文件上传流量)猜到了一个可能的Webshell文件名(比如
shell.php),可以直接过滤:http.request.uri contains "shell.php"。
- 方法A:检查响应。可以先过滤出状态码为200(成功)的POST请求,然后逐个查看其响应内容,寻找包含
4.3 关键步骤:密码提取与验证
找到可疑的POST请求包后,在详情面板中展开HTML Form URL Encoded或直接查看Line-based text data,就能看到以key=value形式提交的参数。那个value就是Webshell的密码。
一个必须警惕的情况:密码可能不是明文。攻击者可能进行了Base64编码、十六进制编码,甚至简单的凯撒移位。例如,你看到的可能是pass=YWRtaW4=,这实际上是admin的Base64编码。Wireshark本身不提供解码功能,你需要将字符串复制出来,用CyberChef等在线工具或本地命令(如echo ‘YWRtaW4=’ | base64 -d)进行解码。
实操心得:Webshell的密码往往在攻击者第一次连接时发送。因此,关注整个流量文件中,对某个可疑脚本文件的第一次POST请求,成功率极高。使用“Follow -> HTTP Stream”查看整个会话,如果看到攻击者随后执行了whoami、ls、ipconfig等命令,那就铁证如山了。
5. 高阶技巧与组合拳应用
掌握了基本方法后,一些高阶技巧能让你在复杂场景下游刃有余。
5.1 利用“追踪流”功能还原攻击全景
无论是分析SQL注入还是Webshell,Follow TCP Stream(追踪TCP流)和Follow HTTP Stream(追踪HTTP流)都是神器。它们能将分散的数据包按会话重组,呈现完整的“对话”文本。
- 对于SQL注入,你可以看到攻击者从探测、报错、到最终拖库的完整链条。
- 对于Webshell,你可以看到从登录认证,到执行命令,再到下载文件的完整操作日志。 在流窗口中,你可以清晰地看到原始的、未经分割的请求和响应数据,极大方便了分析和复制关键信息。
5.2 基于统计和端口的异常发现
有时攻击可能不那么典型。我们可以利用Wireshark的统计功能发现异常:
- 对话列表(Statistics -> Conversations):查看哪些IP对之间的通信数据量最大、包数量最多。一个与服务器进行长时间、高频率通信的外部IP,很可能就是攻击者。
- 端点统计(Statistics -> Endpoints):查看哪些IP地址发送或接收了最多的数据,这可能指向C2服务器或被攻陷的主机。
- 过滤非标准端口HTTP:有些Webshell或管理后台会放在8000、8080、8888等端口。使用过滤器:
tcp.port == 8080 and http。
5.3 搜索大法:字符串与十六进制
当所有过滤技巧都失效时,别忘了Wireshark强大的全局搜索(Ctrl+F)。你可以在指定范围(分组列表、分组详情、分组字节流)中搜索字符串或十六进制值。
- 搜索Flag:在CTF中,Flag通常有固定格式,如
flag{、CTF{。直接在分组字节流中搜索这些字符串,有时会有奇效。 - 搜索敏感命令:在字节流中搜索
whoami、cat /etc/passwd、eval(、system(等系统命令或危险函数名。
6. 常见问题与排查实录
在实际操作中,你肯定会遇到一些棘手的情况。下面是我总结的一些常见“坑”及解决方法。
| 问题现象 | 可能原因 | 排查思路与解决方案 |
|---|---|---|
| 应用了过滤器,但一个包都没显示。 | 1. 过滤器语法错误。 2. 流量中确实不存在匹配的协议或内容。 3. 流量文件本身损坏或不完整。 | 1. 检查过滤器拼写,确保字段名正确(如http.request而非http.requests)。2. 先使用一个宽泛的过滤器,如 http,确认是否存在HTTP流量。3. 尝试用 tcp过滤器,看是否有TCP包,确认文件基本可读。 |
| 找到了SQL注入请求,但看不到服务器返回的数据库内容(Flag)。 | 1. Flag可能在后续的请求响应中。 2. 响应内容可能被编码或放在数据包的不同部分。 3. 可能是盲注,响应里没有直接数据。 | 1. 使用“Follow HTTP Stream”查看整个会话,Flag可能在注入成功后的页面响应里。 2. 检查响应包的 Line-based text data或JSON部分。3. 如果是时间盲注,需要观察请求与响应的时间戳间隔,Flag可能以“时间差”的形式隐含。 |
| 怀疑有Webshell,但搜索常见密码参数名无果。 | 1. 参数名非常见。 2. 密码被编码。 3. 使用GET方法而非POST。 4. Webshell通信使用了自定义协议或加密。 | 1. 过滤所有对.php、.jsp、.asp等可执行脚本的POST请求,人工审查。2. 查看请求体,寻找形如 xxx=YWRtaW4=(Base64)或xxx=61646d696e(Hex)的字段。3. 尝试过滤 http.request.uri contains “cmd=”或“exec=”。4. 关注响应内容异常(如包含系统命令输出)的请求,反向追踪其对应的请求。 |
| 流量太大,Wireshark分析卡顿。 | 一次性加载和过滤海量数据包消耗资源。 | 1.首选项设置:Edit -> Preferences -> Appearance,取消勾选“Show packet list in separate window”,可提升性能。 2.分次过滤:不要一次性应用复杂过滤器。先 http,再http.request,逐步缩小范围。3.使用捕获过滤器:如果是从网卡实时抓包,在开始前就设置好捕获过滤器(如 port 80),只抓需要的流量。 |
| 看到疑似密码的字符串,但提交不对。 | 1. 密码经过了二次处理(如MD5、ROT13)。 2. 提取的字符串不完整(包含空格、换行)。 3. 这不是密码,而是其他令牌。 | 1. 对提取的字符串尝试常见编码解码(Base64, URL, Hex)和简单加密(ROT13)。CTF中常考。 2. 在“Follow Stream”的原始视图中完整复制,注意首尾空格。 3. 结合上下文判断,例如,如果该请求后紧跟了一系列命令执行,那它大概率就是密码。 |
最后再分享一个我的个人习惯:在开始深入分析前,我会先用一个非常简单的过滤器http contains “flag”或tcp contains “flag”快速扫一遍。有时候出题人会把Flag直接放在某个数据包的注释或明文字段里,用这招偶尔能“秒杀”一些题目。当然,这属于运气成分,扎实掌握前面所述的流程和方法,才是应对万变题目的根本。流量分析就像侦探破案,工具(Wireshark)给你提供了现场的所有痕迹,而你的经验和逻辑(过滤策略)则决定了你能否从这些痕迹中还原出真相。多练、多思考,你会发现自己“读”懂数据包的能力越来越强。