轉自:http://www.aichengxu.com/view/47568
Tcp抓包以及tcp狀態解釋,有需要的朋友可以參考下。
- tcp三次握手
發送端發送一個SYN=1,ACK=0標志的數據包給接收端,請求進行連接,這是第一次握手;接收端收到請求並且允許連接的話,就會發送一個SYN=1,ACK=1標志的數據包給發送端,告訴它,可以通訊了,並且讓發送端發送一個確認數據包,這是第二次握手;最后,發送端發送一個SYN=0,ACK=1的數據包給接收端,告訴它連接已被確認,這就是第三次握手。之后,一個TCP連接建立,開始通訊。
- tcp連接狀態
SYN:同步標志。同步序列編號(Synchronize Sequence Numbers)欄有效。該標志僅在三次握手建立TCP連接時有效。它提示TCP連接的服務端檢查序列編號,該序列編號為TCP連接初始端(一般是客戶端)的初始序列編號。在這里,可以把 TCP序列編號看作是一個范圍從0到4,294,967,295的32位計數器。通過TCP連接交換的數據中每一個字節都經過序列編號。在TCP報頭中的序列編號欄包括了TCP分段中第一個字節的序列編號。
ACK:確認標志。確認編號(Acknowledgement Number)欄有效。大多數情況下該標志位是置位的。TCP報頭內的確認編號欄內包含的確認編號(w+1,Figure-1)為下一個預期的序列編號,同時提示遠端系統已經成功接收所有數據。
RST:復位標志。復位標志有效。用於復位相應的TCP連接。
URG:緊急標志。緊急(The urgent pointer) 標志有效。緊急標志置位,
PSH:推標志。該標志置位時,接收端不將該數據進行隊列處理,而是盡可能快將數據轉由應用處理。在處理 telnet 或 rlogin 等交互模式的連接時,該標志總是置位的。
FIN:結束標志。帶有該標志置位的數據包用來結束一個TCP回話,但對應端口仍處於開放狀態,准備接收后續數據。
.TCP的幾個狀態對於我們分析所起的作用。在TCP層,有個FLAGS字段,這個字段有以下幾個標識:SYN, FIN, ACK, PSH, RST, URG.其中,對於我們日常的分析有用的就是前面的五個字段。它們的含義是:
- SYN表示建立連接
- FIN表示關閉連接
- ACK表示響應
- PSH表示有 DATA數據傳輸
- RST表示連接重置
其中,ACK是可能與SYN,FIN等同時使用的,比如SYN和ACK可能同時為1,它表示的就是建立連接之后的響應,如果只是單個的一個SYN,它表示的只是建立連接。TCP的幾次握手就是通過這樣的ACK表現出來的。但SYN與FIN是不會同時為1的,因為前者表示的是建立連接,而后者表示的是斷開連接。RST一般是在FIN之后才會出現為1的情況,表示的是連接重置。一般地,當出現FIN包或RST包時,我們便認為客戶端與服務器端斷開了連接;而當出現SYN和SYN+ACK包時,我們認為客戶端與服務器建立了一個連接。PSH為1的情況,一般只出現在
DATA內容不為0的包中,也就是說PSH為1表示的是有真正的TCP數據包內容被傳遞。TCP的連接建立和連接關閉,都是通過請求-響應的模式完成的。
- tcp常見錯誤狀態
- Tcp previous segment lost(tcp先前的分片丟失)
- Tcpacked lost segment(tcp應答丟失)
- Tcp window update(tcp窗口更新)
- Tcp dup ack(tcp重復應答)
- Tcp keep alive(tcp保持活動)
- Tcp retransmission(tcp重傳)
- Tcp ACKed unseen segument (tcp看不見確認應答)
- tcp port numbers reused(tcp端口重復使用)
- tcp retransmission(tcp重傳)
- tcp fast retransmission (tcp快速重傳)
- TCP Previoussegment lost(發送方數據段丟失)
- tcp spurious retransmission(tcp偽重傳)
- tcp抓包工具tcpdump和wireshark
在linux下tcpdump是一個很強大的tcp抓包工具,但是由於linux分析不方便,因此可以將抓包數據保存到.cap文件中,然后在windos下使用wireshark進行分析,非常方便。
- tcpdump抓包命令
tcpdump tcp -i eth2 -s 0 and port 20058 -w /home/pjroot/attence.cap
tcpdump tcp -i eth2 -t -s 0 -c 100 and port 20058 -w /home/pjroot/attence.cap
tcpdump tcp -i eth2 -s 0 and port 20058 and host 125.77.252.211 -w ./attence.cap
-i eth2 指定數據包經過的網卡
-s 0 抓取數據包時默認抓取長度為68字節。加上-S 0 后可以抓到完整的數據包
port 指定端口 可以加上src 和dst表示現在為源端口還是目的端口
host 指定主機可以加上src和dst表示源地址還是目的地址
-w 表示要寫入到文件中
-t 表示不顯示時間戳
-c 100 表示只抓取初始的100個數據包
打印所有進入或離開sundown的數據包.
tcpdump host sundown
也可以指定ip,例如截獲所有210.27.48.1的主機收到的和發出的所有的數據包
tcpdump host 210.27.48.1
打印helios 與 hot 或者與 ace 之間通信的數據包
tcpdump host helios and \( hot or ace \)
截獲主機210.27.48.1和主機210.27.48.2或210.27.48.3的通信
tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
打印ace與任何其他主機之間通信的IP 數據包, 但不包括與helios之間的數據包.
tcpdump ip host ace and not helios
如果想要獲取主機210.27.48.1除了和主機210.27.48.2之外所有主機通信的ip包,使用命令:
tcpdump ip host 210.27.48.1 and ! 210.27.48.2
截獲主機hostname發送的所有數據
tcpdump -i eth0 src host hostname
監視所有送到主機hostname的數據包
tcpdump -i eth0 dst host hostname
如果想要獲取主機210.27.48.1接收或發出的telnet包,使用如下命令
tcpdump tcp port 23 and host 210.27.48.1
tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
0x4745 為"GET"前兩個字母"GE",0x4854 為"HTTP"前兩個字母"HT"。
- tcpudp命令參數說明
-i any : 監聽所有接口
-n : 不解析主機名
-nn : 不解析主機名和端口名
-X : 以16進制和ascii格式顯示包
-XX : 和-X一樣,但會顯示以太網頭
-v, -vv, -vvv : 獲取包含信息量更多的包
-c : 獲取指定數量的包,達到該數量后tcpdump停止
-S : 顯示絕對序列號
-e : 獲取以太網頭
-q : 顯示少量的協議信息
-E : 通過密鑰來解密IPSEC交互
-s : 設置snaplength(snaplength是抓取的字節數)
- host // 根據ip地址查詢交互(不用"-n"也能根據主機名查詢交互)
# tcpdump host 1.2.3.4
- src,dst // 找出指定源地址或目的地址的交互
# tcpdump src 2.3.4.5
# tcpdump dst 3.4.5.6
- net // 根據網絡號抓取整個網絡
# tcpdump net 1.2.3.0/24
- proto // 工作在tcp,udp,和icmp。注意你不用必須輸入proto。
# tcpdump icmp
- port // 查看經過指定端口的交互
# tcpdump port 3389
- src,dst port // 找出指定源端口或目的端口的交互
# tcpdump src port 1025
# tcpdump dst port 389
- src/dst, port, protocol // 將三個聯合在一起
# tcpdump src port 1025 and tcp
# tcpdump udp and src port 53
你也可以用選項來找出多個端口而不用一一指定,也可以僅查看大於或小於某一字節大小的包。
- Port Ranges // 查看經過范圍內端口的交互
tcpdump portrange 21-23
- Packet Size Filter // 查看大於或小於某一字節大小的包
tcpdump less 32
tcpdump greater 128
也可以用符號來代替
tcpdump > 32
tcpdump <= 128
寫到一個文件
tcpdump用"-w"選項可以將抓到的內容存入文件,再用"-r"選項讀回來,這個功能非常好,可以抓取原始交互之后再用其他工具運行它。
以這種方式抓取到的交互會存成tcpdump格式的文件,現在網絡分析圈內基本都用這種格式,因此文件可以被所有工具讀取,包括Wireshark, Snort等。
- 抓取所有經過端口80的交互存入一個文件
# tcpdump -s 1514 port 80 -w capture_file
- 以后可以再讀回來
# tcpdump -r capture_file
更多的例子
# 從10.5.2.3到端口3389的tcp交互
tcpdump -nnvvS and src 10.5.2.3 and dst port 3389
# 從網絡192.168到網絡10或172.16的交互
tcpdump -nvX src net 192.168.0.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16
# 從192.168.0.2到網絡172.16的非icmp交互
tcpdump -nvvXSs 1514 dst 192.168.0.2 and src net and not icmp
# 從Mars或Pluto到非SSH端口的交互
tcpdump -vv src Mars or Pluto and not dst port 22
分組
如果你試圖運行這個本來非常有用的命令,因為括號的原因會報錯,可以對括號進行轉義(前面加"/")或者將整個命令放在單引號中:
# 從10.0.2.4到端口3389或22的交互(正確的表達)
tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)'