工具介绍《WireShark》
Wireshark 过滤命令中符号含义详解
一、比较运算符
Wireshark 支持两种比较运算符语法:英文缩写(如 eq
)和 C语言风格符号(如 ==
),两者功能等价。
符号(英文缩写) | C语言风格符号 | 含义 | 示例 |
---|---|---|---|
eq | == | 等于 | ip.src == 192.168.1.1 |
ne | != | 不等于 | tcp.port != 80 |
gt | > | 大于 | frame.len > 1000 |
lt | < | 小于 | udp.length < 50 |
ge | >= | 大于等于 | tcp.window_size >= 8192 |
le | <= | 小于等于 | ip.len <= 1500 |
注意:
- 等于判断:
ip.addr eq 192.168.1.1
与ip.addr == 192.168.1.1
完全等价。 - 不等于判断:
!=
或ne
均可,但需注意部分场景需用not
组合(如not tcp.port == 80
)。
二、逻辑运算符
用于组合多个过滤条件,支持 英文缩写(如 and
)和 C语言风格符号(如 &&
)。
符号(英文缩写) | C语言风格符号 | 含义 | 示例 |
---|---|---|---|
and | && | 逻辑与(同时满足) | ip.src == 192.168.1.1 && tcp.port == 80 |
or | || | 逻辑或(满足其一) | http.request.method == "GET" || http.request.method == "POST" |
not | ! | 逻辑非(排除条件) | !icmp (排除所有 ICMP 包) |
注意:
- 优先级:
not
>and
>or
,建议用括号明确优先级(如(a and b) or c
)。 - 组合过滤:可联合使用比较和逻辑运算符,例如
ip.addr == 10.1.1.1 and (tcp.port == 80 or udp.port == 53)
。
三、特殊符号与高级操作
-
contains
与matches
contains
:检查字段是否包含指定字符串(大小写敏感)http contains "password" # 过滤 HTTP 报文含 "password" 的包
matches
:支持正则表达式匹配(需用~
符号)http.request.uri matches ".*\.php$" # 匹配 URI 以 .php 结尾的请求
-
[]
偏移量操作
用于从协议头或载荷中提取特定字节:tcp[20:4]
:从 TCP 头的第 20 字节开始截取 4 个字节。udp[8:3]==20:21:22
:检查 UDP 载荷第 8 字节开始的 3 个字节是否为0x20 0x21 0x22
。
-
按位运算符
<<
和>>
用于处理协议头中的位移计算(常见于捕获过滤器):tcp[((tcp[12] & 0xf0) >> 2):4] == 0x47455420 # 匹配 TCP 载荷中的 "GET " 请求
>>
:右移(除以 2 的幂次),如(tcp[12] & 0xf0) >> 2
计算 TCP 头长度。<<
:左移(乘以 2 的幂次),如(ip[0] & 0xf) << 2
计算 IPv4 头长度。
四、实际应用示例
-
组合逻辑过滤
ip.addr == 192.168.1.1 and (tcp.port == 80 or udp.port == 53) and !http
- 含义:过滤源或目的 IP 为
192.168.1.1
,且端口为 80(TCP)或 53(UDP),但排除 HTTP 协议。
- 含义:过滤源或目的 IP 为
-
复杂协议分析
tcp.flags.syn == 1 and tcp.flags.ack == 0 # 匹配 TCP SYN 包(不含 ACK)
- 用途:检测异常连接请求。
-
内容提取与隐写检测
icmp and icmp[8:1] == 0x66 # 检查 ICMP 数据段第 8 字节是否为 0x66(ASCII 'f')
- 用途:分析 ICMP 协议中的隐写数据。
一、基础操作流程
-
数据包筛选与过滤
- 协议筛选:直接输入协议名称(如
http
、tcp
、icmp
)过滤特定协议流量,排除无关干扰。 - IP/端口定位:
- 源IP:
ip.src == 192.168.1.1
- 目标端口:
tcp.dstport == 80
- MAC地址:
eth.addr == A0:00:00:04:C5:84
- 源IP:
- 内容搜索:按
Ctrl+F
搜索关键字,支持字符串、十六进制和正则表达式,常用于快速定位flag。
- 协议筛选:直接输入协议名称(如
-
数据包还原技术
- 追踪流(Follow Stream):右键数据包选择追踪TCP/UDP/HTTP流,可还原完整的会话内容,常用于提取HTTP上传文件、SQL注入语句等。
- 文件导出:通过
文件 -> 导出对象 -> HTTP
批量提取传输的文件(如压缩包、图片),或手动从data
层导出字节流。
-
协议层级分析
- 分层解析:逐层展开数据包的物理层、传输层(TCP/UDP)、应用层(HTTP/FTP)信息,分析异常字段(如TCP标志位异常、HTTP请求参数含可疑代码)。
二、CTF常见题型与解法
1. HTTP协议相关
- 文件上传/下载:
- 通过HTTP过滤器定位
POST
请求,追踪流查看上传内容;导出对象提取隐藏文件(如flag.rar
)。 - 分段传输:若文件分多包传输,需用
dd
命令合并并去除冗余头信息。
- 通过HTTP过滤器定位
- Web渗透痕迹:
- 筛选
http.request.uri contains "upload.php"
,分析SQL注入或命令执行流量,提取攻击载荷。
- 筛选
2. ICMP协议隐写
- Ping报文隐写:检查ICMP数据段,可能直接包含ASCII字符或通过脚本提取隐藏信息(如每包1字节组合成flag)。
- 示例脚本:
import pyshark cap = pyshark.FileCapture('icmp.pcap') for pkt in cap: print(chr(int(pkt.icmp.data, 16)), end='')
3. USB流量分析
- 键盘流量:
- 使用tshark提取数据:
tshark -r usb.pcap -T fields -e usb.capdata > usbdata.txt
- 过滤有效击键(HID Usage ID),通过映射表转换键位(如
0x04
对应"A")。
- 使用tshark提取数据:
- 鼠标流量:解析移动坐标(
X/Y
偏移量),绘制轨迹图还原操作。
4. 加密流量解密
- SSL/TLS解密:需预置服务器私钥或
SSLKEYLOGFILE
,在Wireshark中配置密钥解密HTTPS流量,查找敏感数据。 - Webshell流量(如蚁剑):
- 识别Base64编码的PHP代码,通过URL解码和流量统计定位后门交互。
三、高级技巧与工具联动
-
协议统计与排序
- 使用
统计 -> 协议分级
快速发现异常协议(如非常见端口HTTP或异常DNS隧道)。 - I/O图表:分析流量时间分布,定位爆破攻击(如高频SSH登录尝试)。
- 使用
-
联合工具分析
- Tshark命令行:批量提取字段(如
tshark -r file.pcap -Y 'http' -T json
导出JSON格式)。 - Foremost/Binwalk:自动分离流量中的嵌入文件(如图片碎片、PDF)。
- Tshark命令行:批量提取字段(如
-
无线流量处理
- WiFi密码破解:捕获WPA握手包,用Aircrack-ng配合字典破解,需过滤
eapol
协议。
- WiFi密码破解:捕获WPA握手包,用Aircrack-ng配合字典破解,需过滤
四、实战案例分析
- 案例a:键盘流量还原密码
通过USB协议过滤,提取击键数据并映射,得到6位数字密码flag{720093}
。 - 案例b:HTTP文件分片重组
合并5个分片包,去除364字节头部后合成fly.rar
,解压得flag。 - 案例c:蚁剑后门分析
追踪info1.php
流量,解密Base64载荷获取Webshell密码及下载的恶意文件。
实战案例1:HTTP流量中隐藏的压缩包文件
题目背景
给定一个名为web_traffic.pcap
的流量包,分析并找到隐藏的Flag文件。
分析过程
-
初步筛选HTTP流量
- 在Wireshark过滤栏输入
http
,筛选所有HTTP协议流量,排除无关数据。 - 观察HTTP请求方法(GET/POST),重点关注
POST
请求(可能用于文件上传)。
- 在Wireshark过滤栏输入
-
追踪TCP流还原完整会话
- 右键任意HTTP数据包 →
追踪流
→TCP流
,查看完整HTTP会话内容。 - 发现关键信息:
(示例:POST请求上传了名为secret.zip的文件)POST /upload.php HTTP/1.1 ...(请求头)... Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABCDEFG ------WebKitFormBoundaryABCDEFG Content-Disposition: form-data; name="file"; filename="secret.zip" Content-Type: application/zip PK...(ZIP文件头标志)...
- 右键任意HTTP数据包 →
-
导出隐藏的ZIP文件
- 点击菜单栏
文件
→导出对象
→HTTP
,打开导出对话框。 - 在列表中找到
secret.zip
的传输记录(文件名和大小匹配),点击Save
导出文件。
- 点击菜单栏
-
解决文件损坏问题
- 若导出的ZIP无法解压,可能因流量包截断或分片传输导致文件头缺失。
- 手动修复:
- 使用十六进制编辑器(如010 Editor)在文件头部添加ZIP文件头标志
50 4B 03 04
(对应ASCII为PK..
)。 - 若文件分片传输,需合并多个数据包的
data
字段内容(通过tcp.stream eq <流编号>
筛选同一流的分片)。
- 使用十六进制编辑器(如010 Editor)在文件头部添加ZIP文件头标志
-
解压获取Flag
- 修复后的
secret.zip
解压得到flag.txt
,内容为:
flag{http_file_upload_928374}
- 修复后的
实战案例2:ICMP协议中的Flag隐写
题目背景
在icmp.pcapng
流量包中,Flag通过ICMP报文的数据段隐写传输。
分析过程
-
筛选ICMP流量
- 输入过滤器
icmp
,仅显示ICMP协议报文。 - 观察
Echo request
(Ping请求)报文,数据段(Data)可能包含隐写信息。
- 输入过滤器
-
提取数据段内容
- 展开ICMP报文 →
Data
字段,发现数据段为十六进制值,例如:
Data: 66 6c 61 67 7b 69 63 6d 70 5f 73 74 65 67 6f 7d
- 手动转换:将十六进制转换为ASCII:
bytes = [0x66, 0x6c, 0x61, 0x67, 0x7b, 0x69, 0x63, 0x6d, 0x70, 0x5f, 0x73, 0x74, 0x65, 0x67, 0x6f, 0x7d] print(''.join([chr(b) for b in bytes])) # 输出:flag{icmp_stego}
- 展开ICMP报文 →
-
自动化提取脚本
- 若Flag分散在多个ICMP包中(如每包1字节),编写Python脚本批量提取:
import pyshark cap = pyshark.FileCapture('icmp.pcap', display_filter='icmp') flag = '' for pkt in cap: if hasattr(pkt.icmp, 'data'): hex_data = pkt.icmp.data.replace(':', '') flag += bytes.fromhex(hex_data).decode('latin-1') print(flag) # 输出:flag{icmp_stego_123}
- 若Flag分散在多个ICMP包中(如每包1字节),编写Python脚本批量提取:
实战案例3:USB键盘流量还原密码
题目背景
流量包usb_keyboard.pcap
记录了USB键盘输入,需还原输入的6位数字密码。
分析过程
-
筛选USB键盘流量
- 输入过滤器
usb.transfer_type == 0x01 && usb.dst == "host"
,筛选键盘输入事件。
- 输入过滤器
-
提取击键数据
- 使用tshark命令行提取
usb.capdata
字段:tshark -r usb_keyboard.pcap -T fields -e usb.capdata > keystrokes.txt
- 输出示例(每行对应一次击键):
00:00:04:00:00:00:00:00
00:00:05:00:00:00:00:00
- 使用tshark命令行提取
-
映射HID Usage ID到字符
- 提取第三字节(如
04
对应字母a
,05
对应b
)。 - HID键位表(部分):
0x04: a, 0x05: b, 0x06: c, ..., 0x1d: 0, 0x1e: 1, ..., 0x27: 9
- 脚本转换:
hid_map = { 0x04: 'a', 0x05: 'b', 0x06: 'c', 0x07: 'd', 0x08: 'e', 0x09: 'f', 0x0a: 'g', 0x1d: '0', 0x1e: '1', 0x1f: '2', 0x20: '3', 0x21: '4', 0x22: '5', 0x23: '6', 0x24: '7', 0x25: '8', 0x26: '9' } with open('keystrokes.txt') as f: for line in f: if line.strip() == '00:00:00:00:00:00:00:00': continue # 跳过无效数据 key_code = int(line.split(':')[2], 16) print(hid_map.get(key_code, ''), end='') # 输出:flag{720931}
- 提取第三字节(如
总结与技巧
- 快速定位关键点:
- HTTP文件传输 → 过滤
http
并检查POST
请求。 - 隐写数据 → 检查协议数据段的十六进制/ASCII内容。
- HTTP文件传输 → 过滤
- 工具联动:
- 使用
tshark
批量提取字段,pyshark
自动化分析。
- 使用
- 数据修复:
- 文件头修复、分片重组、字符映射是常见解题关键。