前言
Wireshark是一款圖形界面的網絡嗅探器,支持多種平台,是網絡流量分析的利器。它的創始人是Gerald Combs,前身是Ethereal,作為開源項目經過眾多開發者的完善它已經成為使用量最大的安全工具之一。最近剛把《Wireshark網絡分析就是這么簡單》看完,寫的很有意思,把一些心得和技巧分享一下,部分內容也也源自個人總結。本文所使用的Wireshark是2.4.0版,可以到官網下載:
一、網絡分析
0×00:只抓包頭
在進行網絡分析時往往只需要知道兩個節點是不是能夠聯通,具體的傳輸信息並不重要,所以抓包的時候可以設置只抓包頭,這樣就大大減少了數據包的大小,有利於數據分析。
設置方法:Capture(捕獲)–>Options(選項)–>Snaplen(Snap長度)。
將這個值設置200以下就可以抓到所有網絡層次的頭信息了。
另外也可以直接點擊任務欄里的快捷鍵,快速設置
0×01:只抓必要的包
我們可以設置抓包的filter,只抓一些感興趣的包。
設置方法:Capture(捕獲)–>Options(選項)–>Capture Filter(捕獲過濾器)
在輸入框里輸入規則,然后點擊開始即可,比如輸入
dst host 220.181.111.188(捕獲目標主機為220.181.111.188的數據包)
220.181.111.188是ping www.baidu.com的ip地址,不同地理位置ping的ip可能不一樣,然后瀏覽器訪問百度就可以看到我們想要的捕獲結果。
0×02:過濾
使用過濾規則進行數據包篩選是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”
0×03:自動分析
Wireshark有強大的統計分析功能,可以幫助分析人員快速統計出一些基本信息。比如點擊Analyze(分析)–>Expert InfoComposite(專家信息),就可以看到數據包的中的一些不同級別的信息統計,包含重傳次數、鏈接建立次數、網絡錯誤等,在分析網絡性能時這個功能很有作用。
單擊Statistics(統計)–>TCPStream Graph(TCP流圖形),可以生成一些統計圖表,比如下圖表示171到192的數據傳輸過程,水平線表示短暫的停止過程。
此外還可以統計分層信息、網絡會話列表、網絡端點列表、ip地址統計列表、應用層數據包信息等。
0×04:搜索
按“Ctrl+F”Wireshark也可以進行關鍵字搜索,選擇“分組詳情”后才可以搜索數據包中的內容,這樣的搜索可以在CTF中也許會有意外收獲。
二、CTF
下面每一種對應的操作都會給出一到幾個CTF題目的例子,幫助大家快速上手。
0×00:搜索
題目文件:key.pcapng——https://pan.baidu.com/s/1kVyyCbt
題目描述:flag被盜,趕緊溯源!
題目題解:
首先可以只將這個數據包當做文本文件打開,比如用一些notepad++編輯器,然后直接搜索
正經的做法就是用Wireshark自帶的搜索功能找嘗試查找一些關鍵詞(比如key、flag、shell、pass等),往往直接搜索就能有意外收獲。
然后跟進可疑的數據包
根據數據包特征,很明顯看出這是一個菜刀連接一句話木馬的數據包,然后往下找,即可看到讀取的flag
0×01:文件提取
題目文件: caidao.pcapng——https://pan.baidu.com/s/1kVyyCbt
題目描述:有人偷偷下載了文件!
題目題解:
根據題意可能數據包中存在文件傳輸,嘗試直接導出,選擇File(文件)–>Export Objexts(導出對象),然后可以看到一些協議,比如選中http就可以看到通過http傳輸的一些文件,在右下角有導出按鈕,可生生成相應的文件。但是本題中無法用此方法直接看到被下載的文件,因為有些文件是直接通過tcp或udp協議傳輸的,http協議只能看到的訪問的鏈接,但不會看到傳輸的內容(比如你去訪問放一個鏈接download.php?file=test.rar,通過上述導出對象的方式看不出來下載的文件的內容的),如下如所示。
這個時候就需要找到那個執行下載的數據包,找到數據傳輸的部分再導出,比如下面這個數據包
大概是一個菜刀下載的過程,在最后一個包可以看到下載的文件,直接右鍵點擊“導出分組字節流”,然后保存為.tar.gz文件
本題中最后還要使用16進制編輯器去除開頭和結尾的X@Y字符,這個是菜刀的特征符號,不是文件內容。
再或者一個簡單的方法,右鍵“顯示分組字節流”,去除前后各三個字節在解壓縮
再復雜一點就是多個包的數據提取了,一個較大的文件其傳輸過程可能要經過多個數據包,比如下面這道題目。
題目文件:misc_fly.p.capng—— https://pan.baidu.com/s/1kVyyCbt
題目描述:抓到一只蒼蠅!
題目題解:
首先用HTTP條件過濾一下
右鍵第一個包,追蹤流
可以看到一些基本信息,首先這是一個POST數據包,發送了一些文件相關信息,包括名稱(fly.rar)和大小(525701)等。接下來應該就是文件實際上傳的數據包,將過濾條件改為
http.request.method==”POST”
從數據包的結構上看應該就是第二至第六個數據包是數據傳輸的過程。點開第二個可以看到MediaType的長度為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”。這道題還設置了偽加密,需要修改加密位,將0×84位置改為0×80即可。
解壓出來后是一個exe可執行文件,里面隱藏了一個png圖片,是個二維碼,掃描即可得到flag。
Flag:flag{m1Sc_oxO2_Fly}
0×02:信息提取
題目文件: sqlmap.pcap——https://pan.baidu.com/s/1kVyyCbt
題目描述:
題目題解:
數據包記錄的是sqlmap獲取flag的過程,使用http && http contains”flag”過濾一下
可以看出這是一個布爾盲注的過程,一位一位的讀取flag,然后用二分法不斷判斷其ascii碼的范圍並最終確定這一位的值。第806個包是讀取flag第一位的數據包
將其payload解碼一下是這樣的,判斷其ascii碼是否大於64
id=1 AND ORD(MID((SELECTIFNULL(CAST(`value` AS CHAR),0×20) FROM isg.flags ORDER BY `value` LIMIT0,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——https://pan.baidu.com/s/1kVyyCbt
再使用如下的Python腳本一鍵讀取即可
ISG{BLind_SQl_InJEcTi0N_DeTEcTEd}
三、Tshark
Tshark是命令行版的Wireshark,相對於Wireshark它有更好地靈活性,結合腳本程序可以發揮巨大的威力,在安裝Wireshark的時候就默認安裝了Tshark。
如下是運行-h參數,具體的參數解釋可以參考官方文檔
https://www.wireshark.org/docs/man-pages/tshark.html
比如kali下的一個簡單的使用示例(windows不知為何無法獲取網卡)
-s 512:只抓取前512個字節
-i eth0:監聽eth0網卡
Tshark的-z參數可以進行各種信息的統計,比如下面這條命令,統計每一秒鍾里由ip為的192.168.228.128主機發出的http請求的次數
tshark -zio,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——https://pan.baidu.com/s/1kVyyCbt
然后執行代碼運行
在result文件夾里可以看到20160813-084957.pcap中存在符合條件的字符串,並且生成了對應的txt文件。同理,我們可以改變查找的規則,在大量數據包中查找我們想要的信息。
五、合天相關課程推薦
這里推薦一下和本文相關的合天實驗,可以進一步學習,鞏固加強。
wireshark使用:
http://www.hetianlab.com/cour.do?w=1&c=C172.19.104.182015012915332000001
wireshark之顯示過濾:
http://www.hetianlab.com/expc.do?ec=ECID172.19.104.182015012315255900001
wireshark之文件還原:
http://www.hetianlab.com/expc.do?ec=ECID172.19.104.182014122315591000001