標籤:

Wireshark使用技巧及數據包分析方法

零、前言

Wireshark是一款圖形界面的網路嗅探器,支持多種平台,是網路流量分析的利器。它的創始人是Gerald Combs,前身是Ethereal,作為開源項目經過眾多開發者的完善它已經成為使用量最大的安全工具之一。最近剛把《Wireshark網路分析就是這麼簡單》看完,寫的很有意思,把一些心得和技巧分享一下,部分內容也也源自個人總結。本文所使用的Wireshark是2.4.0版,可以到官網下載:

wireshark.org/

一、網路分析

0x00:只抓包頭

在進行網路分析時往往只需要知道兩個節點是不是能夠聯通,具體的傳輸信息並不重要,所以抓包的時候可以設置只抓包頭,這樣就大大減少了數據包的大小,有利於數據分析。

設置方法:Capture(捕獲)-->Options(選項)-->Snaplen(Snap長度)。

將這個值設置200以下就可以抓到所有網路層次的頭信息了。

另外也可以直接點擊任務欄里的快捷鍵,快速設置

0x01:只抓必要的包

我們可以設置抓包的filter,只抓一些感興趣的包。

設置方法:Capture(捕獲)-->Options(選項)-->Capture Filter(捕獲過濾器)

在輸入框里輸入規則,然後點擊開始即可,比如輸入

dst host 220.181.111.188(捕獲目標主機為220.181.111.188的數據包)

220.181.111.188是ping baidu.com的ip地址,不同地理位置ping的ip可能不一樣,然後瀏覽器訪問百度就可以看到我們想要的捕獲結果。

0x02:過濾

使用過濾規則進行數據包篩選是Wireshark最強大的功能之一,比如如果知道問題發生的具體協議就可以以協議名稱過濾。使用協議過濾時要注意協議之間的依賴性,比如NFS共享掛載失敗,問題可能發生在掛載所用的mount協議,也可能發生在mount之前的portmap協議。

然後就是IP+埠的方式,一個比較簡單的方法就是可以在感興趣的數據包上右鍵然後點擊「追蹤流」,就可以看到與這對ip和埠的全部通信。

也可以在相應的包上右鍵-->Apply as Filter(作為過濾器應用)-->Selected(選中),Wireshark就可以自動生成相應的過濾規則。這裡給出一些常用的規則。

過濾IP:

IP源地址:ip.src ==

192.168.1.1

IP目的地址:ip.dst

== 192.168.1.1

IP地址(包括源和目的):ip.addr

== 192.168.1.1

過濾埠:

TCP埠:tcp.port==80

TCP目的埠:tcp.dstport == 80

TCP源埠:tcp.srcport == 80

UDP埠:udp.port eq 15000

TCP 1-80之間的埠:tcp.port >= 1 and tcp.port <= 80

過濾協議:

http、tcp、udp、arp、icmp、http、smtp、ftp、dns 等。

過濾MAC地址:

源MAC地址:eth.src==A0:00:00:04:C5:84

目的MAC地址:eth.dst==A0:00:00:04:C5:84

MAC地址(包括源和目的):eth.addr==A0:00:00:04:C5:84

過濾包長度:

整個UDP數據包:udp.length==20

TCP數據包中的IP數據包:tcp.len>=20

整個IP數據包:ip.len==20

整個數據包:frame.len==20

HTTP模式過濾:

請求方法為GET:http.request.method==「GET」

請求方法為POST:http.request.method==「POST」

指定URI:http.request.uri==「/img/logo-edu.gif」

請求或相應中包含特定內容:http contains 「FLAG」

0x03:自動分析

Wireshark有強大的統計分析功能,可以幫助分析人員快速統計出一些基本信息。比如點擊Analyze(分析)-->Expert Info

Composite(專家信息),就可以看到數據包的中的一些不同級別的信息統計,包含重傳次數、鏈接建立次數、網路錯誤等,在分析網路性能時這個功能很有作用。

單擊Statistics(統計)-->TCP

Stream Graph(TCP流圖形),可以生成一些統計圖表,比如下圖表示171到192的數據傳輸過程,水平線表示短暫的停止過程。

此外還可以統計分層信息、網路會話列表、網路端點列表、ip地址統計列表、應用層數據包信息等。

0x04:搜索

按「Ctrl+F」Wireshark也可以進行關鍵字搜索,選擇「分組詳情」後才可以搜索數據包中的內容,這樣的搜索可以在CTF中也許會有意外收穫。

二、CTF

下面每一種對應的操作都會給出一到幾個CTF題目的例子,幫助大家快速上手。

0x00:搜索

題目文件:key.pcapng——pan.baidu.com/s/1kVyyCb

題目描述:flag被盜,趕緊溯源!

題目題解:

首先可以只將這個數據包當做文本文件打開,比如用一些notepad++編輯器,然後直接搜索

正經的做法就是用Wireshark自帶的搜索功能找嘗試查找一些關鍵詞(比如key、flag、shell、pass等),往往直接搜索就能有意外收穫。

然後跟進可疑的數據包

根據數據包特徵,很明顯看出這是一個菜刀連接一句話木馬的數據包,然後往下找,即可看到讀取的flag

0x01:文件提取

題目文件: caidao.pcapng——pan.baidu.com/s/1kVyyCb

題目描述:有人偷偷下載了文件!

題目題解:

根據題意可能數據包中存在文件傳輸,嘗試直接導出,選擇File(文件)-->Export Objexts(導出對象),然後可以看到一些協議,比如選中http就可以看到通過http傳輸的一些文件,在右下角有導出按鈕,可生生成相應的文件。但是本題中無法用此方法直接看到被下載的文件,因為有些文件是直接通過tcp或udp協議傳輸的,http協議只能看到的訪問的鏈接,但不會看到傳輸的內容(比如你去訪問放一個鏈接download.php?file=test.rar,通過上述導出對象的方式看不出來下載的文件的內容的),如下如所示。

這個時候就需要找到那個執行下載的數據包,找到數據傳輸的部分再導出,比如下面這個數據包

大概是一個菜刀下載的過程,在最後一個包可以看到下載的文件,直接右鍵點擊「導出分組位元組流」,然後保存為.tar.gz文件

本題中最後還要使用16進位編輯器去除開頭和結尾的X@Y字元,這個是菜刀的特徵符號,不是文件內容。

再或者一個簡單的方法,右鍵「顯示分組位元組流」,去除前後各三個位元組在解壓縮

再複雜一點就是多個包的數據提取了,一個較大的文件其傳輸過程可能要經過多個數據包,比如下面這道題目。

題目文件:misc_fly.p.capng—— pan.baidu.com/s/1kVyyCb

題目描述:抓到一隻蒼蠅!

題目題解:

首先用HTTP條件過濾一下

右鍵第一個包,追蹤流

可以看到一些基本信息,首先這是一個POST數據包,發送了一些文件相關信息,包括名稱(fly.rar)和大小(525701)等。接下來應該就是文件實際上傳的數據包,將過濾條件改為

http.request.method=="POST"

從數據包的結構上看應該就是第二至第六個數據包是數據傳輸的過程。點開第二個可以看到Media

Type的長度為131436

第二到第五個都是一樣的長度,第六個為1777,應該是剩餘的最後一部分數據。但是131436*4+1777=527521!=525701,再看下第一個數據包

都知道rar文件頭應該是Rar,但是選中的數據部分前面卻多出了很多,簡單計算一下一共多出了364,且364*5+525701=527521。所以多出的也許是某種校驗數據,在導出的時候將其忽略。

每個包都做同樣的操作即可得出5個文件,再將這個文件按順序拼接即可。拼接的話可以使用16進位編輯器手動拼接,也可以使用linux下cat命令,比如「cat 1 2 3 4 5 > fly.rar」。這道題還設置了偽加密,需要修改加密位,將0x84位置改為0x80即可。

解壓出來後是一個exe可執行文件,裡面隱藏了一個png圖片,是個二維碼,掃描即可得到flag。

flag{m1Sc_oxO2_Fly} (二維碼自動識別)

Flag:flag{m1Sc_oxO2_Fly}

0x02:信息提取

題目文件: sqlmap.pcap——pan.baidu.com/s/1kVyyCb

題目描述:

題目題解:

數據包記錄的是sqlmap獲取flag的過程,使用http && http contains

"flag"過濾一下

可以看出這是一個布爾盲注的過程,一位一位的讀取flag,然後用二分法不斷判斷其ascii碼的範圍並最終確定這一位的值。第806個包是讀取flag第一位的數據包

將其payload解碼一下是這樣的,判斷其ascii碼是否大於64

id=1 AND ORD(MID((SELECT

IFNULL(CAST(`value` AS CHAR),0x20) FROM isg.flags ORDER BY `value` LIMIT

0,1),1,1))>64

然後一直到836個包判斷第一位ascii碼值大於72,然後開始從高到低遞減,判斷其ascii碼不大於73,則第一位的ascii碼值是73,對應的字元為I。以此類推,其flag為ISG{BLind_SQl_InJEcTi0N_DeTEcTEd}。本題需要一定的耐心和SQL注入基礎。但是這麼做可能有些繁瑣,其實pcap數據包可以直接用文本編輯器打開,就可以看到其中的http請求

所以可以使用字元串搜索的方式直接去查找其中的語句,然後判斷flag,首先將原數據包中的http請求導出來,另存為sqli.pcap

導出後的文件為: sqli.pcap——pan.baidu.com/s/1kVyyCb

再使用如下的Python腳本一鍵讀取即可

ISG{BLind_SQl_InJEcTi0N_DeTEcTEd}

三、Tshark

Tshark是命令行版的Wireshark,相對於Wireshark它有更好地靈活性,結合腳本程序可以發揮巨大的威力,在安裝Wireshark的時候就默認安裝了Tshark。

如下是運行-h參數,具體的參數解釋可以參考官方文檔

wireshark.org/docs/man-

比如kali下的一個簡單的使用示例(windows不知為何無法獲取網卡)

-s 512:只抓取前512個位元組

-i eth0:監聽eth0網卡

Tshark的-z參數可以進行各種信息的統計,比如下面這條命令,統計每一秒鐘里由ip為的192.168.228.128主機發出的http請求的次數

tshark -z

io,stat,1.00,http&&ip.src==192.168.228.128

程序在監聽的時候會不斷輸出攔截的數據信息

最後終止的時候則會給出一個報表

這些統計信息都可以直接寫入報告或直接導入excel進行下一步處理。

四、使用Python進行數據包分析

Python本身也可以解析數據包,它可以向Wireshark一樣將pcap數據包分層解析,然後進行數據處理,這裡需要安裝scapy模塊,如果安裝不成功可以在kali2.0里嘗試運行。網路模型大家應該有所了解,按不同的標準有七層和五層的分法,Wireshark就是按不同層次解析數據。同理scapy也是如此,下面這段代碼打開上文提到的sqlmap.pcap數據包後是這樣的

scapy主要是分為Ethernet、IP、TCP、Raw這四層,每一層都有每一層的關鍵字,可以利用鍵值對的方式直接讀取相應的內容。其實Python適合處理大量數據包的情況,比如需要從100個數據包中查找某個特徵,使用Wireshark一個一個打開就不現實,可以寫腳本批量處理。這裡給出一個示例代碼,其作用是將/root/pcap文件夾里的數據包全部讀取一遍,查找其中存在長度為32的字元串的數據包,並將其寫入到另一個文件夾中。(Python對pcapng格式的數據包處

測試數據包如下,是我們上文提到的幾個數據包及兩個測試數據包

20160813-084957.pcap/20160813-083457.pcap——pan.baidu.com/s/1kVyyCb

然後執行代碼運行

在result文件夾里可以看到20160813-084957.pcap中存在符合條件的字元串,並且生成了對應的txt文件。同理,我們可以改變查找的規則,在大量數據包中查找我們想要的信息。

五、合天相關課程推薦

這裡推薦一下和本文相關的合天實驗,可以進一步學習,鞏固加強。

wireshark使用:

hetianlab.com/cour.do?

wireshark之顯示過濾:

hetianlab.com/expc.do?

wireshark之文件還原:

hetianlab.com/expc.do?

(PS:本文屬合天原創文章,未經允許,禁止以任何形式轉載!)


推薦閱讀:

《Wireshark的簡單使用》
Wireshark 如何使用?
wireshark怎麼捕捉lacp報文?
簡明 Wireshark 和 TCP 入門指南

TAG:Wireshark |