tcpdump及wireshark介紹

1,tcpdump

tcpdump採用命令行方式對接口的數據包進行篩選抓取,其豐富特性表現在靈活的表達式上。
不帶任何選項的tcpdump,默認會抓取第一個網絡接口,且只有將tcpdump進程終止纔會停止抓包

1.1, tcpdump基本選項

它的命令格式爲:

tcpdump [ -DenNqvX ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ]
        [ -s snaplen ] [ -w file ] [ expression ]

抓包選項:
-c:指定要抓取的包數量。注意,是最終要獲取這麼多個包。例如,指定"-c 10"將獲取10個包,但可能已經處理了100個包,只不過只有10個包是滿足條件的包。
-i interface:指定tcpdump需要監聽的接口。若未指定該選項,將從系統接口列表中搜尋編號最小的已配置好的接口(不包括loopback接口,要抓取loopback接口使用tcpdump -i lo),
            :一旦找到第一個符合條件的接口,搜尋馬上結束。可以使用'any'關鍵字表示所有網絡接口。
-n:對地址以數字方式顯式,否則顯式爲主機名,也就是說-n選項不做主機名解析。
-nn:除了-n的作用外,還把端口顯示爲數值,否則顯示端口服務名。
-N:不打印出host的域名部分。例如tcpdump將會打印'nic'而不是'nic.ddn.mil'。
-P:指定要抓取的包是流入還是流出的包。可以給定的值爲"in"、"out"和"inout",默認爲"inout"。
-s len:設置tcpdump的數據包抓取長度爲len,如果不設置默認將會是65535字節。對於要抓取的數據包較大時,長度設置不夠可能會產生包截斷,若出現包截斷,
      :輸出行中會出現"[|proto]"的標誌(proto實際會顯示爲協議名)。但是抓取len越長,包的處理時間越長,並且會減少tcpdump可緩存的數據包的數量,
      :從而會導致數據包的丟失,所以在能抓取我們想要的包的前提下,抓取長度越小越好。

輸出選項:
-e:輸出的每行中都將包括數據鏈路層頭部信息,例如源MAC和目標MAC。
-q:快速打印輸出。即打印很少的協議相關信息,從而輸出行都比較簡短。
-X:輸出包的頭部數據,會以16進制和ASCII兩種方式同時輸出。
-XX:輸出包的頭部數據,會以16進制和ASCII兩種方式同時輸出,更詳細。
-v:當分析和打印的時候,產生詳細的輸出。
-vv:產生比-v更詳細的輸出。
-vvv:產生比-vv更詳細的輸出。

其他功能性選項:
-D:列出可用於抓包的接口。將會列出接口的數值編號和接口名,它們都可以用於"-i"後。
-F:從文件中讀取抓包的表達式。若使用該選項,則命令行中給定的其他表達式都將失效。
-w:將抓包數據輸出到文件中而不是標準輸出。可以同時配合"-G time"選項使得輸出文件每time秒就自動切換到另一個文件。可通過"-r"選項載入這些文件以進行分析和打印。
-r:從給定的數據包文件中讀取數據。使用"-"表示從標準輸入中讀取。

所以常用的選項也就這幾個:
tcpdump -D
tcpdump -c num -i eth -nn -XX -vvv

1.2, tcpdump過濾條件

1:過濾主機
// 抓取所有經過enp0s3,目的或源地址是 192.168.1.101 的網絡數據
tcpdump -i enp0s3 host 192.168.1.101 

// 指定源地址
tcpdump -i enp0s3 src host 192.168.1.101

// 指定目的地址
tcpdump -i enp0s3 dst host 192.168.1.101

//如果想要獲取主機192.168.1.101除了和主機192.168.1.102之外所有主機通信的ip包
tcpdump ip host 192.168.1.101 and !192.168.1.102

2:過濾端口
// 抓取所有經過 enp0s3,目的或源端口是22的網絡數據
tcpdump -i enp0s3 port 22

// 指定源端口
tcpdump -i enp0s3 src port 22

// 指定目的端口
tcpdump -i enp0s3 dst port 22
 
3:網絡過濾
tcpdump -i enp0s3 net 192.168
tcpdump -i enp0s3 src net 192.168
tcpdump -i enp0s3 dst net 192.168
 
4:協議過濾
tcpdump -i enp0s3 arp
tcpdump -i enp0s3 ip
tcpdump -i enp0s3 tcp
tcpdump -i enp0s3 udp
tcpdump -i enp0s3 icmp

5:常用表達式

非 : ! or "not" (without the quotes)
且 : && or "and"
或 : || or "or"

// 抓取目的地址是192.168.1.254或192.168.1.200端口是80的TCP數據
tcpdump -i enp0s3 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))'

// 抓取目標MAC地址是00:01:02:03:04:05的ICMP數據
tcpdump  '((icmp) and ((ether dst host 00:01:02:03:04:05)))'

// 抓取目的網絡是192.168,但目的主機不是192.168.1.200的TCP數據
tcpdump  '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'

1.3, tcpdump抓包示例

[root@server2 ~]# tcpdump -c 2 -q -XX -vvv -nn -i eth0 tcp dst port 22
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:15:54.788812 IP (tos 0x0, ttl 64, id 19303, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.100.1.5788 > 192.168.100.62.22: tcp 0
        0x0000:  000c 2908 9234 0050 56c0 0008 0800 4500  ..)..4.PV.....E.
        0x0010:  0028 4b67 4000 4006 a5d8 c0a8 6401 c0a8  .(Kg@[email protected]...
        0x0020:  643e 169c 0016 2426 5fd6 1fec 2b62 5010  d>....$&_...+bP.
        0x0030:  0803 7844 0000 0000 0000 0000            ..xD........
12:15:54.842641 IP (tos 0x0, ttl 64, id 19304, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.100.1.5788 > 192.168.100.62.22: tcp 0
        0x0000:  000c 2908 9234 0050 56c0 0008 0800 4500  ..)..4.PV.....E.
        0x0010:  0028 4b68 4000 4006 a5d7 c0a8 6401 c0a8  .(Kh@[email protected]...
        0x0020:  643e 169c 0016 2426 5fd6 1fec 2d62 5010  d>....$&_...-bP.
        0x0030:  0801 7646 0000 0000 0000 0000            ..vF........
2 packets captured
2 packets received by filter
0 packets dropped by kernel

MAC包頭佔有14字節,即:
000c 2908 9234 :目的mac
0050 56c0 0008 :源mac
0800:type是ipv4

IP包頭佔有20個字節,即:
4500:4代表ipv4,5說明IP頭長20字節,00爲服務類型
0028 :IP數據報文總長40字節,包含頭部以及數據
4b68 :唯一地標識主機發送的每一份數據報
4000 :第2,3個bit是兩個標誌DF和MF,後5個是Fragment Offset
4006 :40代表TTL=64,06爲tcp協議
a5d7 :checksum
c0a8 6401 :源ip是192.168.100.1
c0a8 643e:目的ip是192.168.100.62

TCP包頭佔有20個字節,即:
169c :本地端口號5788
0016:目的端口號22
2426 5fd6 :順序號(Sequence Number),簡寫爲SEQ
1fec 2d62 :確認號(Acknowledgment Number),簡寫爲ACKNUM
5010:5代表tcp頭長20字節,最後6bit分別是URG,ACK, PSH,RST,SYN,FIN
0801 :窗口值,用來控制實現流量控制
7646:檢驗和,TCP的檢驗和是強制的
0000:緊急指針

1.4, tcpdump高級過濾包頭

proto[x:y] : 過濾從x字節開始的y字節數。比如ip[2:2]過濾出3、4字節(第一字節從0開始)

當然,前提是必須瞭解tcp/ip包頭的頭部信息。TCP/IP協議棧中各層包頭的介紹:
https://blog.csdn.net/qq_15437629/article/details/79560742

1,一般的IP頭是20字節,但IP頭有選項設置,不能直接從偏移21字節處讀取數據。IP頭有個長度字段可以知道頭長度是否大於20字節。通常第一個字節的二進制值是:01000101,分成兩個部分:
0100 = 4 表示IP版本; 0101 = 5 表示IP頭32 bit的塊數,5 x 32 bits = 160 bits or 20 bytes。如果第一字節第二部分的值大於5,那麼表示頭有IP選項:

tcpdump  'ip[0] & 0x0f > 5'

2,分片標記 -Exercise: Is DF bit (don’t fragment) set?

當發送端的MTU大於到目的路徑鏈路上的MTU時就會被分片,分片信息在IP頭的第七和第八字節:

Bit 0: 保留,必須是0
Bit 1: (DF) 0 = 可能分片, 1 = 不分片
Bit 2: (MF) 0 = 最後的分片, 1 = 還有分片
Fragment Offset字段只有在分片的時候才使用。
要抓帶DF位標記的不分片的包,第七字節的值應該是: 64

tcpdump  'ip[6] = 64'

// 匹配分片(包括最後分片)
tcpdump  '((ip[6:2] > 0) and (not ip[6] = 64))'

3,匹配TCP數據包的特殊標記

TCP標記定義在TCP頭的第十四個字節


+-+-+-+-+-+-+-+-+
|C|E|U|A|P|R|S|F|
|W|C|R|C|S|S|Y|I|
|R|E|G|K|H|T|N|N|
+-+-+-+-+-+-+-+-+
TCP 3次握手中過程如下:
1、源端發送 SYN
2、目標端口應答 SYN,ACK
3、源端發送 ACK

// 只抓取SYN包,第十四字節是二進制的00000010,也就是十進制的2
tcpdump 'tcp[13] = 2'

// 抓取 SYN,ACK  (00010010 or 18)
tcpdump 'tcp[13] = 18'

//  抓取SYN或者SYN-ACK
tcpdump 'tcp[13] & 2 = 2'

2,wireshark分析數據包

Wireshark是一款最流行和強大的開源數據包抓包與分析工具,使用tcpdump命令抓包保存pcap文件即可用wireshark打開分析。

在這裏插入圖片描述
上圖中標出三塊區域,紅色框內,是用來顯示簡單的數據包信息,我們用tcpdump抓包如時候,默認情況是顯示成這樣的;深藍框內,是用來顯示選中的數據包的詳細信息,是按照TCP/IP四層結構顯示的,第一行是數據鏈路層的信息,第二行是網絡層信息(IP協議),第三行是傳輸層信息(TCP協議),第四層是應用層信息(HTTP協議),可以展開第一行用來觀察具體的內容;最後一個區域淡藍色框中,是用來顯示此數據包的真實面目。

下面列舉一些常用的過濾規則:

過濾IP 
ip.src==192.168.1.102 or ip.dst==192.168.1.102 

過濾端口 
tcp.dstport == 80 // 只顯tcp協議的目標端口80 
tcp.srcport == 80 // 只顯tcp協議的來源端口80 
也可以寫成tcp.port eq 80 or udp.port eq 80 這樣的模式

過濾協議 
單獨寫上tcp、udp、xml、http就可以過濾出具體協議的報文。你也可以用tcp or xml這樣格式來過濾。 
我們還可以更加具體過濾協議的內容,如tcp.flags.syn == 0x02 表示顯示包含TCP SYN標誌的封包。

過濾mac地址 
eth.src eq A0:00:00:04:C5:84 // 過濾來源mac地址 
eth.dst==A0:00:00:04:C5:84 // 過濾目的mac地址

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: “

過濾內容 
contains:包含某字符串 
ip.src==192.168.1.107 and udp contains 02:12:21:00:22 
ip.src==192.168.1.107 and tcp contains “GET” 

下面介紹一些常見的場景:

2.1,tcp三次握手

在這裏插入圖片描述
從圖可知,連接建立伊始,客戶機發了3個SYN報文,這也許是爲了更快建立連接(假設有個請求報文段丟失,也不至於要等一段時間,重發報文)。接下來分析TCP連接建立過程:

  1. 客戶端通過TCP首部發送一個SYN包請求,seq =0
  2. 服務器發送ACK(=SYN+1)包確認應答,併發送SYN包請求連接,seq=0,ack=1
  3. 客戶端針對SYN包發送ACK包確認應答,ack=1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章