Wireshark抓包工具使用

轉載自:https://www.cnblogs.com/java-jun-world2099/p/9172322.html

文章整理自網絡資源。

一、先來個案例

相對於火狐或谷歌瀏覽器中使用調試工具抓取HTTP數據包,使用wireshark要顯得複雜些,但是也可以達到最終效果。這些操作分爲兩步,第一步設置合理的過濾條件,第二步在任意數據包中選擇Follow TCP Stream。

假設在8080端口運行一個HTTP服務器,本例中使用Python Flask運行一個HTTP服務並偵聽8080端口,實現一個簡單的加法運算,網頁中通過ajax提交兩個數據,例如a=2&b=3,Flask處理之後返回一個json數據包,格式如{"result":5}。

1.設置過濾條件

【1】http and ip.addr == 192.168.1.106 and tcp.port == 8080

【a】http:指定網絡協議

【b】ip.addr == 192.168.1.106:指定服務器ip地址,請根據實際情況替換。

【c】tcp.port == 8080,指定端口號,請根據實際情況替換。

 

【2】點擊apply

    點擊apply之後可過濾得到兩個數據包,分別是HTTP請求和HTTP響應。

 

2.查看TCP數據流——Follow TCP Stream

【1】在任意數據包上右擊,選擇Follow TCP Stream

 該步驟可以過濾出和該HTTP數據包有關的TCP數據包,包括TCP 3次握手,TCP分片和組裝等。

 

【2】最終得到HTTP請求和響應

【a】紅色背景字體爲HTTP請求,藍色背景字體爲HTTP響應

【b】從User-Agent中可以看出,360瀏覽器兼容模式使用了IE8內核(該臺計算機操作系統爲XP,IE瀏覽器版本爲8),這說明360瀏覽器使用了系統中的IE核。

 

二、wireshark過濾規則

 

使用好wireshark一個關鍵是如何從抓到的衆多的包中找到我們想要的那一個。這裏就要說filter過濾規則了。如上圖,在過濾器方框,我們加上了ip.src==192.168.1.102 or ip.dst==192.168.1.102的過濾規則,意思是在封包列表中,只顯示源ip地址爲192.168.1.102或者目的ip地址爲192.168.1.102的包。 
下面列舉一些常用的過濾規則:

1、過濾IP,如來源IP或者目標IP等於某個IP 

如前面說的例子: ip.src==192.168.1.102 or ip.dst==192.168.1.102 
比如TCP,只顯示TCP協議。

2、過濾端口 

tcp.dstport == 80 // 只顯tcp協議的目標端口80 

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

3、過濾協議 

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

4、過濾mac地址 

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

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

6、過濾內容 

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” 
前面也有例子,http contains “HTTP/1.0 200 OK” && http contains “Content-Type: “

三、osi模型簡述

OSI定義了網絡互連的七層框架(物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層),即ISO開放互連繫統參考模型。如下圖左邊部分。在每個分層中,都會對所發送的數據附加一個首部,在這個首部中包含了該層必要的信息,如源ip地址和目的ip地址等。

 

osi模型中,在下一層的角度看,當收到上一層的包時,全部會被認爲是本層的數據,然後在本層中加上自己本層的首部,繼續往下傳遞。一個數據包格式如下: 

 

舉一個例子,比如客戶端應用程序A向遠端服務器應用程序B發送“早上好”的數據,那麼大致流程是這樣的:

  1. 應用程序A把數據發送給下一層的TCP模塊。
  2. TCP模塊屬於傳輸層。TCP在應用層數據的前端加上一個TCP首部。TCP首部中包含源端口號和目標端口號等信息。然後將包發送給IP模塊。
  3. IP模塊屬於網絡層。IP將TCP傳過來的TCP首部和TCP數據合起來當做自己的數據,並且在TCP首部的前面加上自己的IP首部。IP首部包含了源ip地址和目的ip地址。然後,IP包將被髮送給數據鏈路層,也就是以太網驅動程序。
  4. 從IP傳過來的包,對於以太網驅動程序來說不過就是數據。給這些數據加上以太網首部,裏面包含了源MAC地址和目的MAC地址。然後再通過物理層把數據發送給目的MAC地址。
  5. 服務器物理層接收到來自客戶端的數據包時,首先從以太網的包首部找到MAC地址,判斷是否爲發給自己的包,如果不是就丟棄,如果是就向上轉移給IP模塊解析。
  6. IP模塊收到IP包首部和後面的數據以後,判斷包首部的目的ip地址與自己的ip地址是否匹配,如果匹配,就接收數據並傳給TCP模塊處理。
  7. TCP模塊會檢查端口號確定接收數據的應用程序是哪一個。
  8. 應用程序接收到數據包之後也會根據自己的規則判斷做出一系列的處理。

通過上面例子大致的過程,可以體會到從上而下發包再到從下而上收包的過程。

講述一下看懂報文的方法。想要讀懂tcp報文,頭部至關重要,對着下圖去看wireshark tcp報文,並且找到tcp首部各個字段代表的意思,你就能讀懂tcp報文了。其他像以太網報文、ip報文、http報文等同樣如此。

 

四、TCP:傳輸控制協議

 TCP是一種面向連接的、可靠的、基於字節流的傳輸層通信協議。 

  面向連接: 面向連接意味着使用tcp的應用程序在傳輸數據前必須先建立連接,就如打電話一樣,要先進行撥號,等待對方響應才能開始說話。 
  可靠性:tcp協議通過下列方式來提高可靠性: 

  • 應用數據被分割成TCP認爲最適合發送的數據塊。這和UDP完全不同,應用程序產生的數據報長度將保持不變。由TCP傳遞給I P的信息單位稱爲報文段或段
  • 當TCP發出一個段後,它啓動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段。
  • 當TCP收到發自TCP連接另一端的數據,它將發送一個確認。這個確認不是立即發送,通常將推遲幾分之一秒。
  • TCP將保持它首部和數據的檢驗和。這是一個端到端的檢驗和,目的是檢測數據在傳輸過程中的任何變化。如果收到段的檢驗和有差錯,TCP將丟棄這個報文段和不確認收到此報文段(希望發端超時並重發)。
  • 既然TCP報文段作爲IP數據報來傳輸,而IP數據報的到達可能會失序,因此TCP報文段的到達也可能會失序。如果必要,TCP將對收到的數據進行重新排序,將收到的數據以正確的順序交給應用層。
  • 既然I P數據報會發生重複,TCP的接收端必須丟棄重複的數據。
  • TCP還能提供流量控制。TCP連接的每一方都有固定大小的緩衝空間。TCP的接收端只允許另一端發送接收端緩衝區所能接納的數據。這將防止較快主機致使較慢主機的緩衝 
    區溢出。

    字節流:兩個應用程序通過TCP連接交換8 bit字節構成的字節流。

      另外,TCP對字節流的內容不作任何解釋。TCP不知道傳輸的數據字節流是二進制數據,還是ASCII字符或者其他類型數據。對字節流的解釋由TCP連接雙方的應用層解釋。

TCP首部格式

  tcp數據是被封裝在IP數據包中的,和udp類似,在IP數據包的數據部分。tcp數據包的格式如下:

 

源端口號和目的端口號與udp中類似,用於尋找發端和收端應用進程。這兩個值加上IP首部中的源端IP地址和目的端IP地址唯一確定一個TCP連接,在網絡編程中,一般一個IP地址和一個端口號組合稱爲一個套接字(socket)。 
  序號:用來標識從TCP發端向TCP收端發送的數據字節流,它表示在這個報文段中的的第一個數據字節。在tcp中tcp用序號對每個字節進行計數(這個值與發送的幀數沒有關係,而是與發送的數據字節數有關係,後面會有說明)。 
  確認序號:包含發送確認的一端所期望收到的下一個序號。因此,確認序號應當是上次已成功收到數據字節序號加 1(不是單純的序號加1,還包括數據字節數)。 
  首部長度:用於記錄tcp數據報首部的長度,一般爲20字節,實際值爲首部長度除以4。 
  URG: 緊急指針( urgent pointer)有效。 
  ACK: 確認序號有效。 
  PSH: 接收方應該儘快將這個報文段交給應用層。 
  RST: 重建連接。 
  SYN: 同步序號用來發起一個連接。 
  FIN: 發端完成發送任務。 
  窗口大小:用於流量控制。 
  檢驗和:檢驗和覆蓋了整個的 TCP報文段: TCP首部和TCP數據,與udp相似需要計算僞首部。

五、Wireshark抓包分析TCP結構

1、利用wireshark抓取一個tcp數據包,查看其具體數據結構和實際的數據:

這裏寫圖片描述

這裏寫圖片描述

2、TCP連接的建立

 利用TCP傳輸數據前,需要建立tcp連接,tcp連接的建立有3個主要過程,叫做3次握手,具體過程如下圖所示: 
  這裏寫圖片描述 
  

過程: 
   1. 首先客戶端發送一個SYN包給服務器(SYN=1,Seq爲主機選擇的這個連接的初始序號),然後等待應答。 
   2. 服務器端收到SYN包,迴應給客戶端一個ACK =x+1、SYN=1的TCP數據段(ACK表示確認序號有效,即收到上一個包,這裏加1並不是ACK的值加1,ACK是一個標誌位,這裏會變成1,而x+1則是希望收到的下一個包的序列號,這個值放在包的確認序列號字段中,而只有ACK=1時,確認序列號纔有效)。 
   3. 客戶必須再次迴應服務器端一個ACK確認數據段(這裏的Seq爲x+1)。 
   
   經過上面3個過程就建立了一個tcp連接,接着就可以發送數據了,因爲建立連接使用了一個序列號x,所以發送數據的第一個字節序號爲x+1。 
   
   注意:這裏tcp爲應用層提供全雙工服務,意味數據能在兩個方向上獨立地進行傳輸,因此連接的每一段都有各自的傳輸數據序號(對應於上圖中的x和y,這兩個值是沒有必然聯繫的)。

3、Wireshark抓包分析TCP3次握手

 下面通過利用http應用層連接一個網絡,實現tcp的3次握手和簡單的數據交換過程,下面通過抓包來實際觀察這個過程,首先我們先看看抓到的包: 

  這裏寫圖片描述

  從第一行的tcp往下看,前面3個tcp包爲3次握手的過程,接着http包說明成功建立連接,主機向服務器發送一個http應用請求,服務器收到請求後,返回一個tcp確認幀,接着發送一個http應答給主機,主機收到服務器的http應答數據後,又發送一個tcp確認幀,確認收到了數據。這樣圖中的前7個包實現了主機和服務器建立連接,並實現一次簡單的數據請求應答過程。即下圖所示的交互按鍵回顯過程:

這裏寫圖片描述

接下來是按照順序的7個數據幀的數據結構。數據幀順序分別爲: 

  1. 主機發起一個tcp連接請求(tcp), 
  2. 服務器響應連接請求(tcp), 
  3. 主機返回ACK完成3次握手成功建立連接(tcp), 
  4. 主機發送一個http網頁請求(http), 
  5. 服務器收到請求返回一個ACK幀(tcp), 
  6. 服務器根據請求發送數據到主機(http), 
  7. 主機收到服務器數據返回一個ACK幀(tcp),具體幀細節見下圖:

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

4、TCP連接的釋放

當通信雙方完成數據傳輸,需要進行TCP連接的釋放,由於TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的連接。收到一個 FIN只意味着這一方向上沒有數據流動,一個TCP連接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。因爲正常關閉過程需要發送4個TCP幀,因此這個過程也叫作4次揮手。具體過程如下圖: 

  這裏寫圖片描述 
  


過程(默認客戶端發起關閉): 
  1. TCP客戶端發送一個FIN,關閉客戶端到服務器端的數據傳送。(客戶端不再發送報文給服務器端,但可接受服務器端報文) 
  2. 服務器收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1。 
  3.服務器關閉客戶端的連接,發送一個FIN給客戶端。(服務器端關閉到客戶端的數據傳送) 
  4.客戶段發回ACK報文確認,並將確認序號設置爲收到序號加1。

下面通過wireshark抓包瞭解具體的釋放連接過程,通過斷開一個連接,抓取到4個TCP幀,幀順序依次爲: 

  1. 主動關閉放發送一個FIN幀給被動方 
  2. 被動方收到關閉信息返回一個確認ACK幀 
  3. 被動方發送一個FIN幀給主動方 
  4. 主動方收到被動方的FIN關閉信息返回一個ACK幀,連接釋放

下面爲按照順序的幀數據結構詳細信息:

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

 六、RST標誌位

1、tcp報文

TCP是在IP網絡層之上的傳輸層協議,用於提供port到port面向連接的可靠的字節流傳輸。我來用土語解釋下上面的幾個關鍵字:

port到port:IP層只管數據包從一個IP到另一個IP的傳輸,IP層之上的TCP層加上端口後,就是面向進程了,每個port都可以對應到用戶進程。

標誌位共有六個,其中RST位就在TCP異常時出現。

發送的數據TCP包都有一個序號。它是這麼得來的:最初發送SYN時,有一個初始序號,根據RFC的定義,各個操作系統的實現都是與系統時間相關的。之後,序號的值會不斷的增加,比如原來的序號是100,如果這個TCP包的數據有10個字節,那麼下次的TCP包序號會變成110。

2、滑動窗口

滑動窗口用於加速傳輸,比如發了一個seq=100的包,理應收到這個包的確認ack=101後再繼續發下一個包,但有了滑動窗口,只要新包的seq與沒有得到確認的最小seq之差小於滑動窗口大小,就可以繼續發。

滑動窗口毫無疑問是用來加速數據傳輸的。TCP要保證“可靠”,就需要對一個數據包進行ack確認表示接收端收到。有了滑動窗口,接收端就可以等收到許多包後只發一個ack包,確認之前已經收到過的多個數據包。有了滑動窗口,發送端在發送完一個數據包後不用等待它的ack,在滑動窗口大小內可以繼續發送其他數據包。

3、四次握手的正常TCP連接關閉示意圖:

FIN標誌位也看到了,它用來表示正常關閉連接。圖的左邊是主動關閉連接方,右邊是被動關閉連接方,用netstat命令可以看到標出的連接狀態。

FIN是正常關閉,它會根據緩衝區的順序來發的,就是說緩衝區FIN之前的包都發出去後再發FIN包,這與RST不同。

4、RST表示復位

RST表示復位,用來異常的關閉連接,在TCP的設計中它是不可或缺的。就像上面說的一樣,發送RST包關閉連接時,不必等緩衝區的包都發出去(不像上面的FIN包),直接就丟棄緩存區的包發送RST包。而接收端收到RST包後,也不必發送ACK包來確認。

TCP處理程序會在自己認爲的異常時刻發送RST包。例如,A向B發起連接,但B之上並未監聽相應的端口,這時B操作系統上的TCP處理程序會發RST包。

又比如,AB正常建立連接了,正在通訊時,A向B發送了FIN包要求關連接,B發送ACK後,網斷了,A通過若干原因放棄了這個連接(例如進程重啓)。網通了後,B又開始發數據包,A收到後表示壓力很大,不知道這野連接哪來的,就發了個RST包強制把連接關了,B收到後會出現connect reset by peer錯誤。

5、tcp連接中幾種出現rst情況

1.端口未打開

比如主機A向主機B發送一個SYN請求,表示想要連接主機B的8000端口。但是主機B根本沒有打開8000這個端口。於是向主機A發送了一個RST。

在某些操作系統的主機上未必是這樣的表現。比如向一臺win7主機發送一個端口不存在的請求,這臺主機就不會響應。

 2.請求超時

3.提前關閉

 打開一個socket然後連接一個服務器併發送5000個字節,而服務端設置的每次只接收4996個字節。那麼客戶端剩下的四個字節服務端沒有接收到,服務端的socket就被關閉掉。這時服務端會先向客戶端發送一個ack確認包,然後發送RST斷開連接。

4.在一個已關閉的socket上收到數據。

如果某個socket已經關閉,但依然收到數據也會產生RST。客戶端在服務端已經關閉掉socket後仍然在發送數據,這時服務端會產生RST。

七、常用的捕獲過濾

1、只(不)捕獲某主機的HTTP流量 

host 192.168.5.231 and port 80 and http 只捕獲主機192.168.5.231 的http流量。注意如果你的HTTP端口爲8080,把80 改爲8080。

port 80 and http 捕獲所有經過該接口的http流量。注意如果你的HTTP端口爲8080,把80 改爲8080。

host 192.168.5.231 and not port 80 捕獲主機192.168.5.231除 http 之外的其他所有流量,注意如果你的HTTP端口爲8080,把80 改爲8080。

not port 80 捕獲除http之外的其他所有流量,注意如果你的HTTP端口爲8080,把80 改爲8080。

not port 80 and !http  捕獲除 http 之外的其他所有流量,注意如果你的HTTP端口爲8080,把80 改爲8080。

 

2、只捕獲某主機的所有流量 

host 192.168.5.231 捕獲源目主機均爲192.168.5.231

dst 192.168.5.231  捕獲目的主機均爲192.168.5.231

src 192.168.5.231  捕獲來源主機均爲192.168.5.231

net 192.168.5.0/24 捕獲網段爲d192.168.5的所有主機的所有流量

3、只捕獲某主機的DNS流量 

host 192.168.5.231 and port 53  只捕獲主機192.168.5.231 的dns流量。

src 192.168.5.231 and port 53    只捕獲主機192.168.5.231 對外的dns 的流量。

dst 192.168.5.231 and port 53    只捕獲dns服務器相應主機192.168.5.231的dns流量。

port 53          捕獲接口中的所有主機的dns流量

4、捕獲電子郵件的流量 

host 192.168.5.231 and port 25       捕獲主機192.168.5.231 的POP3協議的流量。

port 25 and portrange 110-143        因爲電子郵件的協議:SMTP、POP3、IMAP4,所以捕獲端口的流量。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章