標籤:hang 互動 stat 手機 send 分享 很多 中間 去掉
網路抓包是個基礎技能,對於網路通訊協定的掌握有一定的要求。iOS上實現網路抓包可以用Charles(針對http和https),tcpdump(快速分析網路包),和Wireshare。之前寫過一篇介紹tcpdump抓包的入門文章,和tcpdump相比,Wireshark提供豐富的GUI互動,而且能分析所有的網路通訊協定,關鍵還是免費的,掌握好Wireshark就能應付絕大部分需要分析網路通訊協定的情境了。
安裝初識
Wireshark提供Mac版本,可以從官網下載安裝,到這篇部落格為止最新版本應該是2.2.1。安裝好之後開啟的第一個介面如下:
Wireshark在第一個介面就把當前系統所包含的網卡列出來了,直接點擊任何一項就可以開始監聽通過該網卡的所有網路流量。
當我們把iPhone通過usb串連macbook時,Wireshark並不能直接監聽通過iPhone的網路流量,需要通過一個系統程式在我們的Mac系統上,建立一個映射到iPhone的虛擬網卡,在terminal中輸入如下命令即可:
格式是rvictl -s [裝置udid],裝置的udid可以通過itunes或者itools擷取,執行命令之後Wireshark能立即識別新增加的rvi0網卡,也就是中高亮的部分,雙擊rvi0這一項,Wireshare即進入如下介面開始監聽iPhone裝置上的所有流量。使用完畢之後rvictl -x[裝置udid]取消連結。
此時,啟動iPhone上的任意App,只要有網路流量產生,對應的網路包都會在Wireshark上述的列表中展示出來。
Wireshark的流量監控介面主要分為四塊,由上至下第一部分(標號為1)是工具列,通過工具列我們可以控制監控的行為,比如開始抓包,停止抓包,重新開始抓包,以及在包之間跳轉等等。工具列的底部有個輸入框,可以讓我們手動輸入包的過濾條件,這部分對於熟練使用Wireshark抓包非常重要,後面會詳細的講解。
第二部分(標號為2)是曆史流量包列表展示介面,這裡展示的是從抓包開始,所有通過我們iPhone裝置的流量。列表介面不同的包有不同的顏色,Wireshark通過顏色來區分包的類型,對於特定情境快速識別目標流量非常有用,後面也會專門講解。
第三部分(標號為3)是單個包的詳細資料展示面板,我們在第二部分選中的網路包在這一部分會將其結構以可閱讀的文本形式展示出來,要正確閱讀這一部分的資訊需要對tcp/ip協議有一定的掌握。
第四部分(標號為4)是單個包的二進位流資訊展示面板,這一部分展示的資訊是包的未經處理資料,也是一個網路包所包含內容的真實展現,我們在第三部分多選中的協議頭,都會在這一部分以同步高亮的形式標記出來。這一部分的展示是為了讓我們對包的真實內容做直觀的判斷,能具體到單個byte。
初步認識上述四塊主要面板之後,可以嘗試開始分析網路包,在開始分析網路包之前,先要對網路包有個大致的概念。
網路包結構
我們最初學習網路通訊協定的時候,無論是OSI七層模型,還是經典的TCP/IP五層結構,都是以中的左邊部分的形式展示的。
這是一種經典的分層架構,確實也符合網路通訊協定設計上的思路,但卻不能表達網路包真實的內含項目關聯性。右邊部分是我所繪製的一個包結構。在我看來,這種洋蔥式的結構更符合網路包的真實形態。Application是最內層的payload,除了Application這一層之外,其他層都是用自己這一層的協議header+所包含那一層的payload。可以用如下公式表示:
TCP Layer = TCP Header + Application Payload
IP Layer = IP Header + TCP Payload
...
我們分析每個網路包的時候要能理解每一個包它所代表的抽象含義,再進一步將相關聯的包串聯起來,形成一次完整的網路會話。
分析包結構
對於iOS程式員來說,我們絕大部分的流量分析都集中在HTTP或者基於TCP的socket長串連。從這一層面來說,和我們最貼近的三層是應用程式層(http),傳輸層(tcp or udp),網路層(ip)。
對於應用程式層來說主要是http協議的學習,對於http request和response格式的閱讀,比如表示的一個http request包:
Packet詳情面板以符合http協議的表述,將header中各個field清晰的羅列出來了,閱讀起來很方便。
傳輸層我們應用較多的是tcp,這一層的閱讀主要是tcp header的學習:
典型的tcp header一般長度為20個位元組,將這20個位元組逐一學習一遍就可以分析大部分的tcp流量了。
網路層的分析主要是針對於IP Header,header結構如下:
這其中IP Header第十三個位元組各個filed的理解,對於我們分析tcp流量的起始和結束尤其有用,典型的IPV4 Header也是20個位元組,梳理一遍就可以分析IP包了。
所以對於包結構的分析關鍵在於三個知識點的學習:http header, tcp header, ip header,這麼一看好像也沒多少東西 ;)
使用Filter過濾包
使用Wireshark和使用Charles最大的區別在於,Charles只捕獲HTTP流量,而Wireshark捕捉的是經過目標網卡所有的流量,流量包可以在幾秒內膨脹到難以閱讀的數量,所以此時我們需要使用Filter來做包的過濾,Filter規則定的越細,剔除掉的幹擾資訊就越多,分析起來就越快。
Wireshark的Filter分為兩種,一種為Capture Filter,另一種是Display Filter。
Capture Filter出現在初始介面,在網卡列表的上方有個輸入框,允許我們輸入capture filter,一旦輸入了特定的capture規則,Wireshark就只捕獲符合該規則的流量包了。
Display Filter出現在流量監控介面,在工具列的下方有個輸入框,允許我們輸入display filter,display filter只是從介面上過濾掉不符合規則的包,Wireshark實際上還是監聽了這些包,一旦去掉display filter,所有的包又會出現在同一介面。
Capture Filter的規則和我們平常使用tcpdump的filter文法是一致的,比如為了只監控http的流量,我們可以先在初始化介面選中rvi0網卡,再在capture filter輸入框裡輸入:
//只捕獲HTTP流量port 80 or port 443
斷行符號之後Wireshark就開始監控我們iPhone上所有的http和https流量了 ,非常簡單,我們還可以使用其他的capture filter來捕獲特定的流量,比如想分析DNS解析過程,可以使用:
//只捕獲DNS流量port 53
比如只想捕獲和特定伺服器相關的流量:
//只捕獲和特定主機的流量host 171.10.191.10
Display Filter的文法是由Wireshark自訂的,和Capture filter的文法不能混用。比如我們只想看某個主機的流量,可以使用如下Display Filter:
ip.addr==171.10.191.10
如果只看http或者https的流量,可以用:
tcp.port == 80 || tcp.port == 443
更多的文法規則可以查看Wireshark官方文檔,Wireshark實際上提供了便捷的UI操作協助我們來書寫Display Filter,在Display Filter輸入框的最右邊有個Expression按鈕,點擊之後可以彈出如下介面:
Display Filter的文法本質上是個等是關係描述,我們可以在search當中輸入我們感興趣的協議比如http,再在展開的協議頭裡選擇我們的條件比如http.host,最後設定Relation和Value就可以產生一個Display Filter條件了。
包色彩規則
Wireshark在大多數時候捕獲的包數量都遠超我們感興趣的數量,而且各個串連的包都混雜在一起,為了方便我們識別不同的串連會話,Wireshark預設使用一種著色規則協助我們來進行包類型區分。
具體的規則可以通過菜單View->Coloring Rules...查看,預設規則如下:
這裡有個小技巧,如所示,我只將我感興趣的協議包上了色,集中在http,tcp,udp包,這樣分析起來更加直觀。比如根據的規則,tcp三向交握中的Sync包是使用灰色標記的,這樣我就可以在的包中迅速定位一次tcp串連的開始包位置:
當然,包的顏色也可以按照自己的視覺習慣進行定製,我個人習慣把Sync包和FIN包設定一個高亮的顏色,方便判斷一次HTTP會話的起始和結束。
流量跟蹤
Wireshark預設情況下將不同網路連接的流量都混在一起展示,即使給不同協議的包上色之後,要單獨查看某個特定串連的流量依然不怎麼方便,我們可以通過Wireshark提供的兩種方式來實現這個目標。
方式一:Follow Stream
當我們選中某個包之後,右鍵彈出的菜單裡,有個選項允許我們將當前包所屬於的完整流量單獨列出來,如:
Wireshark支援我們常見的四種Stream,TCP,UDP,HTTP,SSL。比如我們選中Follow TCP Stream之後可以得到如下的詳細分析輸出(樣本為監控iPhone手機的流量):
中將iPhone和Server之間某次的串連流量完整的呈現出來,包括iPhone發送了多少個包,Server回了多少個包,以及iPhone上行和下行的流量,還提供流量編解碼選擇,文本搜尋功能等。
方式二:Flow Graph
Flow Graph可以通過菜單Statistics->Flow Graph來產生,這樣我們可以得到另一種形式的流量呈現:
和Follow Stream不同的是我們擷取到的是完整的流量,從中可以看出從10.136.66.127(我的iPhone手機IP地址)發出的流向多個伺服器的網路流量,包括DNS解析和SSL安全握手等。當然我們也可以在中下方的操作地區做進一步的過濾,可以使用Display Filter做進一步的流量定位。
Follow Stream更適合分析針對某一個伺服器位址的流量,而Flow Graph更適合分析某個App的整體網路行為,包含從DNS解析開始到和多個伺服器互動等。
其實Statistics菜單下還有更多的圖表分析模式,可以根據不同的分析目標來選擇,比如Statistics->HTTP->Requests可以得到如下按主機分門別類的HTTP請求分析圖,和收費的Charles的展示結果類似。
HTTPS包分析
介紹完使用方式再來實際分析下HTTPS的流量。是我使用Wireshark在iPhone上抓包知乎App網路請求的結果:
當我使用Follow TCP Stream之後,一次完整的HTTPS會話流量就被單獨過濾出來了,第一步先分析包列表介面。
通過醒目提示找到會話的其實Sync包,繼而可以快速的定位到HTTP建立串連之初的tcp三向交握所產生的三個包:
Sync: iPhone發送Sync。
Sync+Ack: Server發送Sync+Ack。
Ack: iPhone Ack。
三向交握之後是ssl handshake,ssl handshake分為以下幾步:
Client Hello
這一個包是ssl握手的起始包,用戶端(我的iPhone)會攜帶當前會話所依賴的一些關鍵資訊:使用的tls版本(當前為tls1.2),上次的Session ID(如果可以session重用,就可以避免當前這次的安全握手),用戶端所支援的密碼編譯演算法套件(從中可以看出可以從22個suites裡面挑選)等。
Server Hello
Server Hello這個包帶上伺服器這一端的一些資訊,比如Server所選擇的tls版本,或者帶上可以重用的Session ID避免重新握手,在Client傳過來的Cipher Suites當中挑選一個Cipher Suite進行後續的安全通話等。
Server 下發Certificate
Server同時會下發自己的Certificate,如所示:
從包列表介面可以看出,Certificate(大小為2407個bytes)這個包由於超過了1440個位元組,被拆成了2個包,所以我們可以在包Info裡面看到[TCP segment of a reassembled PDU],我們使用Wireshark抓包的時候經常會看到reassembled PDU,出現這種情況是因為包太大,超過了MSS,需要拆成兩個來發送。
接下來幾個包是Client和Server基於上面交換的資訊協商最後使用的密鑰。
Server Key Exchange
Client Key Exchange
Change Cipher Spec
...
Send Application Data
各個包裡面所包含的詳細內容分析涉及到非對稱式加密演算法的相關知識,這裡就不展開了,使用Wireshark可以將整個HTTPS的握手過程非常清晰的展現出來,感興趣的同學可以閱讀這篇文章。
當然大部分時候我們需要分析iPhone上HTTPS流量裡的具體包內容,Wireshark雖然支援配置RSA私密金鑰,但我們沒辦法直接擷取iPhone裝置上各個App所使用的私密金鑰,這種情境下我們一般使用MITM(Man In The Middle)中間人攻擊來破解HTTPS包內容,收費工具Charles可以通過代理的方式來實現此功能,免費版抓包工具mitmproxy同樣也可以,Charles的使用教程比較多了,後續我們會再寫一篇mitmproxy的教程介紹如何使用破解調試HTTPS的流量。
結束語
Wireshark就介紹到這裡,現在在iPhone上抓包的方式有很多,有面向所有協議的tcpdump和Wireshark,也有針對HTTP的Charles和mitmproxy,無論使用哪個工具,前提都是我們需要對網路通訊協定有全面的認識,所以在學習使用這些工具的同時,要持續深入的學習網路通訊協定知識。
MAC Wireshark抓包IOS