1. 概述
本文全面介紹了wireshark過濾器語法,wireshark包括捕獲過濾器和顯示過濾器,其中顯示過濾器的語法十分豐富,其實顯示過濾器的語法可以簡單概括爲:基本數據類型,協議對象,比較運算符,結合運算符,字符串函數與正則表達式,這就是其所有語法。其中高級的用法也許是切片、集合、正則表達式。
本文重點在於全面的描述其基本語法,通過例子來學習,那些複雜的用法其實都來自這些基本的語法元素,如有不完善之處,歡迎提出建議。
文章目錄
2. 過濾器分類
wireshark包括捕獲過濾器和顯示過濾器
- 捕獲過濾器:決定將什麼樣的信息記錄在捕捉結果中。需要在開始捕捉前設置。是第一層過濾器,防止日誌過大。
- 顯示過濾器:在捕捉結果中進行詳細查找。語法與捕獲過濾器不一樣
3. 捕獲過濾器
語法與tcpdump、Windump以及任何使用libpcap庫的程序一樣
這裏我只介紹顯示過濾器,捕獲過濾器在我的另一篇文章寫得很詳細:全面介紹Linux下tcpdump的使用
4.顯示過濾器基本數據類型
4.1 無符號整數與有符號整數
可以用10、8、16進製表示
ip.len le 1500 // 10進制
ip.len le 02734 // 8進制
ip.len le 0x5dc // 16進制
4.2 布爾值
協議對象的boolean域爲真當且僅當解碼後有該字段
例:
tcp.flags.syn
爲真當且僅當SYN標誌出現在TCP段中
4.3 以太網地址
用冒號(:),句號(.),橫槓(-)分隔,例:
eth.dst == ff:ff:ff:ff:ff:ff
eth.dst == ffff.ffff.ffff
eth.dst == ff-ff-ff-ff-ff-ff
4.4 IPv4地址
ip.addr == 192.168.0.1
或CIDR表示法
ip.addr == 129.111.0.0/16 // 過濾器將查找129.111 B類網絡中的所有數據包
4.5 IPv6地址
ipv6.addr == ::1
4.6文本字符串
http.request.uri == "https://www.wireshark.org/"
sip.To contains "a1762"
http.host matches "acme\.(org|com|net)"
5. 顯示過濾器
5.1 協議對象
protocol.attr.attr
wireshark自帶很多協議解碼器,打開搜索欄>表達式即可看到大量協議
5.2 比較運算符
C風格 | 英文 | 描述 |
---|---|---|
== | eq | |
!= | ne | 官方不推薦在eth.addr, ip.addr, tcp.port, udp.port上使用,因爲有bug |
< | lt | |
<= | le | |
> | gt | |
>= | ge | |
contains | 協議,字段或偏移包含值,sip.To contains “a1762” | |
matches | ~ | 協議或文本符合perl正則語法:http.host matches "acme.(org |
bitwise_and | & | 二進制與,比較二進制的值:tcp.flags & 0x02 |
5.3 結合運算符
英文格式 | C風格 | 描述 |
---|---|---|
and | && | |
or | || | |
xor | ^^ | 異或 |
not | ! | |
[] | 切片(偏移) | |
in | 成員運算符,存在於集合 | |
() | 括號內優先級更高 |
5.3.1 切片
- n:m n是起始偏移量,m是指定範圍的長度。
eth.src [0:3] == 00:00:83
- n-m n是起始偏移量,m是結束偏移量
eth.src [1-2] == 00:83
- :m 相當於0:m,即從序列的開頭到偏移量m
eth.src [:4] == 00:00:83:00
- n: 從偏移量n到序列末尾
eth.src [4:] == 20:20
- n 相當於n:1
eth.src [2] == 83
- 複合範圍:通過逗號分隔將單個範圍串在一起
eth.src [0:3,1-2,:4,4:,2] == 00:00:83:00:83:00:00:83:00:20:20:83
5.3.2 成員運算符(集合)
tcp.port in {80 443 8080}
// 等價於
tcp.port == 80 || tcp.port == 443 || tcp.port == 8080
- 集合範圍
tcp.port in {443 4430..4434}
// 等價於
tcp.port == 443 || (tcp.port >= 4430 && tcp.port <= 4434)
- 不僅限於數字,也可以使用其它類型
http.request.method in {"HEAD" "GET"}
ip.addr in {10.0.0.5 .. 10.0.0.9 192.168.1.1..192.168.1.9}
frame.time_delta in {10 .. 10.5}
5.4 字符串函數
函數 | 介紹 |
---|---|
upper | 轉換string爲大寫 |
lower | 轉換string爲小寫 |
len | 返回string或字節字段的字節長度,注意是按字節而不是字符(可能多字節) |
count | 返回字符串在幀(frame)中出現次數 |
string | 將非字符串轉換成字符串 |
例:
lower(http.server) contains "apache"
len(http.request.uri) > 100
5.5 正則表達式
採用perl的正則表達式語法
ip.dst_host matches "^172\.(1[6-9]|2[0-9]|3[0-1])\..{1,3}\.255"
6. 常見例子
- 顯示來自10.210網段的封包
ip.src == 10.210.0.0/16
- 顯示GET請求
http.request.method == “GET”
7. 附錄
7.1 參考資料
強烈推薦閱讀