利用 Burp Suite 劫持 Android App 的流量(一)
在Android應用程序進行安全評估時,通常會進行兩方面的評估:移動前端和后端API。為了檢查API的安全性,你將需要大量的文檔,例如Swagger或Postman文件,或者可以讓移動應用程序為你生成所有流量,并簡單地通過代理(MitM攻擊)攔截和修改流量。
有時候設置代理確實很容易,在本文中,我將使用PortSwigger的Burp 套件代理,但是相同的步驟當然可以用于任何HTTP代理。在所有示例中,代理將托管在端口8080上的192.168.1.100。檢查從最基本的開始,越到后來越復雜。
設置設備
首先,我們需要確保設備上的所有設置都是正確的。無論你嘗試使用MitM的應用程序如何,這些步驟均適用。
(1) 是否在設備上配置了代理?
很明顯,第一步是在設備上配置代理。使用者介面會因你的Android版本而有所不同,但找起來并不難。
(2) 完整性檢查
進入“設置”>“連接”>“Wi-Fi”,選擇你所使用Wi-Fi網絡,點擊“高級”>“代理”>“手動”,然后輸入你的代理詳細信息:
- 代理主機名:192.168.1.100;
- 代理端口:8080;
Burp是否監(jiān)聽所有接口?
默認情況下,Burp只監(jiān)聽本地接口(127.0.0.1),但是由于我們想要從不同的設備連接,Burp需要監(jiān)聽已經加入Wi-Fi網絡的特定接口。你可以監(jiān)聽所有接口,也可以監(jiān)聽特定接口(如果你知道需要哪個接口)。作為完整性檢查,我通常使用“監(jiān)聽所有接口”。請注意,Burp有一個API,它可以允許其他使用相同Wi-Fi網絡的人查詢你的代理并從中檢索信息。
(1) 完整性檢查
在你的主機上導航到http://192.168.1.100:8080,應該會出現歡迎界面。
(2) 解決方案
在Burp中,進入“代理”>“選項”>在“代理監(jiān)聽器”窗口中單擊你的代理,然后在“綁定到地址”配置上選中“所有接口”。
你的設備可以連接到代理嗎?
有些網絡具有主機/客戶端隔離,不允許客戶端相互通信。在這種情況下,你的設備將不能連接到代理,因為路由器不允許。
(1) 完整性檢查
在該設備上打開瀏覽器,導航到http://192.168.1.100:8080。你應該會看到Burp的歡迎屏幕。如果你在前面的檢查中已經配置了代理,你還應該能夠導航到http://burp。
(2) 解決方案
這里有一些選擇:
a.設置一個禁用主機/客戶端隔離的自定義無線網絡;
b.將代理托管在可訪問的設備上,例如AWS ec2實例;
c.執(zhí)行一個ARP欺騙攻擊,以欺騙移動設備,使其相信你是路由器;
d.使用adb反向代理通過USB的流量:
- 將設備上的代理配置為在端口8080上轉到127.0.0.1;
- 通過USB連接設備,并確保adb設備顯示你的設備;
- 執(zhí)行adb reverse tcp:8080 tcp:8080,它將
- 現在,你應該能夠瀏覽到http://127.0.0.1:8080并看到Burp的歡迎屏幕;
你可以代理HTTP流量嗎?
HTTP流量的步驟通常比HTTPS流量容易得多,因此此處的快速狀態(tài)檢查可確保你的代理正確設置且可被設備訪問。
(1) 完整性檢查
導航到http://neverssl.com并確保你在Burp中看到了該請求。 Neverssl.com是一個不使用HSTS的網站,并且永遠不會將你發(fā)送到HTTPS版本,從而使其成為測試純文本流量的理想選擇。
(2) 解決方案
- 把以前的檢查再檢查一遍,可能有些地方不對;
- Burp的攔截已啟用,請求正在等待你的批準;
設備上是否已安裝Burp證書?
為了攔截HTTPS流量,需要在設備上安裝代理的證書。
(1) 完整性檢查
進入設置>安全性>受信任的憑據>用戶,并確保列出了你的證書。另外,你可以嘗試攔截來自設備瀏覽器的HTTPS流量。
(2) 解決方案
許多地方都有記錄,但是這里有一個簡短的摘要:
- 在瀏覽器中導航到http://burp;
- 點擊右上方的“CA證書”,將開始下載;
- 使用adb或文件管理器將擴展名從der更改為crt:adb shell mv /sdcard/Download/cacert.der /sdcard/Download/cacert.crt;
- 使用文件管理器導航到該文件并打開該文件以啟動安裝;
你的Burp證書是否已安裝為根證書?
Android最新版本的應用程序默認不相信用戶證書,至于具體原因請點此https://blog.nviso.eu/2017/12/22/intercepting-https-traffic-from-apps-on-android-7-using-magisk-burp/。或者,你可以重新打包應用程序,將相關的控件添加到network_security_policy.xml文件中,但是將根CA保存在系統(tǒng)CA存儲中可以避免其他步驟(如第三方框架)的麻煩,因此這是我的首選方法。
(1) 完整性檢查
進入設置>安全性>受信任的憑據>系統(tǒng),并確保列出了你的證書。
(2) 解決方案
為了將你的證書列為根證書,你的設備需要使用Magisk作為根目錄:
- 正常安裝客戶端證書(請參閱以前的檢查);
- 安裝MagiskTrustUser模塊;
- 重新啟動設備以啟用模塊;
- 再次重啟以觸發(fā)文件復制;
或者,你可以:
- 確保證書的格式正確,然后將其復制/粘貼到/ system / etc / security / cacerts目錄中。但是,要使其正常工作,你的/ system分區(qū)需要是可寫的。一些根方法允許這樣做,但它非常復雜,而Magisk更好,獲得正確格式的證書也有點復雜。
- 修改networkSecurityConfig,以將用戶證書包括為信任錨(請參見下文)。不過,將你的證書作為系統(tǒng)證書會更好,所以我很少采用這種方法。
你的Burp證書有適當的有效期嗎?
Google以及Android正在積極縮短leaf證書的最長接受期限,如果你的leaf證書的有效日期過長,Android / Chrome將不會接受它。
(1) 完整性檢查
使用瀏覽器連接到你的代理,并調查根CA和leaf證書的證書有效期。如果短于1年,那就好了。如果證書的有效期較長,我喜歡安全一點,創(chuàng)建一個新的CA,你也可以使用Android上最新版本的Chrome瀏覽器來驗證證書的有效期。如果有錯誤,Chrome將顯示以下錯誤:ERR_CERT_VALIDITY_TOO_LONG
(2) 解決方案
這里有兩種可能的解決方案:
- 確保你安裝了最新版本的Burp,這會減少生成的leaf證書的有效期;
- 創(chuàng)建自己的根CA,它的有效期僅為365天。這個根CA生成的證書也將小于365天。這是我的首選選項,因為證書可以與團隊成員共享,并且可以安裝在約定期間使用的所有設備上。
設置應用程序
現在設備可以使用了,現在該看看應用程序的詳細信息了。
應用程序代理可以識別嗎?
許多應用程序簡單地忽略了系統(tǒng)的代理設置,使用標準庫的應用程序通常會使用系統(tǒng)代理設置,但是依賴于解釋語言的應用程序(例如Xamarin和Unity)或本地編譯的應用程序(例如Flutter)通常要求開發(fā)人員將代理支持明確地編程到應用程序中。
(1) 完整性檢查
在運行應用程序時,你應該在Burp的Proxy選項卡中看到你的HTTPS數據,或者應該在儀表板面板上Burp的事件日志中看到HTTPS連接錯誤。由于整個設備都是代理的,你會看到許多來自使用SSL鎖定的應用程序的被阻止的請求(例如谷歌Play),所以看看你是否能找到一個與應用程序相關的域。如果你沒有看到任何相關的失敗連接, 則說明你的應用程序很可能沒有代理。
作為額外的完整性檢查,你可以查看應用程序是否使用了第三方框架。如果應用程序是用Flutter編寫的,它肯定沒有代理意識,而如果它是用Xamarin或Unity編寫的,它很有可能會忽略系統(tǒng)的代理設置。
用apktool反編譯:apktool d myapp.apk;
通過已知的位置:
- Flutter: myapp/lib/arm64-v8a/libflutter.so
- Xamarin: myapp/unknown/assemblies/Mono.Android.dll
- Unity: myapp/lib/arm64-v8a/libunity.so
(2) 解決方案
有幾件事可以嘗試:
- 使用ProxyDroid(僅限root用戶),盡管它是一個舊應用,但仍然可以很好地運行。 ProxyDroid使用iptables來強制將流量重定向到你的代理;
- 通過第二個無線接口設置自定義熱點,并使用iptables自己重定向流量。你可以在mitmproxy文檔中找到設置,它是另一個有用的HTTP代理,同樣的設置也適用于Burp。
在這兩種情況下,你都已從“代理意識”設置轉換為“透明代理”設置。你必須做兩件事:
- 在設備上禁用代理。如果你不這樣做,那么Burp將同時收到代理請求和透明請求,二者互不兼容;
- 配置Burp以支持透明代理通過代理>選項>活動代理>編輯>請求處理>支持不可見代理;
再次執(zhí)行完整性檢查,現在希望能在Burp的事件日志中看到SSL錯誤。
在下一篇文章中,我還會詳細介紹“應用程序是否使用了自定義端口?”,“應用程序是否使用SSL鎖定?”等問題。
本文翻譯自:https://blog.nviso.eu/2020/11/19/proxying-android-app-traffic-common-issues-checklist/