26 《吐血整理》高級系列教程-吃透Fiddler抓包教程-Fiddler如何抓取Android7.0以上的Https包-上篇

1.簡介眾所周知,假如設備是android 7.0+的系統同時應用設置targetSdkVersion >= 24的話 , 那么應用默認是不信任安裝的Fiddler用戶證書的,所以你就沒法抓到應用發起的https請求,然后你在Fiddler就會看到一堆200 HTTP Tunnel to xxx.xxx.xxx:443的請求日志,這些都是沒有成功抓取的https請求,下面重點介紹一下各種解決方案,相信總有一款解決方案適合你~
在抓包測試中 , 相信很多人都遇到過 Android 高版本(Android7.0 以上)系統無法抓包的問題 。
由于在測試過程中對分析定位問題很不方便,所以就想找開發的同學幫忙,結果開發也說搞不定,那只能自己解決了 。
2.現象Android6.0 及以下系統手機可以抓取https包,而 Android7.0 及以上系統手機不能抓取https包(安裝了https證書也不行) 。
3.原因Android7.0+ 的版本新增了證書驗證(系統證書),所以 App 內不再像原來一樣默認信任用戶的證書 。
谷歌在安卓7.0修改了安全策略,安卓系統大于7.0時,應用不在信任用戶安裝的證書文件 。用戶添加的 CA 證書不能再用于安全連接,對于 https 傳輸的數據就抓取不到了 。
Android 7.0+的版本不能抓包 , 緣由Android 更新了網絡的安全性配置api >24 , 默認不信任用戶導入的CA證書 , 所以需要配置文件,來信任用戶導入的證書 。
官方說明文檔:https://developer.android.google.cn/training/articles/security-config.html
By default, secure connections (using protocols like TLS and HTTPS) from all apps trust the pre-installed system CAs, and apps targeting Android 6.0 (API level 23) and lower also trust the user-added CA store by default.
果然,在Android 6.0 (API level 23)及以前,APP默認信任系統自帶的CA證書以及用于導入的CA證書,Android 6.0 (API level 23)以后,APP默認只信任系統自帶的CA證書,對于用戶導入的不予理會 。
也就是說,關于 [network-security-config],在Android 6.0 (API level 23)及以前默認是這樣的:
<base-config cleartextTrafficPermitted="true"><trust-anchors><certificates src="http://img.zhejianglong.com/231017/1IH1C14-0.jpg" /><certificates src="http://img.zhejianglong.com/231017/1IH11410-1.jpg" /></trust-anchors></base-config>Android 7.0 (API level 24) 及以后是這樣的:
<base-config cleartextTrafficPermitted="true"><trust-anchors><certificates src="http://img.zhejianglong.com/231017/1IH1C14-0.jpg" /></trust-anchors></base-config>同時在上面的鏈接中,Google也給出了辦法 , 怎么在Android7.0及以后的系統中,讓APP信任我們手工導入的CA證書 。就是宏哥在后邊的5.3小節中介紹的內容 。
4.Android 版本越高,HTTPS 報文越難抓在Android 安裝證書,宏哥覺得這個步驟意義不大,根本原因在于:用戶自己安裝的 CA 證書沒有 ROOT 權限 。
我們先看一張圖 , 這個是 Android 的證書信任頁面:

26 《吐血整理》高級系列教程-吃透Fiddler抓包教程-Fiddler如何抓取Android7.0以上的Https包-上篇

文章插圖
從上圖可以看出,Android 系統把證書信任分為兩大塊:
  • 系統 CA 證書:基本擁有所有權限
  • 用戶 CA 證書:用戶自行安裝,權限很低
我們自己安裝的 Charles 證書都屬于用戶 CA 證書 。除了證書的權限問題,Android 的不同版本對權限的處理規則也不一樣:
【26 《吐血整理》高級系列教程-吃透Fiddler抓包教程-Fiddler如何抓取Android7.0以上的Https包-上篇】:Android 7.0 以下:信任用戶 CA 證書,可以簡單的理解為我們安裝的證書直接獲得 ROOT 權限
:Android 7.0 以上,targetSdkVersion < 24:信任用戶 CA 證書
:Android 7.0 以上,targetSdkVersion >= 24:不信任用戶 CA 證書
通過以上的分析 , 我們可以得出幾個讓 Android 信任 Fiddler 證書的方案:
1.ROOT
直接 ROOT Android 手機,把 Fiddler證書放到系統證書里,實現證書洗白 。
2.準備一個低于 Android 7.0 的手機
Android 7.0 是 2016 年的系統,按照 Android 手機兩年一換代一年一更新的速度算,這種手機很難找到了 。
3.準備一個 targetSdkVersion < 24 的 APP 安裝包
Google Play Store要求今年 8 月之后上線、11 月之后更新的 App 必須升級到 Target API 28,升級說明網址:https://docs.msdk.qq.com/v5/zh-CN/FAQS/fe2df04a168059a153dcd0f18f75d789/b801ba90b273389d8e588d46343efb37.html。沒有辦法老大說話了,國內各大應用市場手機APP紛紛響應號召在2019 年統一要求 APP API 版本必須大于 28,這種安裝包很難找到了 , 而且互聯網產品迭代這么快 , 不一定能保證安裝包可用 。

推薦閱讀