以Mitmproxy代理監測手機App封包數據
Mitmproxy運作方式
Mitmproxy是一個開源代理應用程式,這個工具允許使用典型的中間人攻擊(MITM)攔截任何HTTP(S)用戶端(例如行動或桌面瀏覽器)和Web伺服器之間的HTTP和HTTPS連接。與其他代理伺服器例如Squid類似,它接受來自用戶端的連接並將其轉發到目標伺服器。但是,其他代理伺服器通常是透過快取來做內容過濾或者速度優化,而攻擊者的目標是讓攻擊者能夠實時監控、抓取和更改這些網路連接。
為了能夠監測到HTTPS連接,mitmproxy會扮演成一個憑證授權中心,但是此憑證授權並非值得信賴的:不是授予憑證給真正的個人或組織,而是透過mitmproxy動態地生成憑證並授予給任何所需的伺服器主機。
要使這種攻擊能正確執行,必須滿足以下條件:
⬧閘道位址為Mitmproxy主機位址(適用於HTTP和HTTPS):運行mitmproxy的伺服器必須能夠攔截IP封包,也就是它必須位於封包路徑的某處。 最簡單的方法是將用戶端設備中的預設閘道更改為mitmproxy伺服器位址。
⬧Mitmproxy CA能被裝置信任(僅限HTTPS):為了讓HTTPS代理能正常運作,用戶端必須信任mitmproxy產生的CA,因此必須將CA憑證檔新增到用戶端的儲存設備(例如手機記憶卡或硬碟)並安裝此憑證至手機或電腦。
安裝並執行mitmproxy
安裝mitmproxy
mitmproxy的安裝非常簡單,因為是使用Python軟體打包管理系統(pip)所打包的。其他的mitmproxy依賴包則可以用apt-get來安裝,以下為安裝mitmproxy主程式與相關依賴包的指令。
1.sudo apt-get install python3-dev python3-pip libffi-dev libssl-dev #安裝mitmproxy依賴包
2.sudo pip3 install mitmproxy #安裝mitmproxy主程式
|
啟用IP轉發和通訊傅重導向
mitmproxy應用程式內部在TCP port 8080上運行,但外部必須監聽 port 80/HTTP 和 port443/HTTPS。 因此,若要監聽被送來的IP封包,IP轉發(系統充當路由器)以及從port 8080到80、443的重新導向都是必要的預先準備工作。
1.sysctl -w net.ipv4.ip_forward=1 #開啟IP轉發
2.iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
3.iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8080
|
執行mitmproxy
如上所述,mitmproxy運行在port 8080上,但同時也需要綁定80和443,所以這三個port不能同時被任何其他應用程式使用,我們需要停止任何可能占用這些port(Apache Web伺服器,Tomcat等)的程式。如果不確定是否有其他軟體用到這三個port,可以用netstat-ntap指令查看。
接下來就開始執行mitmproxy,為了要正確地啟動mitmproxy,我們輸入此指令:mitmproxy -T --host 來執行mitmproxy。下圖為mitmproxy的工作視窗。
安裝mitmproxy CA憑證至手機
我們需要在欲抓包/更改HTTPS連接的設備中安裝mitmproxy動態生成的CA憑證,比如桌面瀏覽器或智慧型手機(Android,iOS,..),本研究是使用Android系統的智慧型手機。
在第一次執行mitmproxy之後,會在電腦目錄~/.mitmproxy/中自動產生一個名為mitmproxy-ca-cert.cer的CA憑證檔,將這個CA憑證檔複製到手機中並安裝此憑證檔。
更改手機的預設閘道
觀察可疑APP之封包內容
在Mitmproxy抓取其他手機APP之封包時,察覺到有其他APP的封包資料一直被新增進流量清單中,仔細一看竟是中國大陸的拍照軟體-美圖秀秀。其中幾個封包內容都是廣告的發送與接收,但是發現到有一個封包資料有異狀,居然請求了一些隱私資料而且也正確顯示出來,包括此手機的網卡MAC位址以及手機的序列號(IMEI)。
我並沒有開啟美圖秀秀這個手機APP,此APP卻會自己接收與發送封包已經是非常奇怪的行為,沒想到居然還在未經我授權的情況下將相對隱私資料IMEI與MAC
Address傳出到外部伺服器。實驗—用mitmproxy修改遊戲APP分數結算封包創造高分
我們在這邊做了一個很有趣的實驗,就是使用mitmproxy干擾遊戲APP流量並修改封包。 開始實驗之前有一些必要的設定,首先要先安裝mitmproxy的CA憑證,然後在電腦上啟動mitmproxy,並將mitmproxy設定為手機的代理伺服器。
3.1查看遊戲的流量
讓我們先看看遊戲的流量,在本實驗中所使用的遊戲是Super Mega Worm Lite,這是一款簡單復古且簡單易玩的小遊戲。
在完成一關遊戲之後,我們就能透過mitmproxy來觀察遊戲跟伺服器間傳送的流量。
我們看到了很多預期會看到的遊戲資料,像是初始化、排行榜等等的遊戲數據。 然後,在最後一行有一段激起我好奇心的POST網址,那就是遊戲分數結算後的提交。
https://service.gc.apple.com/WebObjects/GKGameStatsService.woa/wa/submitScore
|
用戶端手機提交給遊戲伺服器的封包內容看起來蠻有趣的,若是修改封包裡分數的數值不知道會不會真的變高分。
<!--(block|syntax("xml"))-->
<plist version="1.0"> <dict> <key>scores</key> <array> <dict> <key>category</key> <string>SMW_Adv_USA1</string> <key>context</key> <integer>0</integer> <key>score-value</key> <integer>1062</integer> <key>timestamp</key> <integer>1363515361321</integer> </dict> </array> </dict> </plist> <!--(end)--> |
打開此封包後會發現這是一個屬性列表,包含遊戲識別號、結算分數(此次遊戲分數為1062)和一個時間戳記。看起來要更動這些數值並不困難。
3.2修改並重新提交分數封包
首先,在mitmproxy中選擇提交分數的POST封包,然後按Enter查看封包內容,這邊一定要確認要查看的是請求而不是回復。現在按e進行編輯,系統會提示您輸入請求更改的部分,接著按r鍵進入raw,預設的文字編輯器會啟動。為了看出明顯差異,此實驗將把分數數值從1062設定成分數90140,最後一步是重新發送這個修改後的請求,按r重新發送。
<!--(block|syntax("xml"))-->
<plist version="1.0"> <dict> <key>scores</key> <array> <dict> <key>category</key> <string>SMW_Adv_USA1</string> <key>context</key> <integer>0</integer> <key>score-value</key> <integer>90140</integer> <key>timestamp</key> <integer>1363515361321</integer> </dict> </array> </dict> </plist> <!--(end)--> |
3.3封包修改成果
留言
張貼留言