Wireshark抓包工具使用教程以及常用抓包規則

wangkangluo1發表於2013-07-31

原文:http://fangxin.blog.51cto.com/1125131/735178

Wireshark是一個非常好用的抓包工具,當我們遇到一些和網路相關的問題時,可以通過這個工具進行分析,不過要說明的是,這只是一個工具,用法是非常靈活的,所以今天講述的內容可能無法直接幫你解決問題,但是隻要你有解決問題的思路,學習用這個軟體就非常有用了。
Wireshark官方下載地址:http://www.wireshark.org/download.html
如果記不住,可以在百度中輸入Wir就可以看到百度智慧匹配的關鍵詞了,選擇第一個地址進去下載即可。

簡單介紹下這個軟體的一些常用按鈕,因為本人也是接觸這個軟體不久,所以就簡單的說下最常用的按鈕好了,開啟軟體後,下面紅框中的按鈕從左到右依次是:
-列表顯示所有網路卡的網路包情況,一般用的很少;
-顯示抓包選項,一般都是點這個按鈕開始抓包;
-開始新的抓包,一般用的也很少;
-停止抓包,當你抓完包之後,就是點這個停止了;
-清空當前已經抓到的資料包,可以防止抓包時間過長機器變卡;

而實際上,一般我們只要知道上面加粗部分的按鈕功能,就可以完成抓包了,剩下的就是如何抓你想要的資料包,如何分析的問題了。

接下來說下抓包選項介面,也就是點第二個按鈕出來的介面,同樣,這裡也只介紹最常用的幾個功能,首先下圖中最上面的紅框是選擇需要抓的網路卡,選擇好網路卡後會在下面顯示這個網路卡的IP地址。
然後Capture Filter中就是要寫抓包規則的地方,也叫做“過濾規則”,我們下面要說的很多規則都是要寫到這個框裡的,規則寫好後,點下面的Start就開始抓包了。

當抓包結束之後,如果你需要把抓到的資料包找其他人分析,那麼可以點選單上的file,然後點Save As儲存抓到的資料包,如下圖:

ok,到這裡,基礎的使用方法說完了,接下來步入很關鍵的內容。

使用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 e­xpressions(邏輯運算子):


顯示過濾器

例子:
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包。當你發現這些不正常的包時,肯定有人對你的網路不懷好意。

UDP (使用者資料包協議User Datagram Protocol)

TCP是面向連線的,而UDP是非連線的協議。UDP沒有對接受進行確認的標記和確認機制。對丟包的處理是在應用層來完成的。(or accidental arrival).

此處需要重點注意的事情是:在正常情況下,當UDP包到達一個關閉的埠時,會返回一個UDP復位包。由於UDP是非面向連線的, 因此沒有任何確認資訊來確認包是否正確到達目的地。因此如果你的防火牆丟棄UDP包,它會開放所有的UDP埠(?)。

由於Internet上正常情況下一些包將被丟棄,甚至某些發往已關閉埠(非防火牆的)的UDP包將不會到達目的,它們將返回一個復位UDP包。

因為這個原因,UDP埠掃描總是不精確、不可靠的。

看起來大UDP包的碎片是常見的DOS (Denial of Service)攻擊的常見形式 (這裡有個DOS攻擊的例子,http://grc.com/dos/grcdos.htm ).

ICMP (網間控制訊息協議Internet Control Message Protocol)

如同名字一樣, ICMP用來在主機/路由器之間傳遞控制資訊的協議。 ICMP包可以包含診斷資訊(ping, traceroute - 注意目前unix系統中的traceroute用UDP包而不是ICMP),錯誤資訊(網路/主機/埠 不可達 network/host/port unreachable), 資訊(時間戳timestamp, 地址掩碼address mask request, etc.),或控制資訊 (source quench, redirect, etc.) 。

你可以在http://www.iana.org/assignments/icmp-parameters 中找到ICMP包的型別。

儘管ICMP通常是無害的,還是有些型別的ICMP資訊需要丟棄。

Redirect (5), Alternate Host Address (6), Router Advertisement (9) 能用來轉發通訊。

Echo (8), Timestamp (13) and Address Mask Request (17) 能用來分別判斷主機是否起來,本地時間 和地址掩碼。注意它們是和返回的資訊類別有關的。 它們自己本身是不能被利用的,但它們洩露出的資訊對攻擊者是有用的。

ICMP訊息有時也被用來作為DOS攻擊的一部分(例如:洪水ping flood ping,死 ping ?呵呵,有趣 ping of death)?/p>

包碎片注意A Note About Packet Fragmentation

如果一個包的大小超過了TCP的最大段長度MSS (Maximum Segment Size) 或MTU (Maximum Transmission Unit),能夠把此包發往目的的唯一方法是把此包分片。由於包分片是正常的,它可以被利用來做惡意的攻擊。

因為分片的包的第一個分片包含一個包頭,若沒有包分片的重組功能,包過濾器不可能檢測附加的包分片。典型的攻擊Typical attacks involve in overlapping the packet data in which packet header is 典型的攻擊Typical attacks involve in overlapping the packet data in which packet header isnormal until is it overwritten with different destination IP (or port) thereby bypassing firewall rules。包分片能作為 DOS 攻擊的一部分,它可以crash older IP stacks 或漲死CPU連線能力。

Netfilter/Iptables中的連線跟蹤程式碼能自動做分片重組。它仍有弱點,可能受到飽和連線攻擊,可以把CPU資源耗光。

OK,到此為止,關於Wireshark抓包工具的一些小教程已經寫完了,而導致我想寫這麼一個糾結的教程的原因是,前幾天通過這個抓包解決了夢幻西遊在網維大師無盤上容易掉線的問題,當時捕捉到夢幻西遊掉線時的資料包是這樣的。
注意下圖中的紅色資料,123.58.184.241是夢幻西遊的伺服器,而192.168.1.41是玩夢幻西遊的客戶機,在掉線時,發現是先有夢幻西遊的伺服器向客戶機傳送一個[FIN,ACK]資料包,根據上面的解釋,FIN標記的資料包是代表要斷開連線的意思,而接著客戶機又回給伺服器一個確認斷開連結包。當看到這個抓包資料時,就意識到,大家說的在網維大師系統虛擬盤上夢幻愛掉線的問題,並非普通的網路問題,因為通過資料包的資訊來看,是夢幻伺服器主動要求斷開連結,產生這個情況無非是以下幾個原因:
1、伺服器發現客戶端非法,比如有外掛什麼的,踢掉了客戶機;
2、伺服器壓力大,踢掉了客戶機;
3、總之不是客戶端問題導致的掉線;

那麼既然結論是如此,為什麼會有在網維大師系統虛擬盤上容易出現夢幻掉線問題呢?原因是由於網維大師系統虛擬盤是模擬真實硬碟方式來實現的,而在模擬過程中,將硬碟的序列號設定為固定過的OSDIY888了,而夢幻西遊剛好後識別客戶機硬碟資訊,發現大量客戶端的硬碟序列號都是一樣的,就認為是作弊或者使用掛機外掛了,結果就導致隨機被伺服器踢下線的情況發生,後來我們將硬碟序列號設定為空,則沒再出現該問題。這個問題在未來的新版本中會解決掉。

說這個案例的目的並不是為了說明抓包多有用,而是想說明一些解決問題的思路和方法,有些人是有思路,但是缺方法,比如不會用工具,而有些人收集了很多工具卻不會用,而我其實就屬於後者,幾年前就收集了n多工具,但是用到的沒幾個。慢慢的學會用這些工具後,發現思維+工具,解決問題是效率暴增,接下來的幾天裡,會陸續介紹寫小工具給大家,也希望大家有空學習下,有問題先百度,再自己摸索,而不是一味的求助,畢竟求人不如求己!自己能直接搞定,是皆大歡喜的事情~

注意:由於某些系統為了防止ARP攻擊,都免疫掉了一個Npptools.dll檔案,這會導致該軟體無法正常安裝,打下這個補丁就可以了。

相關文章