MAC Wireshark抓包IOS

網絡抓包是個基礎技能,對於網絡協議的掌握有必定的要求。iOS上實現網絡抓包能夠用Charles(針對http和https),tcpdump(快速分析網絡包),和Wireshare。以前寫過一篇介紹tcpdump抓包的入門文章,和tcpdump相比,Wireshark提供豐富的GUI交互,並且能分析全部的網絡協議,關鍵仍是免費的,掌握好Wireshark就能應付絕大部分須要分析網絡協議的場景了。html

安裝初識

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抓包很是重要,後面會詳細的講解。session

第二部分(標號爲2)是歷史流量包列表展現界面,這裏展現的是從抓包開始,全部經過咱們iPhone設備的流量。列表界面不一樣的包有不一樣的顏色,Wireshark經過顏色來區分包的類型,對於特定場景快速識別目標流量很是有用,後面也會專門講解。架構

第三部分(標號爲3)是單個包的詳細信息展現面板,咱們在第二部分選中的網絡包在這一部分會將其結構以可閱讀的文本形式展現出來,要正確閱讀這一部分的信息須要對tcp/ip協議有必定的掌握。socket

第四部分(標號爲4)是單個包的二進制流信息展現面板,這一部分展現的信息是包的原始數據,也是一個網絡包所包含內容的真實展示,咱們在第三部分多選中的協議頭,都會在這一部分以同步高亮的形式標記出來。這一部分的展現是爲了讓咱們對包的真實內容作直觀的判斷,能具體到單個byte。tcp

初步認識上述四塊主要面板以後,能夠嘗試開始分析網絡包,在開始分析網絡包以前,先要對網絡包有個大體的概念。

網絡包結構

咱們最初學習網絡協議的時候,不管是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,不管使用哪一個工具,前提都是咱們須要對網絡協議有全面的認識,因此在學習使用這些工具的同時,要持續深刻的學習網絡協議知識。

相關文章
相關標籤/搜索