一、優點
優點:
适用大部分情況,尤其是一鍵自動提驗證書和密碼,傻瓜化操作。
缺點:
一鍵自動提驗證書和密碼還好,但不是萬能的,手工逆向證書密碼技術難度較大,需要有代碼功底,并且如果有加殼加強等操作更加麻煩。
二、步驟
1.一鍵自動提驗證書和密碼
因為 APP 在向服務端發請求時, APP 肯定會操作證書,是以如果能找到 APP 操作證書的代碼地方, Hook 這部分代碼,對參數做些輸出列印,證書和證書密碼就都有了。
大部分情況下,都是Hook java.security.KeyStore 這個類的 load 方法,load 方法的形參就是我們需要的證書和密碼。
摳出的證書和密碼,配置進 fiddler 或 burpsuite裡面,就可以抓到雙向認證的包。
PS: 還要注意證書的格式,摳出的證書可能是 jks 或 bks 格式的,fiddler 可能需要 p12 格式的, 是以要找工具先轉換一下格式。
python3 cert_pwd.py
需要python腳本輔助下,把上面的證書16進制先轉換為jks格式
python3 cert2file.py
import sys
f = open('keystore.jks', 'wb')
f.write(bytes.fromhex("xxx"))
再講jks證書轉為p12證書,p12證書再轉換為crt證書
keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.p12 -srcstoretype jks -deststoretype pkcs12
openssl pkcs12 -in keystore.p12 -nokeys -clcerts -out keystore.crt
2.手工分析證書密碼
使用GDA打開apk,搜尋證書關鍵字.p12
這個就是加載證書的代碼,第二個參數就是密碼,是以往上跟蹤v1
v4_1.load(v0_1, v1.toCharArray());
發現值是通過a函數來的,跟蹤進入a函數
String v1 = SoulNetworkSDK.Auto_getValue().a(SoulNetworkSDK.Auto_getValue().Auto_getValue());
繼續跟蹤進入null_getStorePassword
發現最終密碼是從native層擷取的
我們來看下初始化加載的是哪個so檔案
發現是soul-netsdk,解壓soul.apk,使用IDA打開soul-netsdk
搜尋加載的關鍵字,最終發現證書密碼(搜尋到結果後,使用F5僞編譯代碼)
3.踩過的坑
1.這個部落格貼的js代碼java_security_KeyStore__load函數結尾少了個圓括号,是以文法錯誤
https://api-caller.com/2019/03/30/frida-note/#soul
2.python調用Frida的函數
如果device = frida.get_usb_device()不行,試試device = frida.get_remote_device()