本文會對Wireshark做簡單介紹,帶大家熟悉一下Wireshark的界面,以及如何使用過濾器。
接著會帶大家查看TCP五層模型下,帶大家回顧各層首部的格式。
最后會演示 Wireshark 如何抓取三次握手和四次揮手包的過程。
目錄
一.Wireshark簡介
二. 界面介紹
三. 過濾器
1. 捕獲過濾器
2. 顯示過濾器
四. 保存流量包
五. 協議數據包詳解
1. 物理層
2. 數據鏈路層
3. 網絡層
?4. 傳輸層
三次握手
四次揮手
一.Wireshark簡介
大家可能之前用過 BurpSuite,Wireshark和它相比有哪些區別呢?
Burpsuite 只是抓的應用層數據包,而 Wireshark 七層網絡模型都能抓。
不過Wireshark不是入侵檢測系統,對于網絡上的異常流量,Wireshark不會警示或提示。
且無法對流量包進行更改,只能查看流量包。
下載地址:Wireshark · Download
二. 界面介紹
共分為五大塊:菜單欄,工具欄,顯示過濾器,捕獲過濾器和網卡模塊。
顯示過濾器是對抓到的包進行過濾;
捕獲過濾器是提前設置好想抓的對象。
抓包界面也分三大塊:
從上到下分別是數據包列表,數據包的詳細信息和詳細信息十六進制表示。
在編輯-首選項-外觀,也可以按自己習慣修改布局。
三. 過濾器
功能列表不可能一一介紹完,這里介紹最重要的過濾器。
1. 捕獲過濾器
前面說過,捕獲過濾器是提前設置好捕獲的對象
點擊捕獲-選項:
這里的混雜模式 是指不僅抓本機MAC地址的包,所有經過網卡的包都會捕獲。
捕獲過濾器就在下方的框內輸入即可
比如想捕獲端口為443的包:輸入 port 443
還有很多選項,比如
地址:host、src、dst????? 協議:ip、tcp、http、ftp 等
如查找目的地址為本機且協議是tcp的包:dst 127.0.0.1 && tcp
這里再舉些例子:?
src host 192.168.2.11 && dst port 80 #抓取源地址為192.168.2.11,并且目的端口為80
的流量
host 192.168.2.11 || host 192.168.2.22 #抓取192.168.2.11或者192.168.2.22的流量
數據
!broadcast #不抓取廣播包
src ether host 98:1a:35:98:09:6f #抓取源mac地址為98:1a:35:98:09:6f的數據包
2. 顯示過濾器
顯示過濾器是對抓完的包再進行過濾
這里也列出一些例子:
http、tcp #按照協議搜索
ip.src_host=192.168.2.16 #src_host按照源ip地址進行搜索
ip.src_host=192.168.2.16 or ip.dst_host=192.168.2.1 # dst_host是目標主機ip地址
tcp.flags.ack == 0 and tcp.flags.syn == 1 # 這是過濾出,tcp請求中ack標記為0,syn標記為1的包
ip.addr=192.168.2.33 # 是要ip地址為192.168.2.33的全部展示出來,不管是目標地址還是源地址。
tcp.srcport == 443 # 源端口為443的數據包
not arp # 不獲取arp數據
tcp.port == 443 # 過濾端口443的數據包
這里還有一種過濾器選擇方法:
我們選擇一項右擊,選擇作為過濾器應用,也可以進行顯示過濾。
四. 保存流量包
比如我們想導出特定幾個流量包,怎么導出呢?
選中我們要標記的包右鍵標記或者 Ctrl + M
再點擊 文件 - 導出特定分組,選擇最下面的 Marked packets only
五. 協議數據包詳解
OSI 七層模型和 TCP/IP 五層模型相信大家并不陌生:
Wireshark 呈現出的方式是五層模型方式:
我們依次來看一下:
1. 物理層
2. 數據鏈路層
數據鏈路層抓的是以太網MAC幀,格式如下:
細心的同學會發現,為什么Wireshark這個沒有FCS字段
因為 Wireshark 抓取的MAC幀直接丟掉了幀尾,默認丟棄了這個校驗字段。
3. 網絡層
IP層咱先回顧一下IP首部字段:
再來對比看一下:
?4. 傳輸層
傳輸層協議主要是TCP和UDP,我們這里先看TCP:
對應看下包:這里的1000就是數據偏移,保留位是 ....
數據偏移其實就是表示這個TCP的首部長度,以4B為單位,所以為32B
標志位字段展開就是六個標志
各個標志位的含義如下:
--------------------------------------------------------------------------------------------------------------------------------
下面演示三次握手和四次揮手的抓包過程:
三次握手
首先看下三次握手的過程圖:
具體的三次握手細節可以看?湖科大計網
實驗過程如下:
我們隨便訪問一個網站,通過 源地址、目標地址和info 能找到三次握手的包
也可以設置顯示過濾器為 tcp.flags.syn == 1 進行查找
然后存儲下來,我們來進行分析:
第一個包,開始時服務器端處于監聽狀態,客戶端發送TCP連接請求報文段
并設置 seq=x,SYN=1,進入 SYN-SENT 狀態
---------------------------------------------------------------------------------------------------------------------------------
第二個包,服務器端接收到后,向客戶端發送確認消息
設置 SYN=1,ACK=1,seq=y,ack=x+1,并進入 SYN-RCVD 狀態
---------------------------------------------------------------------------------------------------------------------------------
第三個包,客戶端收到后,向服務器端發送TCP確認報文段表示收到
設置 ACK=1,seq=x+1,ack=y+1,進入 ESTABLISHED 狀態
最后,服務器收到確認請求,就知道可以進行通信了,也進入 ESTABLISHED 狀態。
四次揮手
四次揮手的過程圖:
實驗過程如下:
我們搜索 tcp.flags.fin == 1
搜到兩條先標記,然后搜 tcp.flags,就能找到四次揮手的四個包了,標記保存。
第一個包,客戶端向服務器發送FIN請求,并確認收到之前的數據
設置 FIN=1,ACK=1,seq=u,ack=v,并進入終止等待1狀態
---------------------------------------------------------------------------------------------------------------------------------
第二個包, 服務器收到客戶端的包,返回確認包
設置 ACK=1,seq=v,ack=u+1,服務器端進入關閉等待狀態,客戶端進入終止等待2狀態
---------------------------------------------------------------------------------------------------------------------------------
第三個包,主要是為了防止第二包發完后,服務器端還有數據要發送給客戶端
發送完后,服務器端也告知客戶端自己要請求斷開連接,并確認收到了之前的數據包
設置 FIN=1,ACK=1,seq=w,ack=u+1,服務器端進入最后確認狀態
---------------------------------------------------------------------------------------------------------------------------------
第四個包,客戶端確認收到服務器端的釋放請求
設置 ACK=1,seq=u+1,ack=w+1,客戶端進入時間等待狀態,因為怕服務器端沒收到這個確認包。客戶端等待2MSL看服務器端是否會超時重傳,沒反應就進入關閉狀態。
感謝你能看到這 o(* ̄▽ ̄*)ブ