Ubuntu 16.04 安裝 Wireshark
新增Wireshark源:
1
|
$ sudo add-apt-repository ppa:wireshark-dev/stable
|
安裝 wireshark:
1
2
|
$ sudo apt-get update
$ sudo apt-get install wireshark
|
是否允許普通使用者抓包:
過濾器
機器上的網路報文數量異常的多,很多時候我們只關係和具體問題有關的資料包(比如訪問某個網站的資料,或者 icmp 超時的報文等等),而這些資料只佔到很小的一部分。把所有的資料擷取下來,從裡面找到想要的資訊無疑是一件很費時費力的工作。而 tcpdump 提供了靈活的語法可以精確地擷取關心的資料包,簡化分析的工作量。這些選擇資料包的語句就是過濾器(filter)!
過濾器也可以簡單地分為三類:type
, dir
和 proto
。
Type
讓你區分報文的型別,主要由 host
(主機), net
(網路) 和 port
(埠) 組成。src
和 dst
也可以用來過濾報文的源地址和目的地址。
host: 過濾某個主機的資料包文
tcpdump host 1.2.3.4
src, dst: 過濾源地址和目的地址
tcpdump src 2.3.4.5
tcpdump dst 3.4.5.6
net: 過濾某個網段的資料,CIDR 模式
tcpdump net 1.2.3.0/24
proto: 過濾某個協議的資料,支援 tcp, udp 和 icmp。使用的時候可以省略 proto 關鍵字。
tcpdump icmp
port: 過濾通過某個埠的資料包
tcpdump port 3389
src/dst, port, protocol: 結合三者
tcpdump src port 1025 and tcp
tcpdump udp and src port 53
此外還有指定埠和資料包文範圍的過濾器:
port 範圍
tcpdump portrange 21-23
資料包大小,單位是位元組
tcpdump less 32
tcpdump greater 128
tcpdump > 32
tcpdump <= 128
過於過濾器的更多詳細資訊,請訪問 tcpdump 官方 map page 的 PCAP-FILTER 部分。
輸出到檔案
使用 tcpdump 擷取資料包文的時候,預設會列印到螢幕的預設輸出,你會看到按照順序和格式,很多的資料一行行快速閃過,根本來不及看清楚所有的內容。不過,tcpdump 提供了把擷取的資料儲存到檔案的功能,以便後面使用其他圖形工具(比如 wireshark,Snort)來分析。
-w
選項用來把資料包文輸出到檔案,比如下面的命令就是把所有 80 埠的資料匯入到檔案
# sudo tcpdump -w capture_file.pcap port 80
-r
可以讀取檔案裡的資料包文,顯示到螢幕上。
# tcpdump -nXr capture_file.pcap host web30
NOTE:儲存到檔案的資料不是螢幕上看到的檔案資訊,而是包含了額外資訊的固定格式 pcap,需要特殊的軟體來檢視,使用 vim 或者 cat 命令會出現亂碼。
強大的過濾器
過濾的真正強大之處在於你可以隨意組合它們,而連線它們的邏輯就是常用的 與/AND/&&
、 或/OR/||
和 非/not/!
。
源地址是 10.5.2.3,目的埠是 3389 的資料包
tcpdump -nnvS src 10.5.2.3 and dst port 3389
從 192.168 網段到 10 或者 172.16 網段的資料包
tcpdump -nvX src net 192.168.0.0/16 and dat net 10.0.0.0/8 or 172.16.0.0/16
從 Mars 或者 Pluto 發出的資料包,並且目的埠不是 22
tcpdump -vv src mars or pluto and not dat port 22
從上面的例子就可以看出,你可以隨意地組合之前的過濾器來擷取自己期望的資料包,最重要的就是知道自己要精確匹配的資料室怎樣的!
對於比較複雜的過濾器表示式,為了邏輯的清晰,可以使用括號。不過預設情況下,tcpdump 把 ()
當做特殊的字元,所以必須使用單引號 '
來消除歧義:
tcpdump -nvv -c 20 'src 10.0.2.4 and (dat port 3389 or 22)'
理解 tcpdump 的輸出
擷取資料只是第一步,第二步就是理解這些資料,下面就解釋一下 tcpdump 命令輸出各部分的意義。
21:27:06.995846 IP (tos 0x0, ttl 64, id 45646, offset 0, flags [DF], proto TCP (6), length 64)
192.168.1.106.56166 > 124.192.132.54.80: Flags [S], cksum 0xa730 (correct), seq 992042666, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 663433143 ecr 0,sackOK,eol], length 0
21:27:07.030487 IP (tos 0x0, ttl 51, id 0, offset 0, flags [DF], proto TCP (6), length 44)
124.192.132.54.80 > 192.168.1.106.56166: Flags [S.], cksum 0xedc0 (correct), seq 2147006684, ack 992042667, win 14600, options [mss 1440], length 0
21:27:07.030527 IP (tos 0x0, ttl 64, id 59119, offset 0, flags [DF], proto TCP (6), length 40)
192.168.1.106.56166 > 124.192.132.54.80: Flags [.], cksum 0x3e72 (correct), ack 2147006685, win 65535, length 0
最基本也是最重要的資訊就是資料包的源地址/埠和目的地址/埠,上面的例子第一條資料包中,源地址 ip 是 192.168.1.106
,源埠是 56166
,目的地址是 124.192.132.54
,目的埠是 80
。 >
符號代表資料的方向。
此外,上面的三條資料還是 tcp 協議的三次握手過程,第一條就是 SYN
報文,這個可以通過 Flags [S]
看出。下面是常見的 TCP 報文的 Flags:
[S]
: SYN(開始連線)[.]
: 沒有 Flag[P]
: PSH(推送資料)[F]
: FIN (結束連線)[R]
: RST(重置連線)
而第二條資料的 [S.]
表示 SYN-ACK
,就是 SYN
報文的應答報文。