遇到一個樣本http://app.mi.com/details?id=com.msf.credit&ref=search,使用了https雙向認證,記錄一下解決問題的流程。
一、抓包分析
開始是 Failure SSLHandshake: Received fatal alert: certificate_unknown
使用frida hook ssl 認證,然后錯誤變了
錯誤信息是400 No required SSL certificate was sent,通過調研知道是HTTPS 雙向認證
二、自己搭建環境
第一次遇見HTTPS雙向認證,網上只有正向的搭建教程,沒有逆向教程。而且這個app是kotlin編寫的,逆向出的代碼也跟java寫的不太一樣,這也加大了逆向難度。所以我想著先自己搭建一個環境在本地試試再說。
https://blog.imdst.com/nginx-ssl-shuang-xiang-ren-zheng-key-sheng-cheng-he-pei-zhi/,這篇文章是介紹如何配置nginx雙向認證的,按照這個成功搭建了nginx雙向認證,并實驗成功。
沒加載證書的時候:
加載證書的時候:
三、編碼實現
通過自己搭建,已經基本了解了https的工作流程。下一步是從網上找類似的代碼,然后通過特征代碼去逆向。
實際過程并不順利,因為app用的是kotlin,我之前沒用過。
后來是這篇文章給了我思路,文中有一句話
把之前生成的證書(.cer)放到安卓項目的assets或者raw目錄下,讀取文件流用以下方法獲取SSLSocketFactory 。
image.png
四、charles驗證
修改Proxy->SSL Proxying Settings ->Client Certificates,導入證書。
再次請求,要求輸入密碼。
五、尋找密碼
開始嘗試的password,但是沒有找到,然后嘗試搜索證書的名字“client_product”,找到了。
推測mjcredit_product應該就是證書的密碼。
六、charles驗證成功
輸入密碼
點擊OK
抓包成功了
七、curl測試
curl -H 'Content-Type: application/json' -H 'User-Agent: Android/23;com.msf.credit/39' -H 'Host: app.msfcredit.cn:6113' --data-binary '{"mobile":"176111100003","password":"xHiN9t3ixVpsqVoLZWyiEQ==","imei":"355455060644058"}' --compressed 'https://app.msfcredit.cn:6113/userService/login' -k --cert-type P12 --cert client_product.p12:mjcredit_product
其中-k是忽略檢查服務器證書的合法性, --cert-type P12標明證書的類型,--cert client_product.p12:mjcredit_product標明證書的路徑和密碼。
八、代碼驗證
用HttpClient跑通了。
關鍵代碼如下:
結果如下