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/zipPK...(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 pysharkcap = 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
自動化分析。
- 使用
- 數據修復:
- 文件頭修復、分片重組、字符映射是常見解題關鍵。