Wireshark

Wireshark是擷取封包、分析封包最佳的工具,同樣類型的工具像是tcpdump、ipdump...等,其中Wireshark是圖形介面的。

抓寫封包時常常需要靠Wireshark來分析,所以Wireshark是一個非常重要的工具。

官方網站下載Wireshark,目前Wireshark為2.0.0版。

Wireshark上面的工具列,左邊四個最常使用,其他有需要看hint就知道幹嘛用的。

點選Option會列出所有可用的Interface,點選要使用的Interface就可以開始抓封包了。

抓取封包時我們只會對特定的封包感興趣,所以這邊要講過濾器啦,過濾器有兩種,Capture FilterDisplay Filter

Capture Filter

顧名思義就是在抓封包時的過濾器,所以被過濾掉的封包就不會顯示出來了。在核心層面是透過BPF(Berkeley Packet Filter)來過濾封包,BPF使用的類似組合語言的過濾器語法,不過透過Wireshark(或tcpdump)就可以產生了。

Capture Filter Expression

Expression有三種保留字:

  1. type
  2. dir
  3. proto

type:類型包含了hostnetport。比如:host 192.168.1.1、net 192.168.1.1/24、port 80,如果沒有指定預設為host。

dir:方向可以有srcdst。例如:src www.google.com、dst net 120.125.86、src or dst port 22。

proto:協定有etherfdditripip6arprarpdecneticmptcpudp。例如: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協定有typecode,如果要擷取特定typecode可以這樣使用:

  1. icmp[icmptype] == icmp-echoreply
  2. 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到443
  • not broadcast and not multicast #不要廣播也不要群播
  • tcp[tcpflags] & tcp-rst != 0 #TCP flags包含RST
  • tcp[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可以設定成自己想要的排版。

results matching ""

    No results matching ""