《吐血整理》高級系列教程-吃透Fiddler抓包教程(26)-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 內不再像原來一樣默認信任用戶的證書。

Google在Android7.0修改了安全策略,Android系統大於7.0時,應用不在信任用戶安裝的證書文件。用戶添加的 CA 證書不能再用於安全連接,對於 https 傳輸的數據就抓取不到了。

Android 7.0+的版本不能抓包,緣由Android 更新了網路的安全性配置api >24,默認不信任用戶導入的CA證書,所以需要配置文件,來信任用戶導入的證書。

官方說明文檔://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="system" />
 
        <certificates src="user" />
 
    </trust-anchors>
 
</base-config>

Android 7.0 (API level 24) 及以後是這樣的:

<base-config cleartextTrafficPermitted="true">
 
    <trust-anchors>
 
        <certificates src="system" />
 
    </trust-anchors>
 
</base-config>

同時在上面的鏈接中,Google也給出了辦法,怎麼在Android7.0及以後的系統中,讓APP信任我們手工導入的CA證書。就是宏哥在後邊的5.3小節中介紹的內容。

4.Android 版本越高,HTTPS 報文越難抓

在Android 安裝證書,宏哥覺得這個步驟意義不大,根本原因在於:用戶自己安裝的 CA 證書沒有 ROOT 許可權。

我們先看一張圖,這個是 Android 的證書信任頁面:

從上圖可以看出,Android 系統把證書信任分為兩大塊:

  • 系統 CA 證書:基本擁有所有許可權
  • 用戶 CA 證書:用戶自行安裝,許可權很低

我們自己安裝的 Charles 證書都屬於用戶 CA 證書。除了證書的許可權問題,Android 的不同版本對許可權的處理規則也不一樣:

✅: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,升級說明網址://docs.msdk.qq.com/v5/zh-CN/FAQS/fe2df04a168059a153dcd0f18f75d789/b801ba90b273389d8e588d46343efb37.html 。沒有辦法老大說話了,中國各大應用市場手機APP紛紛響應號召在2019 年統一要求 APP API 版本必須大於 28,這種安裝包很難找到了,而且互聯網產品迭代這麼快,不一定能保證安裝包可用。

4.騷操作

正常大道走不通,Android 小道還是有很多的。社區上有各種輪子可以繞開限制,但和 Fiddler 關係不大,宏哥就不展開說了。喜歡折騰的同學可以研究一下。

5.快速解決法

我們既然已經清楚了抓不到包的原因和罪魁禍首了,針對其進行解決即可。

5.1使用低與7.0版本Android系統

用android 7.0以下系統的設備去裝應用,是可以正常抓包,但是一般來說,android 7.0以下不管是真機還是模擬器,運行起來都是比較卡的,能接受不那麼流暢體驗的用戶可以嘗試,適合小白型用戶使用。

找一個低於 7.0 版本的 Android 設備或者模擬器,即可解決。但是考慮到:治標不治本,公司本身就沒有這樣的設備,再加上找了幾個模擬器,都是 Android7.0 版本的,所以此方案,直接選擇放棄。

然後只好再去找開發,開發研究了半天,結果過來告訴我,我的iOS是可以抓包的啊,Android 的就不知道了,一瞬間我都有點想掀桌子了…

5.2targetSdkVersion設置為23

把應用apk的targetSdkVersion設置為23及以下,也是可以正常抓包,但是假如是抓別人的應用,同時別人又做了防止反編譯措施的話,這個方案就不適用了。

5.3設置信任用戶證書

設置信任用戶證書,也就是自定義可信的CA,這個也是官方網址://developer.android.google.cn/training/articles/security-config  給出的解決方案。具體操作步驟如下:

1.在源碼res目錄下新建xml目錄,增加network_security_config.xml文件(工程名/app/src/main/res/xml/network_security_config.xml),參考官方文檔知道network_security_config.xml文件內容為:

<network-security-config>
    <base-config cleartextTrafficPermitted="true">

        <trust-anchors>
            <certificates src="system" overridePins="true" />
            <certificates src="user" overridePins="true" />
        </trust-anchors>

    </base-config>

</network-security-config>

說明:certificates說明的src=「system"表示信任系統的CA證書,src=「user"表示信任用戶導入的CA證書

2.修改項目的AndroidManifest.xml文件,在application中增加android:networkSecurityConfig="@xml/network_security_config"

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
                    ... >
        ...
    </application>
</manifest>

說明:android:networkSecurityConfig的值指向的就是上一步創建的xml文件

3.然後然後重新編譯再打包安裝apk即可抓包!前提手機已經要安裝了fiddler等CA證書哈!!!

這個方案也是僅適用於有android基礎同時懂反編譯的人員使用。這對開發童鞋來說,也很方便。但是,因為測試的是企業微信小程式,想讓企業微信的開發人員幫我這麼干,簡直是白日做夢,更不用說安全等問題…

6.webview抓包失敗

上面可以解決android原生抓包問題,但在android7.0以上的手機,開著網路代理訪問不了webview,若要抓包webview,需要在webview的WebViewClient中,將一行程式碼給注釋掉:

super.onReceivedSslError(view, handler, error)

這樣是為了忽略掉SSL證書錯誤,因為開啟代理後網路會變得不安全,證書會報錯誤,webview檢測到證書錯誤之後就不請求任何數據。 注釋是為了忽略掉父類的處理,默認執行下去。

6.1警告

這樣的配置操作是敏感且危險的,只能用於測試環境方便抓包,線上包一定注意要恢復配置。

6.2拓展

通過查找資料,還有一個方法,通過重載WebViewClient的onReceivedSslError()函數並在其中執行handler.proceed(),即可忽略SSL證書錯誤,繼續載入頁面,程式碼如下:

WebView webview = (WebView) findViewById(R.id.webview);
webview.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        // 不要調用super.onReceivedSslError,因為其包含了一條 handler.cancel(),第一次訪問時無法載入,第二次以後可以載入
        // super.onReceivedSslError(view, handler, error);
        // 忽略SSL證書錯誤,繼續載入頁面
        handler.proceed();
    }
}

 7.小結

Android證書分為「用戶證書」和「系統證書」兩種,在設置->安全->"查看安全證書"列表中,可以看到「系統」和「用戶」兩個列表。用戶通過瀏覽器下載安裝或者通過WLAN高級設置安裝的證書均為用戶證書。

關於證書的兩個注意事項

(1)安裝用戶證書必須要設置開機密碼,而且設置後就不能取消,除非先刪掉所有的用戶證書。如果安裝為系統證書就不需要設置開機密碼,自動化操作時更方便。
(2)Android 7以上版本APP默認不信任用戶證書,只信任系統證書,安裝為用戶證書,對APP的HTTPS抓包會失敗。安裝為全局證書才能被所有APP信任,方可進行HTTPS抓包。

默認情況下,針對 Android 7.0+ (API level 24+) 的應用不再信任用戶或管理員添加的CA證書來進行安全連接。(之前我們其實是將安全證書安裝到Android手機上作為用戶信任安全證書,新版本如果APP開啟了設置我們的代理請求會被認為是不安全的。)
Android的系統證書的存儲位置是/system/etc/security/cacerts,證書文件必須是PEM格式,而且文件命名必須符合系統證書規範。

 好了,今天時間也不早了,宏哥就講解和分享到這裡,感謝你耐心地閱讀!!!

Tags: