前言
隨着移動應用的發展和推廣,APP應用安全越來越受到重視。APP中各類防抓包的機制的出現,讓測試無法正常進行分析。
這篇文章算是總結一下我最近遇到的一款抓不到包的APP,給大家提供一個雙向證書認證應該如何解決的思路。
判斷證書雙向認證
剛拿到此app時候常規方法一把梭,發現只要一開啟手機代理,卻提示網絡異常,通過觀察burpsuite的記錄發現,只有請求包而沒有響應包。
直覺告訴我應該是使用SSL Pinning防止中間人攔截攻擊,然后我開啟了ssl-kill-switch2后發現該APP所有的響應包返回 400 No required SSL certificate was sent的報錯信息。
根據報錯提示,搜了一下發現該錯誤是指服務器端啟用了證書雙向認證。
當服務器啟用了證書雙向認證之后,除了客戶端去驗證服務器端的證書外,服務器也同時需要驗證客戶端的證書,也就是會要求客戶端提供自己的證書,如果沒有通過驗證,則會拒絕連接,如果通過驗證,服務器獲得用戶的公鑰。
該app直接封裝了客戶端的證書,相比於單項認證,無非就是多了一個服務器端驗證客戶端證書的過程,而在以往的用代理工具如burp這類工具,抓取https的包時,除了瀏覽器獲取的是代理工具的證書外,默認是不發送證書給服務器端的。burp在抓取https報文的過程中也提供了雙向認證的證書發送,但是是使用了burp提供的證書文件,也就是CA證書。app的服務端不認證這個burp提供的CA證書,那么我們就需要拿到匹配的證書,以其對服務端進行匹配。
突破思路
確定該APP是證書雙向認證,那么APP客戶端一定會存一個證書文件。通過對該APP解壓並進入payload目錄,發現只有一個.p12結尾的證書文件。
嘗試點開發現需要安裝密碼。
app解密的代碼邏輯
客戶端發送數據包以后,需要去從app中讀取這個證書文件,密碼是以硬編碼形式放在了代碼中,利用這個代碼中的密碼字段去解密證書文件,從中讀取以后,再進行解密並回傳給服務器端進行確認。由此推斷,尋找證書名稱應該就可以拿到安裝密碼。
獲取安裝證書密碼
首先對其APP進行砸殼,完成后我們解壓縮然后使用IDA加載二進制文件。
然后在String窗口搜索證書的名稱client,搜索后進入對應的類。
通過跟蹤發現了該證書密鑰,如下:
測試使用該密鑰發現可以成功安裝該證書:
burp添加客戶端證書
host填寫app服務端的主域名。
隨后選擇app客戶端內的client.p12證書文件,並輸入安裝密碼。
證書成功導入,勾選即可使用。
ok~發現可以正常抓包,如下。
參考文章,感謝各位大佬的傾情奉獻
https://se8s0n.github.io/2018/09/11/HTTP系列(五)/
https://xz.aliyun.com/t/6551#toc-14
https://juejin.im/post/5c9cbf1df265da60f6731f0a
https://www.secpulse.com/archives/54027.html