Wireshark
Wireshark是擷取封包、分析封包最佳的工具,同樣類型的工具像是tcpdump、ipdump...等,其中Wireshark是圖形介面的。
抓寫封包時常常需要靠Wireshark來分析,所以Wireshark是一個非常重要的工具。
官方網站下載Wireshark,目前Wireshark為2.0.0版。
Wireshark上面的工具列,左邊四個最常使用,其他有需要看hint就知道幹嘛用的。
點選Option會列出所有可用的Interface,點選要使用的Interface就可以開始抓封包了。
抓取封包時我們只會對特定的封包感興趣,所以這邊要講過濾器啦,過濾器有兩種,Capture Filter
和Display Filter
。
Capture Filter
顧名思義就是在抓封包時的過濾器,所以被過濾掉的封包就不會顯示出來了。在核心層面是透過BPF(Berkeley Packet Filter)
來過濾封包,BPF使用的類似組合語言的過濾器語法,不過透過Wireshark(或tcpdump)就可以產生了。
Capture Filter Expression
Expression有三種保留字:
type
dir
proto
type
:類型包含了host
,net
和port
。比如:host 192.168.1.1、net 192.168.1.1/24、port 80,如果沒有指定預設為host。
dir
:方向可以有src
和dst
。例如:src www.google.com、dst net 120.125.86、src or dst port 22。
proto
:協定有ether
,fddi
,tr
,ip
,ip6
,arp
,rarp
,decnet
,icmp
,tcp
和udp
。例如:tcp port 22、udp dst port 53。
還有幾個保留字:
less
:小於等於多少bytes的封包。例如:less 60。
greater
:大於等於多少bytes的封包。例如:greater 1024。
!
或not
:取反結果。例如:!arp。
&&
或and
:且。例如:tcp port 80 && net 192.168.1。
||
或or
:或。例如:tcp or udp。
在icmp和tcp還有特別的保留字:
icmp協定有type
和code
,如果要擷取特定type
或code
可以這樣使用:
icmp[icmptype] == icmp-echoreply
icmp[icmpcode] == 0
其他icmp保留字還有:
icmp-echoreply
icmp-unreach
icmp-sourcequench
icmp-redirect
icmp-echo
icmp-routeradvert
icmp-routersolicit
icmp-timxceed
icmp-paramprob
icmp-tstamp
icmp-tstampreply
icmp-ireq
icmp-ireqreply
icmp-maskreq
icmp-maskreply
tcp則保留了flags,如果要只過濾出"包含"ACK標記可以使用:
tcp[tcpflags] & tcp-ack != 0
其他tcp保留字:
tcp-fin
tcp-syn
tcp-rst
tcp-push
tcp-ack
tcp-urg
如果這些還沒辦法滿足需求的話,可以用"算"的方式過濾封包,例如只要arp reply的封包:
arp[6:2] == 0x0002
中括號表示法:[第幾個byte:取幾個byte],以這個為例,要取從arp封包的第6個byte開始取2個byte的值,arp reply的值為0x0002,符合這個過濾器的封包即是arp reply的封包。
當然也可以不指定幾個byte,例如只要ip設定fragmented的flag:
ip[6] == 0x20
無線網路下,為隱藏的SSID:
wlan[36:2] == 0
也可以指定特定網卡,例如只要目的卡號為12:34:56:78:9a:bc
ether[0:4] == 0x12345678 && ether[4:2] == 0x9abc
因為指定bytes最多只能指定4個byte,但是網卡有6個byte,所以拆開成兩個表達式。
這樣的表示法只能用在固定欄位的表頭,像是一些變動大小的表頭就不太適用,像是IEEE 802.1x的封包,隱藏的SSID的欄位剛好還在固定的欄位,所以計算出來的結果正確,只要符合byte的封包都會擷取出來。
還有一些沒提到的保留字,這裡可以查
在這列出一些(我)常用的過濾器表達式
arp
not arp
udp or tcp
ip && tcp
ip6
#只要IPv6封包icmp
icmp[icmptype] == icmp-echo
icmp[icmpcode] == 0
port 53
not tcp port 22
#不要SSH封包host 192.168.1.1
dst host www.google.com
ether broadcast #地址為FF:FF:FF:FF:FF:FF
ip broadcast #地址為255.255.255.255
ether proto not 0x0800
#乙太下一層的類型不為0x0800(IPv4)tcp dst port 80
less 70
greater 100
net 192.168.1.0/24
tcp portrange 80-443
#port 範圍80到443not broadcast and not multicast
#不要廣播也不要群播tcp[tcpflags] & tcp-rst != 0
#TCP flags包含RSTtcp[tcpflags] == tcp-ack
#TCP flags為ACK(tcp[tcpflags] & tcp-syn != 0) || (udp dst port 53)
#TCP flags包含SYN或DNS封包
Display Filter
顯示用的過濾器表示法,是在抓取到封包後在顯示感興趣的封包,所以拿掉Disply Filter就可以還原,而Display Filter數量非常多,點選Display Filter
旁邊的Expression...
,就可以顯示全部來查詢。
不過數量太多了,有個比較方便的方法,例如現在對HTTP POST封包有興趣,所以隨便找到一個HTTP封包,對method那個欄位右鍵->Copy->As Filter
。
過濾器為:
http.request.method == "GET"
改成:
http.request.method == "POST"
這樣就是HTTP的POST封包啦~
Search Packet
有時候要從封包內容找尋特定的資料或是字串,那這邊就來講怎麼搜尋字串,Edit->Find Packet...
。
接著會多出一個bar,最左邊選擇要搜尋的範圍,我們要搜尋字串,右邊選擇String
,左邊就可以選擇Packet bytes
了,也可以依照需求搜尋特定資料。
Layout
整體的排版可以修改成自己想要的樣子。
到Preferences...->Appearance->Layout
可以設定成自己想要的排版。