抓包工具 Wireshark溪食, 用來獲取網(wǎng)絡(luò)數(shù)據(jù)封包囊卜,包括 HTTP、TCP错沃、UDP 等網(wǎng)絡(luò)協(xié)議包栅组。
wireshark是開源軟件,可以放心使用枢析。 可以運(yùn)行在Windows和Mac OS上玉掸。
wireshark只能查看封包,而不能修改封包的內(nèi)容醒叁,或者發(fā)送封包司浪。
Wireshark VS Fiddler
Fiddler是在windows上運(yùn)行的程序,專門用來捕獲HTTP辐益,HTTPS的断傲。
wireshark能獲取HTTP,也能獲取HTTPS智政,但是不能解密HTTPS认罩,所以wireshark看不懂HTTPS中的內(nèi)容。
總結(jié)续捂,如果是處理HTTP,HTTPS 還是用Fiddler,? 其他協(xié)議比如TCP,UDP 就用wireshark垦垂。
同類的其他工具:微軟的network monitor宦搬,sniffer
開始抓包
wireshark是捕獲機(jī)器上的某一塊網(wǎng)卡的網(wǎng)絡(luò)包,當(dāng)你的機(jī)器上有多塊網(wǎng)卡的時(shí)候劫拗,你需要選擇一個(gè)網(wǎng)卡间校。
點(diǎn)擊Caputre->Interfaces.. 出現(xiàn)下面對(duì)話框,選擇正確的網(wǎng)卡页慷。然后點(diǎn)擊”Start”按鈕, 開始抓包憔足。
WireShark 主要分為這幾個(gè)界面
1. Display Filter(顯示過濾器),? 用于過濾
2. Packet List Pane(封包列表)酒繁, 顯示捕獲到的封包滓彰, 有源地址和目標(biāo)地址,端口號(hào)州袒。 顏色不同揭绑,代表
3. Packet Details Pane(封包詳細(xì)信息), 顯示封包中的字段
4. Dissector Pane(16進(jìn)制數(shù)據(jù))
5. Miscellanous(地址欄,雜項(xiàng))
過濾器有兩種:
一種是顯示過濾器郎哭,就是主界面上那個(gè)他匪,用來在捕獲的記錄中找到所需要的記錄
一種是捕獲過濾器,用來過濾捕獲的封包夸研,以免捕獲太多的記錄邦蜜。 在Capture -> Capture Filters 中設(shè)置
過濾表達(dá)式的規(guī)則
表達(dá)式規(guī)則
1. 協(xié)議過濾
比如TCP,只顯示TCP協(xié)議亥至。
2. IP 過濾
比如 ip.src ==192.168.1.102 顯示源地址為192.168.1.102畦徘,
ip.dst==192.168.1.102, 目標(biāo)地址為192.168.1.102
3. 端口過濾
tcp.port ==80,? 端口為80的
tcp.srcport == 80,? 只顯示TCP協(xié)議的愿端口為80的。
4. Http模式過濾
http.request.method==”GET”,?? 只顯示HTTP GET方法的抬闯。
5. 邏輯運(yùn)算符為 AND/ OR
封包列表(Packet List Pane)
封包列表的面板中顯示,編號(hào)关筒,時(shí)間戳溶握,源地址,目標(biāo)地址蒸播,協(xié)議睡榆,長度,以及封包信息袍榆。 你可以看到不同的協(xié)議用了不同的顏色顯示胀屿。
你也可以修改這些顯示顏色的規(guī)則,? View ->Coloring Rules.
封包詳細(xì)信息 (Packet Details Pane)
這個(gè)面板是我們最重要的包雀,用來查看協(xié)議中的每一個(gè)字段宿崭。
各行信息分別為
Frame:物理層的數(shù)據(jù)幀概況
EthernetII:數(shù)據(jù)鏈路層以太網(wǎng)幀頭部信息
Internet Protocol Version 4:互聯(lián)網(wǎng)層IP包頭部信息
Transmission Control Protocol:傳輸層T的數(shù)據(jù)段頭部信息,此處是TCP
Hypertext Transfer Protocol:應(yīng)用層的信息才写,此處是HTTP協(xié)議
TCP:
TCP/IP通過三次握手建立一個(gè)連接葡兑。這一過程中的三種報(bào)文是:SYN奖蔓,SYN/ACK,ACK讹堤。
第一步是找到PC發(fā)送到網(wǎng)絡(luò)服務(wù)器的第一個(gè)SYN報(bào)文吆鹤,這標(biāo)識(shí)了TCP三次握手的開始。
如果你找不到第一個(gè)SYN報(bào)文洲守,選擇Edit -> Find Packet菜單選項(xiàng)疑务。選擇Display Filter,輸入過濾條件:tcp.flags梗醇,這時(shí)會(huì)看到一個(gè)flag列表用于選擇因宇。選擇合適的flag砌创,tcp.flags.syn并且加上==1。點(diǎn)擊Find,之后trace中的第一個(gè)SYN報(bào)文就會(huì)高亮出來了蹂风。
注意:Find Packet也可以用于搜索十六進(jìn)制字符,比如惡意軟件信號(hào)陌凳,或搜索字符串娱仔,比如抓包文件中的協(xié)議命令。
一個(gè)快速過濾TCP報(bào)文流的方式是在Packet List Panel中右鍵報(bào)文虫溜,并且選擇Follow TCP Stream雹姊。這就創(chuàng)建了一個(gè)只顯示TCP會(huì)話報(bào)文的自動(dòng)過濾條件。
這一步驟會(huì)彈出一個(gè)會(huì)話顯示窗口衡楞,默認(rèn)情況下包含TCP會(huì)話的ASCII代碼吱雏,客戶端報(bào)文用紅色表示,服務(wù)器報(bào)文則為藍(lán)色瘾境。
HTTP
當(dāng)HTTP發(fā)送初始GET命令之后歧杏,TCP繼續(xù)數(shù)據(jù)傳輸過程,接下來的鏈接過程中HTTP會(huì)從服務(wù)器請(qǐng)求數(shù)據(jù)并使用TCP將數(shù)據(jù)傳回客戶端迷守。傳送數(shù)據(jù)之前犬绒,服務(wù)器通過發(fā)送HTTP? OK消息告知客戶端請(qǐng)求有效。如果服務(wù)器沒有將目標(biāo)發(fā)送給客戶端的許可兑凿,將會(huì)返回403 Forbidden凯力。如果服務(wù)器找不到客戶端所請(qǐng)求的目標(biāo),會(huì)返回404礼华。
如果沒有更多數(shù)據(jù)咐鹤,連接可被終止,類似于TCP三次握手信號(hào)的SYN和ACK報(bào)文圣絮,這里發(fā)送的是FIN和ACK報(bào)文祈惶。當(dāng)服務(wù)器結(jié)束傳送數(shù)據(jù),就發(fā)送FIN/ACK給客戶端,此報(bào)文表示結(jié)束連接行瑞。接下來客戶端返回ACK報(bào)文并且對(duì)FIN/ACK中的序列號(hào)加1奸腺。這就從服務(wù)器端終止了通信。要結(jié)束這一過程客戶端必須重新對(duì)服務(wù)器端發(fā)起這一過程血久。必須在客戶端和服務(wù)器端都發(fā)起并確認(rèn)FIN/ACK過程突照。
基本IO Graphs:
IO graphs是一個(gè)非常好用的工具⊙跬拢基本的Wireshark IO
graph會(huì)顯示抓包文件中的整體流量情況讹蘑,通常是以每秒為單位(報(bào)文數(shù)或字節(jié)數(shù))。默認(rèn)X軸時(shí)間間隔是1秒筑舅,Y軸是每一時(shí)間間隔的報(bào)文數(shù)座慰。如果想要查看每秒bit數(shù)或byte數(shù),點(diǎn)擊“Unit”翠拣,在“Y
Axis”下拉列表中選擇想要查看的內(nèi)容版仔。這是一種基本的應(yīng)用,對(duì)于查看流量中的波峰/波谷很有幫助误墓。要進(jìn)一步查看蛮粮,點(diǎn)擊圖形中的任意點(diǎn)就會(huì)看到報(bào)文的細(xì)節(jié)。
過濾:
每一個(gè)圖形都可以應(yīng)用一個(gè)過濾條件谜慌。這里創(chuàng)建兩個(gè)不同的graph然想,一個(gè)HTTP一個(gè)ICMP⌒婪叮可以看到過濾條件中Graph 1使用“http”Graph 2使用“icmp”变泄。圖中可以看到紅色I(xiàn)CMP流量中有些間隙,進(jìn)一步分析恼琼。
常用排錯(cuò)過濾條件:
對(duì)于排查網(wǎng)絡(luò)延時(shí)/應(yīng)用問題有一些過濾條件是非常有用的:
tcp.analysis.lost_segment:表明已經(jīng)在抓包中看到不連續(xù)的序列號(hào)妨蛹。報(bào)文丟失會(huì)造成重復(fù)的ACK,這會(huì)導(dǎo)致重傳晴竞。
tcp.analysis.duplicate_ack:顯示被確認(rèn)過不止一次的報(bào)文滑燃。大涼的重復(fù)ACK是TCP端點(diǎn)之間高延時(shí)的跡象。
tcp.analysis.retransmission:顯示抓包中的所有重傳颓鲜。如果重傳次數(shù)不多的話還是正常的,過多重傳可能有問題典予。這通常意味著應(yīng)用性能緩慢和/或用戶報(bào)文丟失甜滨。
tcp.analysis.window_update:將傳輸過程中的TCP window大小圖形化。如果看到窗口大小下降為零瘤袖,這意味著發(fā)送方已經(jīng)退出了衣摩,并等待接收方確認(rèn)所有已傳送數(shù)據(jù)。這可能表明接收端已經(jīng)不堪重負(fù)了。
tcp.analysis.bytes_in_flight:某一時(shí)間點(diǎn)網(wǎng)絡(luò)上未確認(rèn)字節(jié)數(shù)艾扮。未確認(rèn)字節(jié)數(shù)不能超過你的TCP窗口大屑惹佟(定義于最初3此TCP握手),為了最大化吞吐量你想要獲得盡可能接近TCP窗口大小泡嘴。如果看到連續(xù)低于TCP窗口大小甫恩,可能意味著報(bào)文丟失或路徑上其他影響吞吐量的問題。
tcp.analysis.ack_rtt:衡量抓取的TCP報(bào)文與相應(yīng)的ACK酌予。如果這一時(shí)間間隔比較長那可能表示某種類型的網(wǎng)絡(luò)延時(shí)(報(bào)文丟失磺箕,擁塞,等等)抛虫。
函數(shù):
IO Graphs有六個(gè)可用函數(shù):SUM,?MIN, AVG, MAX, COUNT, LOAD松靡。
MIN( ), AVG( ), MAX( )
首先看一下幀之間的最小,平均和最大時(shí)間建椰,這對(duì)于查看幀/報(bào)文之間的延時(shí)非常有用雕欺。我們可以將這些函數(shù)結(jié)合“frame.time_delta”過濾條件看清楚幀延時(shí),并使得往返延時(shí)更為明顯棉姐。如果抓包文件中包含不同主機(jī)之間的多個(gè)會(huì)話屠列,而只想知道其中一個(gè)pair,可將“frame.time_delta”結(jié)合源和目標(biāo)主機(jī)條件如“ip.addr==x.x.x.x &&ip.addr==y.y.y.y”谅海。如下圖所示:
我們做了以下步驟:
將Y軸設(shè)置為“Advanced”脸哀,讓Caculation域可見。不做這一步就看不到計(jì)算選項(xiàng)扭吁。
X軸時(shí)間間隔1秒撞蜂,所以每個(gè)柱狀圖代表1秒間隔的計(jì)算結(jié)果。
過濾出兩個(gè)特定IP地址的HTTP會(huì)話侥袜,使用條件:“(ip.addr==192.168.1.4&&?ip.addr==128.173.87.169) && http”蝌诡。
使用3個(gè)不同的graph,分別計(jì)算Min(), Avg(), Max()枫吧。
對(duì)每一個(gè)計(jì)算結(jié)果應(yīng)用條件“frame.time_delta”浦旱,將style設(shè)置成“FBar”,顯示效果最佳九杂。
Count( ):此函數(shù)計(jì)算時(shí)間間隔內(nèi)事件發(fā)生的次數(shù)颁湖,在查看TCP分析標(biāo)識(shí)符時(shí)很有用,例如重傳例隆。
Sum( ):該函數(shù)統(tǒng)計(jì)事件的累加值甥捺。有兩種常見的用例是看在捕獲TCP數(shù)據(jù)量,以及檢查TCP序列號(hào)镀层。
協(xié)議過濾器:
arp:顯示所有包括ARP請(qǐng)求和回復(fù)在內(nèi)的所有ARP數(shù)據(jù)流镰禾。
ip:顯示內(nèi)含IPv4頭在內(nèi)的(如ICMP目的地址不可達(dá)報(bào)文,在ICMP報(bào)文頭之后返回到來方向的IPv4頭)IP數(shù)據(jù)流。
ipv6:顯示所有IPv6數(shù)據(jù)流吴侦,包括內(nèi)含IPv6報(bào)文頭的IPv4報(bào)文屋休,如6to4,Teredo备韧,以及ISATAP數(shù)據(jù)流劫樟。
tcp:顯示所有基于TCP的數(shù)據(jù)流。
應(yīng)用過濾器:
bootp:顯示所有DHCP數(shù)據(jù)流(基于BOOTP)盯蝴。
dns:顯示包括TCP區(qū)域傳輸以及基于標(biāo)準(zhǔn)UDP的DNS請(qǐng)求和回復(fù)在內(nèi)的所有DNS數(shù)據(jù)流毅哗。
tftp:顯示所有TFTP(Trivial File Transfer Protocol)數(shù)據(jù)流。
http:顯示所有HTTP命令捧挺,回復(fù)以及數(shù)據(jù)傳輸報(bào)文虑绵,但不顯示TCP握手報(bào)文,TCP ACK報(bào)文以及TCP結(jié)束報(bào)文闽烙。
icmp:顯示所有ICMP報(bào)文翅睛。
域過濾器:
boot.option.hostname:顯示所有包含主機(jī)名的DHCP數(shù)據(jù)流(DHCP基于BOOTP)。
http:host:顯示所有包含HTTP主機(jī)名字段的所有HTTP報(bào)文黑竞。此報(bào)文是客戶端向網(wǎng)絡(luò)服務(wù)器發(fā)送請(qǐng)求時(shí)發(fā)出的捕发。
ftp.request.command:顯示所有包含命令的FTP數(shù)據(jù)流,比如USER很魂,PASS扎酷,或RETR命令。
字符過濾器:
tcp.analysis.flags:顯示所有包含TCP分析標(biāo)識(shí)的所有報(bào)文遏匆,包括報(bào)文丟失法挨,重傳,或零窗口標(biāo)識(shí)幅聘。
tcp.analysis,zero_window:顯示含有表明發(fā)送方的接收緩存用完標(biāo)識(shí)的報(bào)文凡纳。
顯示過濾器比較運(yùn)算符:
通過擴(kuò)展過濾條件可查找某一域值,Wireshark針對(duì)此功能支持?jǐn)?shù)字比較運(yùn)算符帝蒿。
1. ==或eq
例如:ip.src == 10.2.2.2
顯示所有源地址為10.2.2.2的IPv4數(shù)據(jù)流
2. 荐糜!=或ne
例如:tcp.srcport != 80
顯示源端口除了80以外的所有TCP數(shù)據(jù)流
3. >或gt
例如:frame.time_relative > 1
顯示距前一個(gè)報(bào)文到達(dá)時(shí)間相差1秒的報(bào)文
4. <或lt
例如:tcp.window_size < 1460
顯示當(dāng)TCP接收窗口小于1460字節(jié)時(shí)的報(bào)文
5. >=或ge
例如:dns.count.answers >= 10
顯示包含10個(gè)以上answer的DNS響應(yīng)報(bào)文
6. <=或le
例如:ip.ttl <= 10
顯示IP報(bào)文中Time to Live字段小于等于10的報(bào)文
7. contains
例如:http contains “GET”
顯示所有HTTP客戶端發(fā)送給HTTP服務(wù)器的GET請(qǐng)求
對(duì)于基于TCP應(yīng)用的過濾條件采用比較運(yùn)算符。例如葛超,如果想看端口80上面的HTTP數(shù)據(jù)流暴氏,使用HTTP.port==80。
小貼士:
運(yùn)算符兩邊不用留空格绣张。ip.src == 10.2.2.2與ip.src==10.2.2.2的效果是相同的答渔。
過濾HTTP數(shù)據(jù)流:
在排查網(wǎng)頁瀏覽器會(huì)話或檢查網(wǎng)速過慢問題時(shí),對(duì)瀏覽器會(huì)話進(jìn)行過濾就顯得尤為重要胖替。過濾HTTP數(shù)據(jù)流有兩種方式:
http
tcp.port==xx(xx表示所使用的HTTP端口)
第二種過濾方法更加有效。