工具介绍《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自动化分析。
 
- 使用
- 数据修复: 
  - 文件头修复、分片重组、字符映射是常见解题关键。
 
