使用Wireshark時最多見的問題,是當您使用默認設置時,會獲得大量冗餘信息,以致於很難找到本身須要的部分。這就是爲何過濾器會如此重要。它們能夠幫助咱們在龐雜的結果中迅速找到咱們須要的信息。兩種過濾器:
捕捉過濾器--用於決定將什麼樣的信息記錄在捕捉結果中。須要在開始捕捉前設置。
顯示過濾器--在捕捉結果中進行詳細查找。他們能夠在獲得捕捉結果後隨意修改。程序員
兩種過濾器的目的是不一樣的。捕捉過濾器是數據通過的第一層過濾器,它用於控制捕捉數據的數量,以免產生過大的日誌文件。顯示過濾器是一種更爲強大(複雜)的過濾器。它容許您在日誌文件中迅速準確地找到所須要的記錄。兩種過濾器使用的語法是徹底不一樣的。咱們將在接下來的幾頁中對它們進行介紹:express
一、捕捉過濾器
捕捉過濾器的語法與其它使用Lipcap(Linux)或者Winpcap(Windows)庫開發的軟件同樣,好比著名的TCPdump。捕捉過濾器必須在開始捕捉前設置完畢,這一點跟顯示過濾器是不一樣的。設置捕捉過濾器的步驟是:
- 選擇 capture -> options。
- 填寫"capture filter"欄或者點擊"capture filter"按鈕爲您的過濾器起一個名字並保存,以便在從此的捕捉中繼續使用這個過濾器。
- 點擊開始(Start)進行捕捉。
網絡
語法: Protocol Direction Host(s) Value Logical Operations Other expressiontcp
例子: tcp dst 10.1.1.1 80 and tcp dst 10.2.2.2 3128工具
Protocol(協議):
可能的值:ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp and udp。若是沒有特別指明是什麼協議,則默認使用全部支持的協議。
Direction(方向):
可能的值: src, dst, src and dst, src or dst。若是沒有特別指明來源或目的地,則默認使用 "src or dst" 做爲關鍵字。例如,"host 10.2.2.2"與"src or dst host 10.2.2.2"是同樣的。
Host(s):
可能的值: net, port, host, portrange。若是沒有指定此值,則默認使用"host"關鍵字。例如,"src 10.1.1.1"與"src host 10.1.1.1"相同。
Logical Operations(邏輯運算):
可能的值:not, and, or。否("not")具備最高的優先級。或("or")和與("and")具備相同的優先級,運算時從左至右進行。例如:網站
"not tcp port 3128 and tcp port 23"與"(not tcp port 3128) and tcp port23"相同。
"not tcp port 3128 and tcp port 23"與"not (tcp port 3128 and tcp port23)"不一樣。 3d
實例:日誌
tcp dst port 3128blog
顯示目的TCP端口爲3128的封包。dns
ip src host 10.1.1.1
顯示來源IP地址爲10.1.1.1的封包。
host 10.1.2.3
顯示目的或來源IP地址爲10.1.2.3的封包。
src portrange 2000-2500
顯示來源爲UDP或TCP,而且端口號在2000至2500範圍內的封包。
not imcp
顯示除了icmp之外的全部封包。(icmp一般被ping工具使用)
src host 10.7.2.12 and not dst net 10.200.0.0/16
顯示來源IP地址爲10.7.2.12,但目的地不是10.200.0.0/16的封包。
(src host 10.4.1.12 or src net 10.6.0.0/16) and tcp dst portrange 200-10000 and dst net 10.0.0.0/8
顯示來源IP爲10.4.1.12或者來源網絡爲10.6.0.0/16,目的地TCP端口號在200至10000之間,而且目的位於網絡10.0.0.0/8內的全部封包。
注意事項:
1)當使用關鍵字做爲值時,需使用反斜槓「\」。
2)"ether proto \ip" (與關鍵字"ip"相同).
3)這樣寫將會以IP協議做爲目標。
4)"ip proto \icmp" (與關鍵字"icmp"相同).
5)這樣寫將會以ping工具經常使用的icmp做爲目標。
6)能夠在"ip"或"ether"後面使用"multicast"及"broadcast"關鍵字。
7)當您想排除廣播請求時,"no broadcast"就會很是有用。
二、顯示過濾器
一般通過捕捉過濾器過濾後的數據仍是很複雜。此時您可使用顯示過濾器進行更加細緻的查找。 它的功能比捕捉過濾器更爲強大,並且在您想修改過濾器條件時,並不須要從新捕捉一次。
語法: Protocol String1 String2 Comparison operator Value Logical Operations Other expression
例子:ftp passive ip == 10.2.3.4 xor icmp.type
Protocol(協議):
您可使用大量位於OSI模型第2至7層的協議。點擊"Expression..."按鈕後,您能夠看到它們。 好比:IP,TCP,DNS,SSH
您一樣能夠在以下所示位置找到所支持的協議:(Wireshark的網站提供了對各類 協議以及它們子類的說明)
String1, String2 (可選項):
協議的子類。
點擊相關父類旁的"+"號,而後選擇其子類。
Comparison operators (比較運算符):
可使用6種比較運算符:
----------------------------------
英文寫法 C語言寫法 含義
----------------------------------
eq == 等於
ne != 不等於
gt > 大於
lt < 小於
ge >= 大於等於
le <= 小於等於
----------------------------------
Logical expressions(邏輯運算符):
-----------------------------------
英文寫法 C語言寫法 含義
----------------------------------
and && 邏輯與
or || 邏輯或
xor ^^ 邏輯異或
not ! 邏輯非
---------------------------------
被程序員們熟知的邏輯異或是一種排除性的或。當其被用在過濾器的兩個條件之間時,只有當且僅當其中的一個條件知足時,這樣的結果纔會被顯示在屏幕上。 舉個例子:
"tcp.dstport 80 xor tcp.dstport 1025" 只有當目的TCP端口爲80或者來源於端口1025(但又不能同時知足這兩點)時,這樣的封包纔會被顯示。
實例:
snmp || dns || icmp
顯示SNMP或DNS或ICMP封包。
ip.addr == 10.1.1.1
顯示來源或目的IP地址爲10.1.1.1的封包。
ip.src != 10.1.2.3 or ip.dst != 10.4.5.6
顯示來源不爲10.1.2.3或者目的不爲10.4.5.6的封包。 換句話說,顯示的封包將會爲: 來源IP:除了10.1.2.3之外任意;目的IP:任意 以及 來源IP:任意;目的IP:除了10.4.5.6之外任意。
ip.src != 10.1.2.3 and ip.dst != 10.4.5.6
顯示來源不爲10.1.2.3而且目的IP不爲10.4.5.6的封包。 換句話說,顯示的封包將會爲: 來源IP:除了10.1.2.3之外任意;同時須知足,目的IP:除了10.4.5.6之外任意
tcp.port == 25
顯示來源或目的TCP端口號爲25的封包。
tcp.dstport == 25
顯示目的TCP端口號爲25的封包。
tcp.flags
顯示包含TCP標誌的封包。
tcp.flags.syn == 0x02
顯示包含TCP SYN標誌的封包。
注意事項:
若是過濾器的語法是正確的,表達式的背景呈綠色。若是呈紅色,說明表達式有誤。
表達式正確
表達式錯誤
三、實用過濾
1)過濾IP,如來源IP或者目標IP等於某個IP
例子:ip.src eq 192.168.1.107 or ip.dst eq 192.168.1.107
或者 ip.addr eq 192.168.1.107 // 都能顯示來源IP和目標IP
2)過濾端口
例子:
tcp.port eq 80 //無論端口是來源的仍是目標的都顯示
tcp.port == 80
tcp.port eq 2722
tcp.port eq 80 or udp.port eq 80
tcp.dstport == 80 //只顯tcp協議的目標端口80
tcp.srcport == 80 //只顯tcp協議的來源端口80
udp.port eq 15000
tcp.port >= 1 and tcp.port <= 80 //過濾端口範圍
3)過濾協議
例子:tcp udp arp icmp http smtp ftp dns msnms ip ssl oicq bootp等等
如排除arp包:!arp 或者 not arp
4)過濾MAC
太以網頭過濾
eth.dst == A0:00:00:04:C5:84 //過濾目標mac
eth.src eq A0:00:00:04:C5:84 //過濾來源mac
eth.dst==A0:00:00:04:C5:84
eth.dst==A0-00-00-04-C5-84
eth.addr eq A0:00:00:04:C5:84 //過濾來源MAC和目標MAC都等於A0:00:00:04:C5:84的
5)包長度過濾
例子:
udp.length == 26 這個長度是指udp自己固定長度8加上udp下面那塊數據包之和
tcp.len >= 7 指的是ip數據包(tcp下面那塊數據),不包括tcp自己
ip.len == 94 除了以太網頭固定長度14,其它都算是ip.len,即從ip自己到最後
frame.len == 119 整個數據包長度,從eth開始到最後
eth ---> ip or arp ---> tcp or udp ---> data
6)http模式過濾
例子:
http.request.method == "GET"
http.request.method == "POST"
http.request.uri == "/img/logo-edu.gif"
http contains "GET"
http contains "HTTP/1."
// GET包
http.request.method == "GET" && http contains "Host: "
http.request.method == "GET" && http contains "User-Agent: "
// POST包
http.request.method == "POST" && http contains "Host: "
http.request.method == "POST" && http contains "User-Agent: "
// 響應包
http contains "HTTP/1.1 200 OK" && http contains "Content-Type: "
http contains "HTTP/1.0 200 OK" && http contains "Content-Type: "
7)TCP參數過濾
tcp.flags 顯示包含TCP標誌的封包。
tcp.flags.syn == 0x02 顯示包含TCP SYN標誌的封包。
tcp.window_size == 0 && tcp.flags.reset != 1
8)過濾內容
tcp[20]表示從20開始,取1個字符
tcp[20:]表示從20開始,取1個字符以上
tcp[20:8]表示從20開始,取8個字符
tcp[offset,n]
udp[8:3]==81:60:03 //偏移8個bytes,再取3個數,是否與==後面的數據相等?
udp[8:1]==32 //若是我猜的沒有錯的話,應該是udp[offset:截取個數]=nValue
eth.addr[0:3]==00:06:5B
例子:
判斷upd下面那塊數據包前三個是否等於0x20 0x21 0x22(咱們都知道udp固定長度爲8)
udp[8:3]==20:21:22
判斷tcp那塊數據包前三個是否等於0x20 0x21 0x22(tcp通常狀況下,長度爲20,但也有不是20的時候)
tcp[8:3]==20:21:22
若是想獲得最準確的,應該先知道tcp長度
9)matches(匹配)和contains(包含某字符串)語法
ip.src==192.168.1.107 and udp[8:5] matches "\\x02\\x12\\x21\\x00\\x22"
ip.src==192.168.1.107 and udp contains 02:12:21:00:22
ip.src==192.168.1.107 and tcp contains "GET"
udp contains 7c:7c:7d:7d 匹配payload中含有0x7c7c7d7d的UDP數據包,不必定是從第一字節匹配。
例子:
獲得本地qq登錄數據包(判斷條件是第一個包==0x02,第四和第五個包等於0x00x22,最後一個包等於0x03):0x02 xx xx 0x00 0x22 ... 0x03
正確
oicq and udp[8:] matches "^\\x02[\\x00-\\xff][\\x00-\\xff]\\x00\\x22[\\x00-\\xff]+\\x03$"
oicq and udp[8:] matches "^\\x02[\\x00-\\xff]{2}\\x00\\x22[\\x00-\\xff]+\\x03$" // 登錄包
oicq and (udp[8:] matches "^\\x02[\\x00-\\xff]{2}\\x03$" or tcp[8:] matches "^\\x02[\\x00-\\xff]{2}\\x03$")
oicq and (udp[8:] matches "^\\x02[\\x00-\\xff]{2}\\x00\\x22[\\x00-\\xff]+\\x03$" or tcp[20:] matches "^\\x02[\\x00-\\xff]{2}\\x00\\x22[\\x00-\\xff]+\\x03$")
不僅僅是00:22纔有QQ號碼,其它的包也有,要知足下面條件(tcp也有,但沒有作):
oicq and udp[8:] matches "^\\x02[\\x00-\\xff]+\\x03$" and !(udp[11:2]==00:00) and !(udp[11:2]==00:80)
oicq and udp[8:] matches "^\\x02[\\x00-\\xff]+\\x03$" and !(udp[11:2]==00:00) and !(udp[15:4]==00:00:00:00)
說明:
udp[15:4]==00:00:00:00 表示QQ號碼爲空
udp[11:2]==00:00 表示命令編號爲00:00
udp[11:2]==00:80 表示命令編號爲00:80
當命令編號爲00:80時,QQ號碼爲00:00:00:00
附錄
本機過濾過濾:http&&!(udp.dstport == 1900)&&!(tcp.port == 1900)