前言
最近在學(xué)習(xí)計(jì)算機(jī)網(wǎng)絡(luò)知識(shí),學(xué)習(xí)過(guò)程中使用抓包工具Wireshark抓取網(wǎng)絡(luò)數(shù)據(jù)包,來(lái)輔助理解網(wǎng)絡(luò)協(xié)議。
Wireshark是一個(gè)網(wǎng)絡(luò)封包分析軟件。網(wǎng)絡(luò)封包分析軟件的功能是擷取網(wǎng)絡(luò)封包,并盡可能顯示出最為詳細(xì)的網(wǎng)絡(luò)封包資料。Wireshark使用WinPCAP作為接口,直接與網(wǎng)卡進(jìn)行數(shù)據(jù)報(bào)文交換。
目錄

基本使用
下載地址:https://www.wireshark.org/
支持系統(tǒng):Windows、macOS



主要功能區(qū):
- 顯示過(guò)濾器
- 抓獲的封包列表
- 封包詳細(xì)信息
- 封包16進(jìn)制數(shù)據(jù)
抓取HTTP報(bào)文

1.開(kāi)啟捕捉任務(wù)
2.瀏覽器訪(fǎng)問(wèn)http://www.lizhengyang.cn/
3.停止捕捉任務(wù)
4.設(shè)置顯示過(guò)濾條件
開(kāi)啟捕捉任務(wù)后,封包列表可能會(huì)出現(xiàn)很多無(wú)用的數(shù)據(jù)包,設(shè)置顯示過(guò)濾器過(guò)濾掉冗余數(shù)據(jù)。
如下圖,在顯示過(guò)濾器中輸入:http and ip.addr == 39.107.127.222 (IP地址替換為目標(biāo)網(wǎng)站的IP)
按回車(chē)鍵,只剩下兩個(gè)數(shù)據(jù)包:請(qǐng)求包、響應(yīng)包。

5.查看HTTP報(bào)文
在任意數(shù)據(jù)包上點(diǎn)擊右鍵:追蹤流-->HTTP流
彈出窗口就是完整的HTTP報(bào)文,紅色字體為HTTP請(qǐng)求報(bào)文,藍(lán)色字體為HTTP響應(yīng)報(bào)文

過(guò)濾器
如果不設(shè)置過(guò)濾器,會(huì)抓取很多雜亂冗余的數(shù)據(jù),以至于很難找到自己需要的部分。使用過(guò)濾器可以幫助我們精準(zhǔn)找到需要的信息。
過(guò)濾器分兩種:
- 捕捉過(guò)濾器。只捕捉符合過(guò)濾規(guī)則的封包,其它數(shù)據(jù)不會(huì)存在封包列表中。在捕捉前設(shè)置。
- 顯示過(guò)濾器。用來(lái)過(guò)濾抓取后的結(jié)果,可以隨意更改過(guò)濾規(guī)則。
注意:兩種過(guò)濾器的規(guī)則語(yǔ)法是不一樣的,不要混淆。
捕捉過(guò)濾器
捕捉過(guò)濾器的語(yǔ)法與其它使用Lipcap(Linux)或者Winpcap(Windows)庫(kù)開(kāi)發(fā)的軟件一樣,比如著名的TCPdump。捕捉過(guò)濾器必須在開(kāi)始捕捉前設(shè)置完畢,這一點(diǎn)跟顯示過(guò)濾器是不同的。
設(shè)置捕捉過(guò)濾器的步驟是:
- 工具欄 -> 捕捉 -> 選項(xiàng)
- WLAN -> 捕捉過(guò)濾器中輸入規(guī)則
- 點(diǎn)擊開(kāi)始(Start)進(jìn)行捕捉

過(guò)濾公式
| 語(yǔ)法: | Protocol | Direction | Host(s) | Value | Logical Operations | Other expression | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 例子: | tcp | dst | 10.1.1.1 | 80 | and | tcp dst 10.2.2.2 3128 |
Protocol(協(xié)議):
可能的值: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp
如果沒(méi)有特別指明是什么協(xié)議,則默認(rèn)使用所有支持的協(xié)議。
Direction(方向):
可能的值: src, dst, src and dst, src or dst
如果沒(méi)有特別指明來(lái)源或目的地,則默認(rèn)使用 "src or dst" 作為關(guān)鍵字。
例如,host 10.2.2.2與src or dst host 10.2.2.2是一樣的
Host(s)
可能的值: net, port, host, portrange
如果沒(méi)有指定此值,則默認(rèn)使用"host"關(guān)鍵字。
例如,src 10.1.1.1與src host 10.1.1.1`相同。
Logical Operations(邏輯運(yùn)算):
可能的值:not, and, or
否(not)具有最高的優(yōu)先級(jí)。或(or)和與(and)具有相同的優(yōu)先級(jí),運(yùn)算時(shí)從左至右進(jìn)行。
例如
-
not tcp port 3128 and tcp port 23與(not tcp port 3128) and tcp port23相同。 -
not tcp port 3128 and tcp port 23與not (tcp port 3128 and tcp port23)不同。
案例
//顯示目的TCP端口為3128的封包。
tcp dst port 3128
//顯示來(lái)源IP地址為10.1.1.1的封包。
ip src host 10.1.1.1
//顯示目的或來(lái)源IP地址為10.1.2.3的封包。
host 10.1.2.3
//顯示來(lái)源為UDP或TCP,并且端口號(hào)在2000至2500范圍內(nèi)的封包。
src portrange 2000-2500
//顯示除了icmp以外的所有封包。(icmp通常被ping工具使用)
not imcp
//顯示來(lái)源IP地址為10.7.2.12,但目的地不是10.200.0.0/16的封包。
src host 10.7.2.12 and not dst net 10.200.0.0/16
//顯示來(lái)源IP為10.4.1.12或者來(lái)源網(wǎng)絡(luò)為10.6.0.0/16,目的地TCP端口號(hào)在200至10000之間,并且目的位于網(wǎng)絡(luò)10.0.0.0/8內(nèi)的所有封包。
(src host 10.4.1.12 or src net 10.6.0.0/16) and tcp dst portrange 200-10000 and dst net 10.0.0.0/8
//顯示目的TCP端口為3128的封包。
tcp dst port 3128`
//顯示來(lái)源IP地址為10.1.1.1的封包。
ip src host 10.1.1.1
//顯示目的或來(lái)源IP地址為10.1.2.3的封包。
host 10.1.2.3
//顯示來(lái)源為UDP或TCP,并且端口號(hào)在2000至2500范圍內(nèi)的封包。
src portrange 2000-2500
//顯示除了icmp以外的所有封包。(icmp通常被ping工具使用)
not imcp
//顯示來(lái)源IP地址為10.7.2.12,但目的地不是10.200.0.0/16的封包。
src host 10.7.2.12 and not dst net 10.200.0.0/16
顯示過(guò)濾器
剛才抓取HTTP報(bào)文使用的就是顯示過(guò)濾器。
過(guò)濾公式
| 語(yǔ)法: | Protocol | . | String 1 | . | String 2 | Comparisonoperator | Value | LogicalOperations | Otherexpression |
|---|---|---|---|---|---|---|---|---|---|
| 例子: | http | request | uri | == | "/index" | xor | ip.dst != 10.4.5.6 |
看到這里有是不是有點(diǎn)蒙,每個(gè)符號(hào)都認(rèn)識(shí),但為啥要這樣組合呢?
不要怕,這個(gè)公式不需要記住,熟悉一下公式的結(jié)構(gòu)即可,因?yàn)?code>Wireshark中可已通過(guò)表達(dá)式工具來(lái)動(dòng)態(tài)生成規(guī)則。
動(dòng)態(tài)生成過(guò)濾規(guī)則
點(diǎn)擊“表達(dá)式”

彈出“顯示過(guò)濾器表達(dá)式”窗口

上圖圈住的五個(gè)模塊對(duì)應(yīng)著五個(gè)步驟:
第一步:搜索網(wǎng)絡(luò)協(xié)議
第二步:選擇協(xié)議(Protocol)
可以使用tcp、ip、udp等位于OSI模型第2至7層的協(xié)議。點(diǎn)擊協(xié)議列表,可以選擇需要參與過(guò)濾的協(xié)議。
舉例:http.request.uri (http請(qǐng)求中的uri)
其中http為協(xié)議,request.uri是協(xié)議的子類(lèi),通過(guò) .連接。Wireshark的官網(wǎng)提供了對(duì)各種 協(xié)議以及它們子類(lèi)的說(shuō)明。
第三步:選擇比較運(yùn)算符(Comparison operators)
| 英文寫(xiě)法: | C語(yǔ)言寫(xiě)法: | 含義: |
|---|---|---|
| eq | == | 等于 |
| ne | != | 不等于 |
| gt | > | 大于 |
| lt | < | 小于 |
| ge | >= | 大于等于 |
| le | <= | 小于等于 |
| contains | contains | 包含 |
| matches | matches | 正則表達(dá)式匹配 |
| in | in | 在指定集中 |
第四步:選擇比較的值
第五步:校驗(yàn)規(guī)則是否合法
以上的每一步操作都會(huì)在下方輸入框自動(dòng)生成過(guò)濾規(guī)則,合法的規(guī)則顯示綠色背景,不合法的規(guī)則顯示紅色背景。
校驗(yàn)完成點(diǎn)擊ok,顯示過(guò)濾器規(guī)則設(shè)置完成。
多個(gè)過(guò)濾條件
若需要通過(guò)過(guò)個(gè)條件篩選數(shù)據(jù),比如:只顯示80端口和8080端口的封包。就要用到邏輯運(yùn)算符(Logical expressions),把多個(gè)條件連接。
| 英文寫(xiě)法: | C語(yǔ)言寫(xiě)法: | 含義: |
|---|---|---|
| and | && | 邏輯與 |
| or | || | 邏輯或 |
| xor | ^^ | 邏輯異或 |
| not | ! | 邏輯非 |
被程序員們熟知的邏輯異或是一種排除性的或。當(dāng)其被用在過(guò)濾器的兩個(gè)條件之間時(shí),只有當(dāng)且僅當(dāng)其中的一個(gè)條件滿(mǎn)足時(shí),這樣的結(jié)果才會(huì)被顯示在屏幕上。
舉個(gè)例子:
//只有當(dāng)目的TCP端口為80或者來(lái)源于端口1025(但又不能同時(shí)滿(mǎn)足這兩點(diǎn))時(shí),這樣的封包才會(huì)被顯示。
tcp.dstport 80 xor tcp.dstport 1025
案例
//顯示HTTP或UDP議封包
http || udp
//顯示來(lái)源或目的IP地址為10.1.1.1的封包
ip.addr == 10.1.1.1
//顯示來(lái)源不為10.1.2.3或者目的不為10.4.5.6的封包。換句話(huà)說(shuō),顯示的封包將會(huì)為:
//來(lái)源IP:除了10.1.2.3以外任意;目的IP:任意
//以及
//來(lái)源IP:任意;目的IP:除了10.4.5.6以外任意
`ip.src != 10.1.2.3 or ip.dst != 10.4.5.6`
//顯示來(lái)源不為10.1.2.3并且目的IP不為10.4.5.6的封包。換句話(huà)說(shuō),顯示的封包將會(huì)為:來(lái)源IP:除了10.1.2.3以外任意;同時(shí)須滿(mǎn)足,目的IP:除了10.4.5.6以外任意
ip.src != 10.1.2.3 and ip.dst != 10.4.5.6
//顯示來(lái)源或目的TCP端口號(hào)為25的封包
tcp.port == 25
//顯示目的TCP端口號(hào)為25的封包
tcp.dstport == 25
//顯示包含TCP標(biāo)志的封包
tcp.flags
//顯示包含TCP SYN標(biāo)志的封包
tcp.flags.syn == 0x02`
//顯示HTPP域名中包含'baidu'的封包
http.host contains "baidu"
結(jié)束語(yǔ)
至此,Wireshark的基本功能和使用方法已經(jīng)介紹完了。如果有錯(cuò)誤的地方懇請(qǐng)留言指出。
參考資料
https://wiki.wireshark.org/DisplayFilters