tcpdump抓包分析TCP三次握手過程
一、 tcpdump使用
1、首先看下MAN手冊
TCPDUMP(8)
NAME
tcpdump - dump traffic on a network
SYNOPSIS
tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ]
[ -C file_size ] [ -F file ]
[ -i interface ] [ -m module ] [ -M secret ]
[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ]
[ -E spi@ipaddr algo:secret,... ]
[ -y datalinktype ] [ -Z user ]
[ expression ]
選項:
-A 以ASCII碼顯示消息包
-c 指定包個數
-C 配合-w,當寫入文件時,先檢查文件大小是否已經超過1M,若超過,生成新文件,文件名爲指定文件名加後綴1。
-d 將匹配信息包的代碼以人們能夠理解的彙編格式給出
-dd 將匹配信息包的代碼以c語言程序段的格式給出
-ddd 將匹配信息包的代碼以十進制的形式給出。
-D 列出可以抓包的所有網絡接口
-e 顯示鏈路層內容
-f 外部的IP以數字方式顯示
-i 指定網絡接口
-l 使標準輸出變爲緩衝行形式
-n IP,端口用數字方式顯示
-t 在輸出的每一行不打印時間戳;
-v 輸出一個稍微詳細的信息,例如在ip包中可以包括ttl和服務類型的信息;
-vv 輸出詳細的報文信息;
-c 在收到指定的包的數目後,tcpdump就會停止;
-F 從指定的文件中讀取表達式,忽略其它的表達式;
-i 指定監聽的網絡接口;
-r 從指定的文件中讀取包(這些包一般通過-w選項產生);
-w 直接將包寫入文件中,並不分析和打印出來;
-T 將監聽到的包直接解釋爲指定的類型的報文,常見的類型有rpc (遠程過程調用)和snmp(簡單網絡管理協議;)
-x 讓十六進制顯示包內容
2、過濾
(1)指定接口(-i)
如:tcpdump -i eth0
(2)指定IP地址(host),可以輔加and , or ,!等邏輯符,以及src,dest等表示方向。
如:tcpdump host 192.168.1.23 捕獲192.168.1.23發出或者收到的包
tcpdump -A host 192.168.1.90 and \( 192.168.1.104 or 192.168.1.105 \) 捕獲192.168.1.23與192.168.1.104或者192.168.1.105之間往來的包
tcpdump host ! 192.168.1.23 捕獲除192.168.1.23以外所有主機的包
tcpdump -A src 192.168.1.90 and dst 192.168.1.104 指定從90發往104的包
(3)指定端口(port)
如:tcpdump port 80 指定捕獲80端口的包
(4)指定協議( 協議包括:ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp and udp)
如:tcpdump tcp 指定捕獲TCP包
(5)其它(gateway, broadcast, less, greater)
如:tcpdump broadcast 所有廣播包
二、三次握手過程分析
用netstat -an | grep LISTEN看一下,當前主機正在監聽的端口,使用另一臺機telnet過來,不輸入任何內容,進行抓包。
我們這裏以6000爲例
tcpdump port 6000 -c 3 -n
內容如下:
21:07:17.790296 IP 192.168.1.104.2511 > 192.168.1.90.6000: S 3359422806:3359422806(0) win 64240 <mss1460,nop,nop,sackOK>
21:07:17.790317 IP 192.168.1.90.6000 > 192.168.1.104.2511: S 3675079922:3675079922(0) ack 3359422807 win5840 <mss 1460,nop,nop,sackOK>
21:07:17.790675 IP 192.168.1.104.2511 > 192.168.1.90.6000: . ack 1 win 64240
我們來對第一個包進行分析:
21:07:17(時間).
790296(ID號)
IP (協議)
192.168.1.104.2511 > 192.168.1.90.6000: (源IP,端口,目的IP,端口)中間>表示方向
S (表示爲SYN包,即發起連接包
緊急指針— URG
確認序號有效—ACK
接收方應該儘快將這個報文段交給應用層—PSH
重建連接—RST
同步序號用來發起一個連接—SYN
發端完成發送任務—IN
)
3359422806:3359422806(0) (IP包序號,相對序號爲0)
win 64240 (數據窗口大小,告訴對方本機接收窗口大小,windows下默認爲64240,可通過setsockopt動態修改,同樣可以通過修改註冊表項(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters的 TCPWindowSize)來更改默認值)
<mss1460,nop,nop,sackOK> 對應TCP包頭中的選項字段
MSS: Maxitum Segment Size 最大分段大小,MSS表示TCP傳往另一端的最大塊數據的長度。當一個連接建立時,連接的雙方都要通告各自的MSS。如果一方不接收來自另一方的MSS值,則MSS就定爲默認的536字節。
以上三個包正好是TCP連接的三次握手過程:
(1) A主機發送序號爲3359422806的SYN包到B,同時帶有自身的WIN和MSS大小。
(2) B主機收到後,發送SYN+ACK的返回包到A,也帶自身的WIN和MSS大小,3675079922,同時爲爲上一個包的應答包3359422807。
(3) A主機返回ACK,包序號爲1(相對序號,如果需要看絕對序號,可以在tcpdump命令中加-S)
然後我們再來分析一下包的具體內容:
我們在tcpdump命令中加-x選項,後可得到如下內容:
22:07:13.436638 IP 192.168.1.104.2799 > 192.168.1.90.6000: S 3480877812:3480877812(0) win 64240 <mss 1460,nop,nop,sackOK>
0x0000: 4500 0030 b195 4000 8006 c51f c0a8 0168
0x0010: c0a8 015a 0aef 1770 cf79 faf4 0000 0000
0x0020: 7002 faf0 174e 0000 0204 05b4 0101 0402
22:07:13.436675 IP 192.168.1.90.6000 > 192.168.1.104.2799: S 4226616929:4226616929(0) ack 3480877813 win 5840 <mss 1460,nop,nop,sackOK>
0x0000: 4500 0030 0000 4000 4006 b6b5 c0a8 015a
0x0010: c0a8 0168 1770 0aef fbed 0e61 cf79 faf5
0x0020: 7012 16d0 f10e 0000 0204 05b4 0101 0402
22:07:13.437019 IP 192.168.1.104.2799 > 192.168.1.90.6000: . ack 1 win 64240
0x0000: 4500 0028 b196 4000 8006 c526 c0a8 0168
0x0010: c0a8 015a 0aef 1770 cf79 faf5 fbed 0e62
0x0020: 5010 faf0 39b2 0000
還是一樣,我們對第一個包進行分析,第一個包爲SYN包,應該爲一個空包,即只包括IP頭和TCP頭。
IP包頭
4 - IP版本號 IPV4
5 - IP包頭長度 5個32字節
00 - TOS (000 0000 0)前三個BIT優先權,現已忽略;4 bit的TOS分別代表:最小時延、最大吞吐量、最高可靠性和最小費用, 均爲0表示一般服務;最後1BIT未用。
0030 -總長度,48個字節
b195 -包唯一標識
4000 -標誌字段,和片偏移,用於分片
80 - TTL(128)
06 - 協議 TCP
c51f - MAC
c0a8 0168 - SRC IP,可以inet_ntoa轉換成點號分隔的IP。
c0a8 015a - DST IP
TCP包頭
0aef -源端口,十進制爲2799
1770 -目的端口,十進制爲6000
cf79 faf4 包序號,十進制爲217554863
0000 0000 確認序號,0,未設置ACK,確認序號無效
7002 -TCP包頭長度,標誌位。(0111 000000 000010)前4bitTCP長度7個32BIT,中間6bit保留,後6bit爲標誌位(URG, ACK,PSH, RST, SYN, FIN),可以看出設置了倒數第二位,SYN位。
faf0 - 窗口大小,十進制爲64240
174e - 校驗和,覆蓋了整個的 T C P報文段: T C P首部和T C P數據
0000 - 緊急指針, 只有當URG標誌置1時緊急指針纔有效
0204 05b4 0101 0402 - 選項字段,8個字節
1、首先看下MAN手冊
TCPDUMP(8)
NAME
tcpdump - dump traffic on a network
SYNOPSIS
tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ]
[ -C file_size ] [ -F file ]
[ -i interface ] [ -m module ] [ -M secret ]
[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ]
[ -E spi@ipaddr algo:secret,... ]
[ -y datalinktype ] [ -Z user ]
[ expression ]
選項:
-A 以ASCII碼顯示消息包
-c 指定包個數
-C 配合-w,當寫入文件時,先檢查文件大小是否已經超過1M,若超過,生成新文件,文件名爲指定文件名加後綴1。
-d 將匹配信息包的代碼以人們能夠理解的彙編格式給出
-dd 將匹配信息包的代碼以c語言程序段的格式給出
-ddd 將匹配信息包的代碼以十進制的形式給出。
-D 列出可以抓包的所有網絡接口
-e 顯示鏈路層內容
-f 外部的IP以數字方式顯示
-i 指定網絡接口
-l 使標準輸出變爲緩衝行形式
-n IP,端口用數字方式顯示
-t 在輸出的每一行不打印時間戳;
-v 輸出一個稍微詳細的信息,例如在ip包中可以包括ttl和服務類型的信息;
-vv 輸出詳細的報文信息;
-c 在收到指定的包的數目後,tcpdump就會停止;
-F 從指定的文件中讀取表達式,忽略其它的表達式;
-i 指定監聽的網絡接口;
-r 從指定的文件中讀取包(這些包一般通過-w選項產生);
-w 直接將包寫入文件中,並不分析和打印出來;
-T 將監聽到的包直接解釋爲指定的類型的報文,常見的類型有rpc (遠程過程調用)和snmp(簡單網絡管理協議;)
-x 讓十六進制顯示包內容
2、過濾
(1)指定接口(-i)
如:tcpdump -i eth0
(2)指定IP地址(host),可以輔加and , or ,!等邏輯符,以及src,dest等表示方向。
如:tcpdump host 192.168.1.23 捕獲192.168.1.23發出或者收到的包
tcpdump -A host 192.168.1.90 and \( 192.168.1.104 or 192.168.1.105 \) 捕獲192.168.1.23與192.168.1.104或者192.168.1.105之間往來的包
tcpdump host ! 192.168.1.23 捕獲除192.168.1.23以外所有主機的包
tcpdump -A src 192.168.1.90 and dst 192.168.1.104 指定從90發往104的包
(3)指定端口(port)
如:tcpdump port 80 指定捕獲80端口的包
(4)指定協議( 協議包括:ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp and udp)
如:tcpdump tcp 指定捕獲TCP包
(5)其它(gateway, broadcast, less, greater)
如:tcpdump broadcast 所有廣播包
二、三次握手過程分析
用netstat -an | grep LISTEN看一下,當前主機正在監聽的端口,使用另一臺機telnet過來,不輸入任何內容,進行抓包。
我們這裏以6000爲例
tcpdump port 6000 -c 3 -n
內容如下:
21:07:17.790296 IP 192.168.1.104.2511 > 192.168.1.90.6000: S 3359422806:3359422806(0) win 64240 <mss1460,nop,nop,sackOK>
21:07:17.790317 IP 192.168.1.90.6000 > 192.168.1.104.2511: S 3675079922:3675079922(0) ack 3359422807 win5840 <mss 1460,nop,nop,sackOK>
21:07:17.790675 IP 192.168.1.104.2511 > 192.168.1.90.6000: . ack 1 win 64240
我們來對第一個包進行分析:
21:07:17(時間).
790296(ID號)
IP (協議)
192.168.1.104.2511 > 192.168.1.90.6000: (源IP,端口,目的IP,端口)中間>表示方向
S (表示爲SYN包,即發起連接包
緊急指針— URG
確認序號有效—ACK
接收方應該儘快將這個報文段交給應用層—PSH
重建連接—RST
同步序號用來發起一個連接—SYN
發端完成發送任務—IN
)
3359422806:3359422806(0) (IP包序號,相對序號爲0)
win 64240 (數據窗口大小,告訴對方本機接收窗口大小,windows下默認爲64240,可通過setsockopt動態修改,同樣可以通過修改註冊表項(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters的 TCPWindowSize)來更改默認值)
<mss1460,nop,nop,sackOK> 對應TCP包頭中的選項字段
MSS: Maxitum Segment Size 最大分段大小,MSS表示TCP傳往另一端的最大塊數據的長度。當一個連接建立時,連接的雙方都要通告各自的MSS。如果一方不接收來自另一方的MSS值,則MSS就定爲默認的536字節。
以上三個包正好是TCP連接的三次握手過程:
(1) A主機發送序號爲3359422806的SYN包到B,同時帶有自身的WIN和MSS大小。
(2) B主機收到後,發送SYN+ACK的返回包到A,也帶自身的WIN和MSS大小,3675079922,同時爲爲上一個包的應答包3359422807。
(3) A主機返回ACK,包序號爲1(相對序號,如果需要看絕對序號,可以在tcpdump命令中加-S)
然後我們再來分析一下包的具體內容:
我們在tcpdump命令中加-x選項,後可得到如下內容:
22:07:13.436638 IP 192.168.1.104.2799 > 192.168.1.90.6000: S 3480877812:3480877812(0) win 64240 <mss 1460,nop,nop,sackOK>
0x0000: 4500 0030 b195 4000 8006 c51f c0a8 0168
0x0010: c0a8 015a 0aef 1770 cf79 faf4 0000 0000
0x0020: 7002 faf0 174e 0000 0204 05b4 0101 0402
22:07:13.436675 IP 192.168.1.90.6000 > 192.168.1.104.2799: S 4226616929:4226616929(0) ack 3480877813 win 5840 <mss 1460,nop,nop,sackOK>
0x0000: 4500 0030 0000 4000 4006 b6b5 c0a8 015a
0x0010: c0a8 0168 1770 0aef fbed 0e61 cf79 faf5
0x0020: 7012 16d0 f10e 0000 0204 05b4 0101 0402
22:07:13.437019 IP 192.168.1.104.2799 > 192.168.1.90.6000: . ack 1 win 64240
0x0000: 4500 0028 b196 4000 8006 c526 c0a8 0168
0x0010: c0a8 015a 0aef 1770 cf79 faf5 fbed 0e62
0x0020: 5010 faf0 39b2 0000
還是一樣,我們對第一個包進行分析,第一個包爲SYN包,應該爲一個空包,即只包括IP頭和TCP頭。
IP包頭
4 - IP版本號 IPV4
5 - IP包頭長度 5個32字節
00 - TOS (000 0000 0)前三個BIT優先權,現已忽略;4 bit的TOS分別代表:最小時延、最大吞吐量、最高可靠性和最小費用, 均爲0表示一般服務;最後1BIT未用。
0030 -總長度,48個字節
b195 -包唯一標識
4000 -標誌字段,和片偏移,用於分片
80 - TTL(128)
06 - 協議 TCP
c51f - MAC
c0a8 0168 - SRC IP,可以inet_ntoa轉換成點號分隔的IP。
c0a8 015a - DST IP
TCP包頭
0aef -源端口,十進制爲2799
1770 -目的端口,十進制爲6000
cf79 faf4 包序號,十進制爲217554863
0000 0000 確認序號,0,未設置ACK,確認序號無效
7002 -TCP包頭長度,標誌位。(0111 000000 000010)前4bitTCP長度7個32BIT,中間6bit保留,後6bit爲標誌位(URG, ACK,PSH, RST, SYN, FIN),可以看出設置了倒數第二位,SYN位。
faf0 - 窗口大小,十進制爲64240
174e - 校驗和,覆蓋了整個的 T C P報文段: T C P首部和T C P數據
0000 - 緊急指針, 只有當URG標誌置1時緊急指針纔有效
0204 05b4 0101 0402 - 選項字段,8個字節