前言
在安卓手機安裝上應用后,使用抓包工具如burpsuite無法抓包(手機用戶憑證已安裝burp的證書),此時考慮存在抓不到包的原因可以分為以下四種情況:
- 應用只信任系統證書,不信任我們安裝在用戶憑證的證書,
- 應用做了單向校驗,一般情況下是客戶端校驗服務端證書是否是正確來源的,也有服務端校驗客戶端證書的,
- 應用做了雙向校驗,也就是服務端和客戶端互相校驗證書來源的正確性,
- 應用不走http系統代理,
參考鏈接
【1】HTTPS單向認證、雙向認證、抓包原理、反抓包策略
【2】HTTPS實戰之單向驗證和雙向驗證
正文
在安裝了代理軟體證書到手機用戶憑證中后(這里以burpsuite舉例,后續均以該代理軟體說明),使用burp設定代理后,應用無法訪問網路,即抓取不到資料包,這里可以考慮的情況有三種,即前言中的1,2,3種情況,
- 只信任系統證書解決方案
這個只信任系統證書其實是在使用安卓SDK的API24及以上的應用系統中默認配置的,詳情可參考鏈接【3】,因此使用高于API24以上的sdk開發的應用默認不信任安裝的用戶證書,這里介紹兩種該問題解決方案,
方案一:在手機root的情況下,將我們的證書以<Certificate_Hash>.<Number>的名稱匯入到/system/etc/security/cacerts/,一般后綴為0,這里需要使用到openssl進行計算我們匯出證書的hash值,可參考鏈接【5】進行安裝,這里列出計算hash值的命令如下:
openssl x509 -inform der -subject_hash_old -in bp.cer
或者
openssl x509 -subject_hash_old -in bp.pem

注意:這里需要強調的是,安裝上系統證書,可到手機系統信任的憑證中查看是否已經有該證書顯示資訊,若存在就無需重啟手機,因為對于高版本系統手機存在重啟后證書失效的問題,在系統信任憑證中無法找到安裝的證書,可到/system/etc/security/cacerts/目錄下查看證書的大小是否為0kb,若為0即需要重新復制一份過來,如果多次嘗試仍然為0,可考慮重啟嘗試,
方案二:可參考官網【3】的詳細解決方案,即通過反編譯APP應用客戶端,在客戶端中添加配置資訊,以讓APP信任我們的用戶憑證,由于該方法是修改客戶端代碼,即存在應用加固無法反編譯或者反編譯以及回編譯出現各種報錯問題,
這里以無加固,反編譯以及回編譯正常的應用來說明(當然大家遇到加固應用也可嘗試進行反編譯,回編譯處理各種報錯),
首先使用反編譯工具AndroidKiller反編譯應用,在res/xml目錄下找到network_security_config.xml添加如下代碼,一般是存在該檔案,只需要添加<certificates src="user" />即可,沒有的話自己創建一個檔案,
<network-security-config>
<domain-config>
<domain includeSubdomains="true">userCaDomain.com</domain>
<domain includeSubdomains="true">otherUserCaDomain.com</domain>
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</domain-config>
</network-security-config>
然后在AndroidManifest.xml中添加注冊資訊
android:networkSecurityConfig="@xml/network_security_config"

最后保存,回編譯APP生成新的apk檔案,使用新的apk檔案進行抓包測驗,
參考鏈接
【3】Android Developers Blog: Changes to Trusted Certificate Authorities in Android Nougat (googleblog.com)
【4】Android 7.0 之后抓包 unknown 和證書無效的解決方案,手機需root
【5】系統證書安裝
- 單向證書校驗解決方案
單向證書校驗一般是指客戶端對服務端的證書校驗,遇到該問題一般可考慮使用root手機進行安裝xposed框架及justtrustme模塊進行繞過該限制,如果手機未root,可考慮使用frida的hook方式進行繞過,這里貼出參考鏈接【6】,里面詳細說明了frida的hook進行繞過sslPinning的限制,為避免鏈接失效,貼出復制出的文字及腳本,對于服務端校驗客戶端證書的情況放在雙向證書校驗解決方案中進行說明,
Frida的hook方案腳本見下:
抓取HTTPS的資料包
Frida繞過SSL單向校驗
遇到JustTrustMe無法繞過SSL單向校驗的情況, 接觸了Frida, 就嘗試用DBI的方法繞過SSL的單向校驗,
參考文章https://techblog.mediaservice.net/2017/07/universal-android-ssl-pinning-bypass-with-frida/
Frida這里就不詳細地說明Frida的安裝方法及使用方法了,
設定Fiddler代理, 在本地下載Fiddler的證書, 將證書直接重命名為cert-der.crt,之后將證書push到/data/local/tmp目錄下, 在adb shell里輸入./frida-server &再在PC端進行操作,
新建一個frida-android-repinning.js檔案, 詳細代碼如下:
setTimeout(function(){
Java.perform(function (){
console.log("");
console.log("[.] Cert Pinning Bypass/Re-Pinning");
var CertificateFactory = Java.use("java.security.cert.CertificateFactory");
var FileInputStream = Java.use("java.io.FileInputStream");
var BufferedInputStream = Java.use("java.io.BufferedInputStream");
var X509Certificate = Java.use("java.security.cert.X509Certificate");
var KeyStore = Java.use("java.security.KeyStore");
var TrustManagerFactory = Java.use("javax.net.ssl.TrustManagerFactory");
var SSLContext = Java.use("javax.net.ssl.SSLContext");
// Load CAs from an InputStream
console.log("[+] Loading our CA...")
var cf = CertificateFactory.getInstance("X.509");
try {
var fileInputStream = FileInputStream.$new("/data/local/tmp/cert-der.crt");
}
catch(err) {
console.log("[o] " + err);
}
var bufferedInputStream = BufferedInputStream.$new(fileInputStream);
var ca = cf.generateCertificate(bufferedInputStream);
bufferedInputStream.close();
var certInfo = Java.cast(ca, X509Certificate);
console.log("[o] Our CA Info: " + certInfo.getSubjectDN());
// Create a KeyStore containing our trusted CAs
console.log("[+] Creating a KeyStore for our CA...");
var keyStoreType = KeyStore.getDefaultType();
var keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
// Create a TrustManager that trusts the CAs in our KeyStore
console.log("[+] Creating a TrustManager that trusts the CA in our KeyStore...");
var tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
var tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
console.log("[+] Our TrustManager is ready...");
console.log("[+] Hijacking SSLContext methods now...")
console.log("[-] Waiting for the app to invoke SSLContext.init()...")
SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;", "[Ljavax.net.ssl.TrustManager;", "java.security.SecureRandom").implementation = function(a,b,c) {
console.log("[o] App invoked javax.net.ssl.SSLContext.init...");
SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;", "[Ljavax.net.ssl.TrustManager;", "java.security.SecureRandom").call(this, a, tmf.getTrustManagers(), c);
console.log("[+] SSLContext initialized with our custom TrustManager!");
}
});
},0);
在cmd, 輸入如下命令:
$ adb push burpca-cert-der.crt /data/local/tmp/cert-der.crt
$ frida -U -f it.app.mobile -l frida-android-repinning.js --no-pause
在關閉應用的情況下(避免Magisk Hide處于開啟狀態), 可得到回顯并繞過SSL pinning,
參考鏈接:https://xz.aliyun.com/t/6551#toc-9
參考鏈接
【6】Frida繞過SSL單向校驗
- 雙向證書校驗解決方案
對于使用雙向校驗的應用需要在客戶端本地尋找到證書,以及在客戶端代碼中尋找到證書密鑰,然后安裝到我們的代理軟體中去,具體操作步驟也可查看鏈接【6】進行查看具體實際案例操作步驟,
- 不走系統http代理解決方案
對于設定不走系統代理的最直接明顯的效果就是在設定好burp代理,依然可以正常使用APP,APP的網路通訊未受到絲毫影響,解決不走系統http代理的方式可以采用vpn代理方式進行繞過,即先將手機流量通過vpn發送到電腦代理軟體,再通過代理軟體抓包查看,使用vpn代理抓包可參考下一篇文章《charles+socks5代理+burpsuite抓包》,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/295445.html
標籤:其他
