天天看點

(APP測試三闆斧)第三闆: Frida+IDA手工逆向證書密碼 一、優點二、步驟

 一、優點

優點:

适用大部分情況,尤其是一鍵自動提驗證書和密碼,傻瓜化操作。

缺點:

一鍵自動提驗證書和密碼還好,但不是萬能的,手工逆向證書密碼技術難度較大,需要有代碼功底,并且如果有加殼加強等操作更加麻煩。

二、步驟

1.一鍵自動提驗證書和密碼

因為 APP 在向服務端發請求時, APP 肯定會操作證書,是以如果能找到 APP 操作證書的代碼地方, Hook 這部分代碼,對參數做些輸出列印,證書和證書密碼就都有了。

大部分情況下,都是Hook java.security.KeyStore 這個類的 load 方法,load 方法的形參就是我們需要的證書和密碼。

摳出的證書和密碼,配置進 fiddler 或 burpsuite裡面,就可以抓到雙向認證的包。

PS: 還要注意證書的格式,摳出的證書可能是 jks 或 bks 格式的,fiddler 可能需要 p12 格式的, 是以要找工具先轉換一下格式。

python3 cert_pwd.py
           
(APP測試三闆斧)第三闆: Frida+IDA手工逆向證書密碼 一、優點二、步驟

需要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
           
(APP測試三闆斧)第三闆: Frida+IDA手工逆向證書密碼 一、優點二、步驟

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());
           
(APP測試三闆斧)第三闆: Frida+IDA手工逆向證書密碼 一、優點二、步驟

繼續跟蹤進入null_getStorePassword

(APP測試三闆斧)第三闆: Frida+IDA手工逆向證書密碼 一、優點二、步驟

發現最終密碼是從native層擷取的

(APP測試三闆斧)第三闆: Frida+IDA手工逆向證書密碼 一、優點二、步驟

我們來看下初始化加載的是哪個so檔案

(APP測試三闆斧)第三闆: Frida+IDA手工逆向證書密碼 一、優點二、步驟

發現是soul-netsdk,解壓soul.apk,使用IDA打開soul-netsdk

搜尋加載的關鍵字,最終發現證書密碼(搜尋到結果後,使用F5僞編譯代碼)

(APP測試三闆斧)第三闆: Frida+IDA手工逆向證書密碼 一、優點二、步驟

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()

繼續閱讀