Wireshark 使用與功能介紹


fidder主要是針對http(s)協議進行抓包分析的,所以類似wireshark/tcpdump這種工作在tcp/ip層上的抓包工具不太一樣,這種工具一般在chrome/firefox的開發者工具下都有集成。

安裝wireshare會推薦安裝winpcap,winpcap(windows packet capture)是windows平台下一個免費,公共的網絡訪問系統。開發winpcap這個項目的目的在於為win32應用程序提供訪問網絡底層的能力.

Wireshark介紹

wireshark的官方下載網站: http://www.wireshark.org/

wireshark是非常流行的網絡封包分析軟件,功能十分強大。可以截取各種網絡封包,顯示網絡封包的詳細信息。

wireshark是開源軟件,可以放心使用。
可以運行在Windows和Mac OS上。

使用wireshark的人必須了解網絡協議,否則就看不懂wireshark了。

Wireshark不能做的

為了安全考慮,wireshark只能查看封包,而不能修改封包的內容,或者發送封包。

Wireshark VS Fiddler

Fiddler是在windows上運行的程序,專門用來捕獲HTTP,HTTPS的。

wireshark能獲取HTTP,也能獲取HTTPS,但是不能解密HTTPS,所以wireshark看不懂HTTPS中的內容

總結,如果是處理HTTP,HTTPS 還是用Fiddler,  其他協議比如TCP,UDP 就用wireshark

同類的其他工具

微軟的network monitor

sniffer

什么人會用到wireshark

1. 網絡管理員會使用wireshark來檢查網絡問題

2. 軟件測試工程師使用wireshark抓包,來分析自己測試的軟件

3. 從事socket編程的工程師會用wireshark來調試

4. 聽說,華為,中興的大部分工程師都會用到wireshark。

總之跟網絡相關的東西,都可能會用到wireshark.

sniffer:

1.安裝sniffer后,運行時,找不到網卡,(sniffer在win 7下找不到網卡)
解決方法:點擊開始—找到sniffer的快捷方式—右鍵屬性—把兼容模式改為“windows xp sp3”—確定—再次運行,就可以找到網卡了。。。

2.運行sniffer時,里面的儀表盤不動,並且頂部提示“channels A and B link faults”點擊“開始抓包“時,電腦藍屏重啟…
解決方法:出現這種問題的原因是你的sniffer版本低,識別不了自己的千兆網卡,把自己的sniffer升級到SNIFFER PORTABLE V4.7.5 SP5再運行,一切就OK,
3.sniffer可以用了,過一段時間就出現一個窗口,提示“腳本錯誤“,
解決方法:這是因為電腦里面的Java的原因,安裝完Java后,就可以了,如果安裝完Java,還是有提示窗口,那就不用理他,對抓包沒有什么影響。

安裝后點擊運行就藍屏。

這種情況是本本或者台式機是千兆網卡~ 千兆網卡必須得用Sniffer的SP5版本才可以~ 只有SP5版本支持千兆網卡!下載SnifferPro_V4.7.5 SP5,

wireshark是捕獲機器上的某一塊網卡的網絡包,當你的機器上有多塊網卡的時候,你需要選擇一個網卡。

點擊Caputre->Interfaces.. 出現下面對話框,選擇正確的網卡。然后點擊“Start”按鈕, 開始抓包


窗口:


WireShark 主要分為這幾個界面

1. Display Filter(顯示過濾器),  用於過濾

2. Packet List Pane(封包列表),
顯示捕獲到的封包,
有源地址和目標地址,端口號。
顏色不同,代表

3. Packet Details Pane(封包詳細信息), 顯示封包中的字段

4. Dissector Pane(16進制數據)

5. Miscellanous(地址欄,雜項)

Wireshark 顯示過濾


使用過濾是非常重要的,
初學者使用wireshark時,將會得到大量的冗余信息,在幾千甚至幾萬條記錄中,以至於很難找到自己需要的部分。搞得暈頭轉向。

過濾器會幫助我們在大量的數據中迅速找到我們需要的信息。

過濾器有兩種,

一種是顯示過濾器,就是主界面上那個,用來在捕獲的記錄中找到所需要的記錄

一種是捕獲過濾器,用來過濾捕獲的封包,以免捕獲太多的記錄。
在Capture -> Capture Filters 中設置。

過濾表達式的規則

表達式規則

 1. 協議過濾

比如TCP,只顯示TCP協議。

2. IP 過濾

比如 ip.src ==192.168.1.102 顯示源地址為192.168.1.102,

ip.dst==192.168.1.102, 目標地址為192.168.1.102

3. 端口過濾

tcp.port ==80,  端口為80的

tcp.srcport == 80,  只顯示TCP協議的願端口為80的。

4. Http模式過濾

http.request.method==”GET”,   只顯示HTTP GET方法的。

5. 邏輯運算符為&& ||

常用的過濾表達式

過濾表達式

用途

http

只查看HTTP協議的記錄

ip.src ==192.168.1.102 || ip.dst==192.168.1.102

 源地址或者目標地址是192.168.1.102

 

 

 

 

搜索比較操作符
————————————————————–

http模式過濾:
http.request.method == (“GET” / “POST”)
http.request.uri == ” *** ”

 http.request.full_uri
http contains  ” ** ”


另外還有一些操作符只能使用類英語簡寫,不能使用類c語言簡寫。
contains 判斷一個協議,字段或者分片包含一個值
matches             判斷一個協議或者字符串匹配一個給定的Perl表達式

“contains”操作符允許一個過濾器搜索一串字符,其形式為字符串,或者字節,或者字節組。例如在搜索一個HTTP URL地址,可以使用下面的過濾器:
http contains “http://www.wireshark.org”
“contains”操作符不能被用於原子型的字段,比如數字和ip地址。

“matches “操作符允許一個過濾器使用與Perl兼容的正則表達式(PCRE)。“matches” 操作符只能應用於協議或者字符串類型的協議字段。例如:搜索一個給定的wAP WSP User-Agent,你可以這樣寫過濾器:
wsp.user_agent matches “(?i)cldc”

封包列表(Packet List Pane)

封包列表的面板中顯示,編號,時間戳,源地址,目標地址,協議,長度,以及封包信息。
你可以看到不同的協議用了不同的顏色顯示。

封包詳細信息 (Packet Details Pane)

這個面板是我們最重要的,用來查看協議中的每一個字段。

各行信息分別為

Frame:   物理層的數據幀概況

Ethernet II: 數據鏈路層以太網幀頭部信息

Internet Protocol Version 4: 互聯網層IP包頭部信息

Transmission Control Protocol:  傳輸層T的數據段頭部信息,此處是TCP

Hypertext Transfer Protocol:  應用層的信息,此處是HTTP協議

從下圖可以看到wireshark捕獲到的TCP包中的每個字段。


實例分析TCP三次握手過程

看到這,
基本上對wireshak有了初步了解,
現在我們看一個TCP三次握手的實例

 三次握手過程為


這圖我都看過很多遍了,
這次我們用wireshark實際分析下三次握手的過程。

打開wireshark, 打開瀏覽器輸入 http://www.cnblogs.com/tankxiao

在wireshark中輸入http過濾,
然后選中GET /tankxiao HTTP/1.1的那條記錄,右鍵然后點擊“Follow TCP Stream”,

這樣做的目的是為了得到與瀏覽器打開網站相關的數據包,將得到如下圖


圖中可以看到wireshark截獲到了三次握手的三個數據包。第四個包才是HTTP的,
這說明HTTP的確是使用TCP建立連接的。

第一次握手數據包

客戶端發送一個TCP,標志位為SYN,序列號為0,
代表客戶端請求建立連接。
如下圖


第二次握手的數據包

服務器發回確認包, 標志位為 SYN,ACK. 將確認序號(Acknowledgement Number)設置為客戶的I S N加1以.即0+1=1,
如下圖


第三次握手的數據包

客戶端再次發送確認包(ACK) SYN標志位為0,ACK標志位為1.並且把服務器發來ACK的序號字段+1,放在確定字段中發送給對方.並且在數據段放寫ISN的+1, 如下圖:


第三次握手的數據包

客戶端再次發送確認包(ACK) SYN標志位為0,ACK標志位為1.並且把服務器發來ACK的序號字段+1,放在確定字段中發送給對方.並且在數據段放寫ISN的+1, 如下圖:

參考了:http://www.cnblogs.com/tankxiao/archive/2012/10/10/2711777.html

 (上圖中的stream index是什么?

the stream index is an internal Wireshark mapping to: [IP address A, TCP port A, IP address B, TCP port B]

All the packets for the same tcp.stream value should have the same values for these fields (though the src/dest will be switched for A->B and B->A packets)

see the Statistics/Conversations/TCP tab in Wireshark to show a summary of these streams

http://stackoverflow.com/questions/6076897/follow-tcp-stream-where-does-field-stream-index-come-from

Statistics/Conversations/TCP
Statistics/Conversations/endpoints/tcp
可以看到這些索引號對應的數據流

)

“Follow TCP Stream”

如果你處理TCP協議,想要查看Tcp流中的應用層數據,“Following TCP streams”功能將會很有用。如果你項查看telnet流中的密碼,或者你想嘗試弄明白一個數據流。或者你僅僅只需要一個顯示過濾來顯示某個TCP流的包。這些都可以通過Wireshark的“Following TCP streams”功能來實現。

在包列表中選擇一個你感興趣的TCP包,然后選擇Wireshark工具欄菜單的“Following TCP Streams”選項(或者使用包列表鼠標右鍵的上下文菜單)。然后,Wireshark就會創建合適的顯示過濾器,並彈出一個對話框顯示TCP流的所有數據。

“Follow TCP Stream”對話框


流的內容出現的順序同他們在網絡中出現的順序一致。從A到B的通信標記為紅色,從B到A的通信標記為藍色。當然,如果你喜歡的話你可以從“Edit/Preferences”菜單項的“Colores”修改顏色。

非打印字符將會被顯示為圓點。XXX – What about line wrapping (maximum line length) and CRNL conversions?

在捕捉過程中,TCP流不能實時更新。想得到最近的內容需要重新打開對話框。

你可以在此對話框執行如下操作:

  1. Save As 以當前選擇格式保存流數據。
  2. Print 以當前選擇格式打印流數據。
  3. Direction 選擇流的顯示方向(“Entire conversation”, “data from A to B only” or “data from B to A only”).
  4. Filter out this stream 應用一個顯示過濾,在顯示中排除當前選擇的TCP流。
  5. Close 關閉當前對話框。移除對當前顯示過濾的影響。

你可以用以下格式瀏覽流數據。

  1. AsCII。在此視圖下你可以以ASCII凡是查看數據。當然最適合基於ASCII的協議用,例如HTTP.
  2. EBCDIC。For the big-iron freaks out there.(不知道這句是什么意思, EBCDIC 是IBM公司的字符二進制編碼標准。)
  3. HEX Dump. 允許你查看所有數據,可能會占用大量屏幕空間。適合顯示二進制協議。
  4. C Arrays. 允許你將流數據導入你自己的C語言程序。
  5. RAW
    允許你載入原始數據到其他應用程序做進一步分析。顯示類似與ASCII設置。但“save As”將會保存為二進制文件

參考:http://blog.itpub.net/14766028/viewspace-705060

更多:http://openmaniak.com/cn/wireshark_use.php

 wireshark抓包之前設置:


Interface:指定在哪個接口(網卡)上抓包(系統會自動選擇一塊網卡)。

Limit each packet:限制每個包的大小,缺省情況不限制。

Capture packets in promiscuous mode:是否打開混雜模式。如果打開,抓   取所有的數據包。一般情況下只需要監聽本機收到或者發出的包,因此應該關閉這個選項。

Filter:過濾器。只抓取滿足過濾規則的包。

File:可輸入文件名稱將抓到的包寫到指定的文件中。

Use ring buffer: 是否使用循環緩沖。缺省情況下不使用,即一直抓包。循環緩沖只有在寫文件的時候才有效。如果使用了循環緩沖,還需要設置文件的數目,文件多大時回卷。

Update list of packets in real time:如果復選框被選中,可以使每個數據包在被截獲時就實時顯示出來,而不是在嗅探過程結束之后才顯示所有截獲的數據包。

單擊”OK”按鈕開始抓包,系統顯示出接收的不同數據包的統計信息,單擊”Stop”按鈕停止抓包后,所抓包的分析結果顯示在面板中,如下圖所示:

驗證網絡字節序

網絡上的數據流是字節流,對於一個多字節數值(比如十進制1014 = 0x03 f6),在進行網絡傳輸的時候,先傳遞哪個字節,即先傳遞高位”03″還是先傳遞低位”f6″。 也就是說,當接收端收到第一個字節的時候,它是將這個字節作為高位還是低位來處理。
下面通過截圖具體說明:


最下面是物理媒體上傳輸的字節流的最終形式,都是16進制表示,發送時按順序先發送00 23 54 c3 …00 03 f6 …接收時也按此順序接收字節。

選中total length:1014, 它的十六進制表示是0x03f6, 從下面的藍色選中區域可以看到,03在前面,f6在后面,即高字節數據在低地址,低字節數據在高地址(圖中地址從上到下從左到右依次遞增),所以可知,網絡字節序采用的是大端模式。

 wireshark過濾器

過濾器的區別
捕捉過濾器(CaptureFilters):用於決定將什么樣的信息記錄在捕捉結果中。需要在開始捕捉前設置。
顯示過濾器(DisplayFilters):在捕捉結果中進行詳細查找。他們可以在得到捕捉結果后隨意修改。
那么我應該使用哪一種過濾器呢?

兩種過濾器的目的是不同的。
捕捉過濾器是數據經過的第一層過濾器,它用於控制捕捉數據的數量,以避免產生過大的日志文件。
顯示過濾器是一種更為強大(復雜)的過濾器。它允許您在日志文件中迅速准確地找到所需要的記錄。

兩種過濾器使用的語法是完全不同的。

捕捉過濾器


Protocol(協議):
可能的值: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp and udp.
如果沒有特別指明是什么協議,則默認使用所有支持的協議。

Direction(方向):
可能的值: src, dst, src and dst, src or dst
如果沒有特別指明來源或目的地,則默認使用 “src or dst” 作為關鍵字。
例如,“host 10.2.2.2″與“src or dst host 10.2.2.2″是一樣的。

Host(s):
可能的值: net, port, host, portrange.
如果沒有指定此值,則默認使用“host”關鍵字。
例如,“src 10.1.1.1″與“src host 10.1.1.1″相同。

Logical Operations(邏輯運算):
可能的值:not, and, or.
否(“not”)具有最高的優先級。或(“or”)和與(“and”)具有相同的優先級,運算時從左至右進行。
例如,
“not tcp port 3128 and tcp port 23″與“(not tcp port 3128) and tcp port 23″相同。
“not tcp port 3128 and tcp port 23″與“not (tcp port 3128 and tcp port 23)”不同。

例子:

tcp dst port 3128  //捕捉目的TCP端口為3128的封包。
ip src host 10.1.1.1  //捕捉來源IP地址為10.1.1.1的封包。
host 10.1.2.3  //捕捉目的或來源IP地址為10.1.2.3的封包。
ether host e0-05-c5-44-b1-3c //捕捉目的或來源MAC地址為e0-05-c5-44-b1-3c的封包。如果你想抓本機與所有外網通訊的數據包時,可以將這里的mac地址換成路由的mac地址即可。
src portrange 2000-2500  //捕捉來源為UDP或TCP,並且端口號在2000至2500范圍內的封包。
not imcp  //顯示除了icmp以外的所有封包。(icmp通常被ping工具使用)
src host 10.7.2.12 and not dst net 10.200.0.0/16 //顯示來源IP地址為10.7.2.12,但目的地不是10.200.0.0/16的封包。
(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  //捕捉來源IP為10.4.1.12或者來源網絡為10.6.0.0/16,目的地TCP端口號在200至10000之間,並且目的位於網絡 10.0.0.0/8內的所有封包。
src net 192.168.0.0/24
src net 192.168.0.0 mask 255.255.255.0  //捕捉源地址為192.168.0.0網絡內的所有封包。

注意事項:

當使用關鍵字作為值時,需使用反斜杠“/”。
“ether proto /ip” (與關鍵字“ip”相同).
這樣寫將會以IP協議作為目標。

“ip proto /icmp” (與關鍵字“icmp”相同).
這樣寫將會以ping工具常用的icmp作為目標。

可以在“ip”或“ether”后面使用“multicast”及“broadcast”關鍵字。
當您想排除廣播請求時,“no broadcast”就會非常有用。

Protocol(協議):
您可以使用大量位於OSI模型第2至7層的協議。點擊“Expression…”按鈕后,您可以看到它們。
比如:IP,TCP,DNS,SSH

String1, String2 (可選項):

協議的子類。
點擊相關父類旁的“+”號,然后選擇其子類。

Comparison operators (比較運算符):
可以使用6種比較運算符:


Logical expressions(邏輯運算符):


顯示過濾器


例子:
snmp || dns || icmp //顯示SNMP或DNS或ICMP封包。
ip.addr == 10.1.1.1  //顯示來源或目的IP地址為10.1.1.1的封包。
ip.src != 10.1.2.3 or ip.dst != 10.4.5.6  //顯示來源不為10.1.2.3或者目的不為10.4.5.6的封包。
換句話說,顯示的封包將會為:
來源IP:除了10.1.2.3以外任意;目的IP:任意
以及
來源IP:任意;目的IP:除了10.4.5.6以外任意
ip.src != 10.1.2.3 and ip.dst != 10.4.5.6  //顯示來源不為10.1.2.3並且目的IP不為10.4.5.6的封包。
換句話說,顯示的封包將會為:
來源IP:除了10.1.2.3以外任意;同時須滿足,目的IP:除了10.4.5.6以外任意
tcp.port == 25  //顯示來源或目的TCP端口號為25的封包。
tcp.dstport == 25  //顯示目的TCP端口號為25的封包。
tcp.flags  //顯示包含TCP標志的封包。
tcp.flags.syn == 0×02  //顯示包含TCP SYN標志的封包。
如果過濾器的語法是正確的,表達式的背景呈綠色。如果呈紅色,說明表達式有誤。
更為詳細的說明請見:http://openmaniak.com/cn/wireshark_filters.php

以上只是抓包和簡單的過濾,那么其實如果你要想達到能夠分析這些網絡包的要求時,還需要了解下一些數據包的標記,比如我們常說的TCP三次握手是怎么回事?

三次握手Three-way Handshake
一個虛擬連接的建立是通過三次握手來實現的
1. (Client) –> [SYN] –> (Server)
假如Client和Server通訊. 當Client要和Server通信時,Client首先向Server發一個SYN (Synchronize) 標記的包,告訴Server請求建立連接.
注意: 一個 SYN包就是僅SYN標記設為1的TCP包(參見TCP包頭Resources). 認識到這點很重要,只有當Server收到Client發來的SYN包,才可建立連接,除此之外別無他法。因此,如果你的防火牆丟棄所有的發往外網接口的SYN包,那么你將不
能讓外部任何主機主動建立連接。

2. (Client) <– [SYN/ACK] <–(Server)
接着,Server收到來自Client發來的SYN包后,會發一個對SYN包的確認包(SYN/ACK)給Client,表示對第一個SYN包的確認,並繼續握手操作.
注意: SYN/ACK包是僅SYN 和 ACK 標記為1的包.

3. (Client) –> [ACK] –> (Server)
Client收到來自Server的SYN/ACK 包,Client會再向Server發一個確認包(ACK),通知Server連接已建立。至此,三次握手完成,一個TCP連接完成。
Note: ACK包就是僅ACK 標記設為1的TCP包. 需要注意的是當三此握手完成、連接建立以后,TCP連接的每個包都會設置ACK位。

這就是為何連接跟蹤很重要的原因了. 沒有連接跟蹤,防火牆將無法判斷收到的ACK包是否屬於一個已經建立的連接.一般的包過濾(Ipchains)收到ACK包時,會讓它通過(這絕對不是個
好主意). 而當狀態型防火牆收到此種包時,它會先在連接表中查找是否屬於哪個已建連接,否則丟棄該包。

四次握手Four-way Handshake
四次握手用來關閉已建立的TCP連接

1. (Client) –> ACK/FIN –> (Server)
2. (Client) <– ACK <– (Server)
3. (Client) <– ACK/FIN <– (Server)
4. (Client) –> ACK –> (Server)

注意: 由於TCP連接是雙向連接, 因此關閉連接需要在兩個方向上做。ACK/FIN 包(ACK 和FIN 標記設為1)通常被認為是FIN(終結)包.然而, 由於連接還沒有關閉, FIN包總是打上ACK標記. 沒有ACK標記而僅有FIN標記的包不是合法的包,並且通常被認為是惡意的。

連接復位Resetting a connection

四次握手不是關閉TCP連接的唯一方法. 有時,如果主機需要盡快關閉連接(或連接超時,端口或主機不可達),RST (Reset)包將被發送. 注意在,由於RST包不是TCP連接中的必須部分, 可以只發送RST包(即不帶ACK標記). 但在正常的TCP連接中RST包可以帶ACK確認標記

請注意RST包是可以不要收到方確認的?

無效的TCP標記Invalid TCP Flags

到目前為止,你已經看到了 SYN, ACK, FIN, 和RST 標記. 另外,還有PSH (Push) 和URG (Urgent)標記.

最常見的非法組合是SYN/FIN 包. 注意:由於 SYN包是用來初始化連接的, 它不可能和 FIN和RST標記一起出現. 這也是一個惡意攻擊.

由於現在大多數防火牆已知 SYN/FIN 包, 別的一些組合,例如SYN/FIN/PSH, SYN/FIN/RST, SYN/FIN/RST/PSH。很明顯,當網絡中出現這種包時,很你的網絡肯定受到攻擊了。

別的已知的非法包有FIN (無ACK標記)和“NULL”包。如同早先討論的,由於ACK/FIN包的出現是為了關閉一個TCP連接,那么正常的FIN包總是帶有 ACK 標記。“NULL”包就是沒有任何TCP標記的包(URG,ACK,PSH,RST,SYN,FIN都為0)。

到目前為止,正常的網絡活動下,TCP協議棧不可能產生帶有上面提到的任何一種標記組合的TCP包。當你發現這些不正常的包時,肯定有人對你的網絡不懷好意。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM