0. 協定分析 : Wireshark

以下是關於wireshark的介紹,僅供參考
裡面對封包的定義不是很完善,如果造成混淆請看網路相關書籍囉!

前言:

網路故障了?沒有用網路時網路燈號卻一直閃爍不停?新的網路通訊協定夠不夠完善?種種大大小小的問題充斥在網路世界中,為了解決各種問題,我們常常需要先對網路中的資料進行擷取和分析,以瞭解問題的癥結點並擬對策。Wireshark就是一種網路分析工具,它能夠擷取網路封包,並盡可能顯示出最為詳細的網路封包資料。本文將對Wireshark做一些基本的使用介紹。

Wireshark簡介:

Wireshark的前身叫做Ethereal(2006.06因為商標問題改名),是一開放原始碼軟體,使用者可以免費從官方網站(https://www.wireshark.org/)下載使用。Wireshark支援了多種作業系統,在Windows、UNIX、MAC…etc下都有相對應的版本。藉由此軟體我們可以抓取資料封包,進一步分析封包內的摘要及詳細資訊。一般常用在網路故障排除、監聽異常封包、軟體封包問題檢測等地方。Wireshark的方便強大之處,在於其支援的Protocol多且完整,更因為開放原始碼的關係,更新Protocol相當迅速,不同封包擷取軟體所產生的檔案亦可在這套軟體中讀取檢視。此外,在介面使用上,Wireshark圖形化的介面相當容易上手,豐富的過濾語言,可以輕鬆判別出封包的種類,是一套整合度完整的軟體。

安裝Wireshark:

首先我們必須到官方網頁來下載安裝程式,位置是https://www.wireshark.org/download.html。官方網頁中有不同的作業系統可供選擇,也提供了免安裝(Portable)的版本。

安裝的過程相當簡單,跟一般軟體的流程一樣:接受授權-->客製化-->安裝。我們將用Microsoft Windows 7 SP1 企業版安裝64-bit的Wireshark當做示範,其安裝步驟如下:

1、執行Wireshark的安裝程式。

 

2、點選「執行」。

 

3、點選「Next」。

 

4、讀完Wireshark的授權條款後,點選「I Agree」以表示同意。

 

5、選取安裝元件。除非您有進階的需求,原則上不需變動這部分的設定。接下來請點選「Next」。

 

6、選取捷徑建立位置與檔案副檔名關聯,筆者建議各位勾選「Wireshark Desktop Icon」,方便未來直接從桌面開啟Wireshark。完成後點選「Next」。

 

7、選取安裝位置。原則上不需變動,請直接點選「Next」。

 

8、選取是否要安裝WinPcap(預設為是)。WinPcap,全名為Windows Packet Capture,是 Windows 版本的 lippcap 函式庫。Wireshark使用了這個函式庫去抓取網路上的封包。您可點選「What is WinPcap?」瞭解更多關於WinPcap的資訊。 由於它含有支援抓取網路上封包的驅動程式,所以我們必須要安裝它。若電腦本身已經有安裝WinPcap,建議還是更新到最新的版本,否則請直接點選「Next」。

 

9、選取是否要安裝USBPcap(預設為否)。若您沒有特殊需求,請直接點選「Install」開始安裝。

 

10、安裝中的畫面。引用微軟(Microsoft)官方的說法,vcredist是

Microsoft Visual C++ 可轉散發套件

它會

安裝最新版的 Microsoft Visual C++ 執行階段檔案與作業系統元件

因此,這個程式會安裝比較久,請您耐心等候。

 

11、安裝中的畫面。若您有選擇安裝WinPcap,以下畫面出現時,請準備開始安裝WinPcap。

 

12、由於剛才有選擇安裝WinPcap,因此會跳出WinPcap的安裝介面。請點選「Next」。

 

13、讀完WinPcap的授權條款後,點選「I Agree」以表示同意。

 

14、選擇是否在電腦開機時自動啟動WinPcap(預設為是)。這項設定可以不用變更,請點選「Install」。

 

15、幾秒鐘後,會跳出WinPcap安裝完成的畫面。這時請點選「Finish」。

 

16、Wireshark將繼續安裝。當顯示Wireshark已完成安裝的畫面(如下圖),請點選「Next」。

 

17、勾選 「Run Wireshark」以在安裝程式結束後執行應用程式。接著點選「Finish」。

 

18、以下畫面是開啟Wireshark 後的第一個畫面。

 

19、若您不知道上網時所使用的連線名稱,請到「控制台」,並選取「網路和共用中心」(圖示檢視時)或「檢視網路狀態及工作」(類別檢視時)。

 

 

20、您會在「檢視作用中的網路」的「連線」項目找到您所使用的連線名稱。

 

21、回到Wireshark,您會找到有標記您的網路卡名稱的選項,對它點兩下。

 

22、Wireshark開始分析您的網路了。但假如您要停止分析,請點選左上角由左數第二個按鈕(紅色正方形)。

 

23、若要重新開始分析,請點選左上角由左數第一個按鈕(藍色鯊魚鰭形狀)。

 

24、此時跳出對話方塊詢問是否要儲存分析結果,是的話請點選「Save」,否的話請點選 「Continue without Saving」。

 

25、若點選「Save」,系統會套出視窗讓您存檔。筆者習慣存為Wireshark capture file (.pcapng)檔。

 

安裝的教學到此結束。接下來我們藉由三個小步驟來介紹Wireshark的功能。

步驟1:明碼封包的截取與觀察
目的:透過基本的封包擷取,瞭解Wireshark的使用流程。從實驗中我們必須要知道sniffer的運作原理,習得呈現內容過濾的技巧,並利用stream彙整的功能找到需要的資訊。

流程:
當安裝完畢,點擊開啟Wireshark,看到的程式介面如下。

接著我們想要開始抓取網路的封包,請點選主選單中的Capture → Interfaces會看到類似以下的畫面,此畫面會列出電腦裡所有的網路卡資訊。選擇想要觀察的網路卡,按下Start就開始擷取封包了。[Tips: 進入這個畫面,Wireshark就會開始監測每張網路卡上的封包流動數目,若真的不確定要選哪張網路卡,選擇packets/s數高的,通常會選中,這是比較懶人的作法啦!]

開始監測之後,畫面會一直動態產生所接收到的封包。你可能會發現很多封包的Source和Destination都不是自己,這是因為我們目前所使用的區域網路大部分為乙太網路,係採用廣播為技術基礎,所以在區域網路中我們很容易可以透過sniffer軟體(本文介紹的Wireshark即是)看到別人的封包,甚至知道別人的隱私內容,本實驗就是要強調明碼的危險性。

明碼傳輸的protocol相當多,telnet、FTP、HTTP等常用協定皆在這個範疇裡面,國人熱愛的BBS(Bulletin Board System)就是使用telnet協定運作,透過sniffer的監聽我們很容易知道別人的帳號密碼。
我們拿BBS來做這次的實驗,首先連接到一個BBS站台,以輔大資工謠言報為例,在命令提示字元內鍵入telnet bbs.rumor.tw。
注意:此時Wireshark的還是在Capture狀態。

進入登入介面後,輸入帳號密碼登入。

接下來我們停止Wireshark的擷取動作,執行主選單的Capture → Stop或是直接點選Stop the running live capture圖示。
停止之後介面上的封包將不再增加,不過所擷取到的資料仍舊太多太雜,這時候可以利用Display Filter功能過濾呈現的內容,如下圖點擊Expression挑選過濾語法。

因為我們只是要篩選出Telnet協定的流量,找到TELNET字樣如下,直接按OK。

其實篩選的功能很強大,遵循著語法:[通訊協定][運算元][數值]就可以過濾出很多有用的資訊。
通訊協定這部分在前面有提到,Wireshark幾乎支援目前所有的協定,所以不太會有解析不出來的情況發生。
可以用的運算元就是上圖Relation那個區塊,亦可以用縮寫來替代。如下表:
English C-like Description and example
eq == Equal ex: ip.src==192.168.2.89
ne != Not equal ex: ip.src!= 192.168.2.89
gt > Greater than ex: frame.len > 10
lt <>= Greater than or equal to ex: frame.len ge 0x100
le <= Less than or equal to ex: frame.len <= 0x20 舉幾個例子: 只顯示 IP Address 為 192.168.2.89 語法為ip.addr eq 192.168.2.89 只顯示 IP Address 為 192.168.2.88 且 port 為 23 語法為(ip.addr eq 192.168.2.88) and (tcp.port eq 23) 只顯示通訊協定為 ARP 或 UDP 語法為arp or tcp 詳細的描述可以參考官方wiki:https://wiki.wireshark.org/DisplayFilters

語法確定後點選Apply就過濾出所有包含TELNET協定的封包。介面的中央區塊代表的是封包裡面的內容,關於這個區塊代表的意義我們實驗2會再談到,現階段我們要點開最下面的+號如圖紅色部分,觀看屬於應用層的內容。

經過觀察,發現一些連續的sent封包,內容依序放著s、h、a、o、l、i、n,這不正是我們先前登入的帳號?可是這樣一個封包一個封包看相當沒有效率,沒關係,Wireshark可以節錄整理串流訊息,在相關的封包上面按右鍵找到Follow TCP Stream點選,Wireshark會幫你彙整該stream的內容。

彙整出來如下圖,紅色的部分為我們送出的DATA,藍色的部分是我們收到的DATA。

為了更去蕪存菁,我們再篩選出只有我們送出的DATA,點選下面紅色部分進行篩選。

最後的結果如下,內容中『....』代表的是指令,沒有辦法顯現出來。可以看到我們曾經發出shaolin,然後按下換行,繼續輸入demo1換行,從這邊我們確切的抓到了帳號跟密碼資訊ID:shaolin Password:demo1。除此之外,我們更可以進一步知道別人在看什麼文章,或是得知別人私人信件的內容,隱私將毫無保障。
[註:為了避免被有心人監測到重要資料,有SSH、SSL、HTTPS等加密協定可用就盡量使用,至少別人監聽到的內容是加密過的。]

步驟2:HTTP Protocol的觀察
目的:藉由HTTP Protocol的觀察,練習篩選所要的資訊,並能夠清楚的知道TCP/IP實際的運作模式

流程:這次要看的是自己的HTTP封包。在上一個實驗中我們用到Display Filter,這個實驗也可以透過同樣的方式組合過濾,不過我們來嘗試另一種過濾方式Capture Filter。
同樣的進入選擇網路卡的地方。Capture → Interfaces點選Options。

進入了選項視窗後,有各種參數可以設定,比較主要的功能是在Capture這個區塊,其中:

Interface代表你要使用的網路卡。
IP address代表該網路卡的網路位置。
Buffer size代表抓取網路封包時所用的緩衝區大小。
Capture packets in promiscuous mode代表抓取封包的模式,如果勾選會抓取整個LAN的封包;如果不勾選,則只會抓取從你的電腦進或出的封包。
Limit each packet to n bytes用來指定對於每個封包要抓取的資料大小。
Capture Filter用來指定抓取時的篩選規則。

跟我們相關的功能如下圖紅色的部分,『Capture packets in promiscuous mode』、『Capture Filter』這兩部分,因為我們只要觀察自己的封包,所以『Capture packets in promiscuous mode』不要打勾,另外我們想要的是http相關資訊,所以在剛開始就設定篩選讀取,請點選『Capture Filter』的按鈕開始進行篩選設定。

Capture Filter是使用 libpcap filter 語言,詳細的語法可以參考tcpdump的網頁(http://www.tcpdump.org/tcpdump_man.html)
這裡舉幾個簡單的例子:
只抓取某一個 host(例如 IP 是 10.0.0.5) 的 telnet 封包
語法為:tcp port 23 and host 10.0.0.5
抓取 telnet 的封包但不要抓到從某一 host 的(例如 IP 是 10.0.0.5)
語法為:tcp port 23 and not host 10.0.0.5
更詳細的描述可以參考官方wiki:https://wiki.wireshark.org/CaptureFilters

在這裡我們沒有要用到這麼複雜,直接用Wireshark已經建立好的常用功能HTTP TCP port(80)即可,OK之後點選Start擷取封包

先以連接到Google首頁為例,來看看讀取一個網頁到底中間做了什麼事情?

回到Wireshark主程式,看到已經有很多封包被擷取出來了。
見下圖,右上角紅色的框框,這就是TCP在做三向交握建立連線,有興趣的可以自行察看封包並比對網路相關書籍,這裡就不多著墨了。
接下來看到下面的紅色框框,這是編號四號的封包內容,也就是當三向交握結束,client對server做出request,封包的內容層層分明,讓我們先來複習一下TCP/IP的四層架構:

應用層

(OSI 5 到 7層)

例如HTTP、FTP、DHCP、DNS(如BGP和RIP這樣的路由協定,儘管由於各種各樣的原因它們分別運行在TCP和UDP上,仍然可以將它們看作網路層的一部分)

傳輸層

(OSI 4 和 5層)

例如TCP、UDP、RTP、SCTP(如OSPF這樣的路由協定,儘管運行在IP上也可以看作是網路層的一部分)

網路層

(OSI 3層)

對於TCP/IP來說這是網際網路協定(IP)(如ICMP和IGMP這樣的必須協定儘管運行在IP上,也仍然可以看作是網路互連層的一部分;ARP不運行在IP上)

連結層

(OSI 1和2層)

例如Ethernet、Wi-Fi、MPLS等。

以下圖為例,第一條內容是屬於連結層(frame);
第二條內容為MAC address,隸屬於網路層;
第三條內容也是網路層(IP);第四條TCP到了傳輸層;
最後一條HTTP為應用層。
藉由封包的分析,我們可以更清楚瞭解每一層實際運作的情形。

最後,我們開始來分析一下這些HTTP protocol,截取的內容如下,分別的動作是client請求提供服務;server回應OK並傳送網頁。透過這些header,可以從中去思考分析這些資訊分別是做什麼用的,相關的資訊請參考HTTP/1.1: Header Field Definitions (https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html)

GET / HTTP/1.1
Host: www.google.com.tw
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: zh-tw,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Big5,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: PREF=ID=e60ffeff3ffd6915:TM=1205430311:LM=1205430311:S=J9rJbq4UpUnfR9hl
Cache-Control: max-age=0

 

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Server: gws
Content-Length: 3034
Date: Thu, 13 Mar 2008 01:37:33 GMT

(底下HTML code省略)

 

 

步驟3:實戰練習

目的:找一個網站去瞭解其運作模式,藉此分析該網站的安全度、可靠度等細節。
流程:這次實驗挑選的對象是去年新成立的社交網站,該網站提供blog、相簿,並提供房間讓你布置,網站內的功能也持續推陳出新,是一個非常有趣新奇的網站,網址為:http://www.roomi.com.tw/

因為布置房間需要金幣,我們比較有興趣的可能是該網站賺取金幣的模式如何運作,所以開啟Wireshark開始記錄。

首先進入打工中心,隨便找個零工打打看。

打工的成果為111金幣,開始察看封包。

利用前面幾個實驗所用的方法,我們在列表中發現了一個關鍵的封包,負責回傳遊戲的分數。

GET
/obj/swf/minigame/php/index.php?type=honeybee&PA=save&score=111
HTTP/1.1Host: http://www.roomi.com.tw/User-Agent:
Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.8.1.11) Gecko/20071127
Firefox/2.0.0.11Accept:
text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5Accept-Language:
zh-tw,en-us;q=0.7,en;q=0.3Accept-Encoding: gzip,deflateAccept-Charset:
Big5,utf-8;q=0.7,*;q=0.7Keep-Alive: 300Connection: keep-aliveCookie:
PHPSESSID=0c8a8ebd9ffd07114acb6a866417c99b;
__utma=122646152.2093039428.1205467293.1205467293.1205467293.1;
__utmb=122646152; __utmc=122646152;
__utmz=122646152.1205467293.1.1.utmccn=(organic)utmcsr=googleutmctr=roomiutmcmd=organic

發現了嗎?
前陣子roomi server端還有防一些,現在好像什麼都沒有防。
寄信去沒人回~
不只是錢、好像很多東西都可以改來改去。

Reference:
The Wireshark Wiki
https://wiki.wireshark.org/
海洋大學電子商務跨領域學程網
http://sirius.cs.ntou.edu.tw/EC/ecsecurity_labs/ecsecurity_labs_09.php
Ethereal 抓網路封包+封包內容分析+看明碼連線內容
http://netgames123.blogspot.tw/2007/10/ethereal.html
wikipedia
https://zh.wikipedia.org/wiki/Wireshark
Vcredist.exe 會為 Visual C++ 應用程式安裝最新的執行階段元件
https://support.microsoft.com/zh-tw/help/259403/how-to-obtain-the-visual-c-6-0-run-time-components

參考答案

現在很多的Web服務都盡量使用GET及POST這兩個Method,像是PUT、TRACE這些Method都對Server端來說危險性較高,我也試過幾個網站,但主要都是GET與POST Method為主,因此下面的圖我只先分析這兩個Method為主的Packet!是我連到Pixnet網路相簿( https://www.pixnet.net/) 擷取到的!

 1. GET Method:Request:在Internet Protocol那邊可以看到Source IP:122.126.73.42 及Destination IP:60.199.247.116;由於在家裡上網,使用PPPoE連線方式,走port 80。在HTTP可以看到Request Method為GET。使用HTTP 1.1通訊協定。ACCEPT代表能處理的格式內容,下面還有接受的語言及編碼方式。HOST為主機端:www.pixnet.net

Response:為回應封包,所以Source IP和Destination IP跟Request相反。Response Code:200 表示OK。(若失敗常用的則可能為403或404)資料會用chunked方式編碼傳送。若有輸入帳號密碼也會經過加密。而Line-based text data部分則為網頁的html語法。

2. POST Method:Request:此packet為我在pixnet的blog上 Post一篇網誌取得的。可看到Request Method為POST,還有URI及Version。Host位置:blog.pixnet.net。Line-based text data可以看到Post的時間及加密過後的Title及內容。

Response:Response Code:200 表示OK。Connection:Keep-Alive。使用chunked方式編碼。Content-encode entity body:文字編碼轉換由8376 bytes → 24716 bytesLine-based text data為網頁html語法(包含編碼過後的內容)。

有些網頁輸入的帳號密碼若沒有經過編碼,沒有使用https或SSL方式加密,帳號密碼則在封包內一覽無遺…