反抓包ssl-pinning


SSL-pinning

反抓包策略

為了防止中間人攻擊,可以使用SSL-Pinning的技術來反抓包。 可以發現中間人攻擊的要點的偽造了一個假的服務端證書給了客戶端,客戶端誤以為真。解決思路就是,客戶端也預置一份服務端的證書,比較一下就知道真假了。

SSL-pinning有兩種方式: 證書鎖定(Certificate Pinning) 和公鑰鎖定( Public Key Pinning)。

證書鎖定 需要在客戶端代碼內置僅接受指定域名的證書,而不接受操作系統或瀏覽器內置的CA根證書對應的任何證書,通過這種授權方式,保障了APP與服務端通信的唯一性和安全性,因此客戶端與服務端(例如API網關)之間的通信是可以保證絕對安全。但是CA簽發證書都存在有效期問題,缺點是在 證書續期后需要將證書重新內置到APP中。
公鑰鎖定 提取證書中的公鑰並內置到客戶端中,通過與服務器對比公鑰值來驗證連接的正確性。制作證書密鑰時,公鑰在證書的續期前后都可以保持不變(即密鑰對不變),所以可以避免證書有效期問題,一般推薦這種做法。

####

突破SSL-Pinning抓包
在逆向界,一山更比一山高。 思路是這樣的:內置證書或者公鑰的時候,常常會有對比驗證的函數,直接控制這個函數的返回結果讓驗證通過不就好了嗎。 於是就有了一個突破SLL-Pinning的經典操作:采用Xposed+justTrustme模塊。 這個方案使用的是JustTrustMe這個Xposed模塊,它所做的事情就是將各種已知的的HTTP請求庫中用於校驗證書的API都進行Hook,使無論是否是可信證書的情況,校驗結果返回都為正常狀態,從而實現繞過證書檢查的效果。

###

APP抓包相對繁瑣,越來越多的 APP 在 https 請求和響應時,為了防止中間人攻擊(或中間人抓包),會做證書認證,讓抓包工具抓不到請求。

證書認證分單向認證和雙向認證,雙向認證是相較於單向認證而言的,

單向認證

單向認證就是只在 APP 側做證書校驗,單向認證有現成的解決方法,比如用各種 bypass ssl 校驗的 hook 腳本既可讓單向認證失效,例如:JustTrustMe 。

如果 APP 的網絡請求庫有混淆,上述 bypass ssl 腳本無效,也有開源作者開發了自適配的 bypass 程序,可以 hook 混淆后的網絡庫。比如:JustMePlush 。 

 

雙向認證

簡單說了下單向認證如何解決,開始說雙向認證如何解決。 雙向認證除了要在 APP 側做證書校驗外, 對方服務端還要做證書校驗。對方服務端是要檢測證書的,不提交真正的證書給服務端,肯定會請求失敗。

雙向認證抓包有兩種解決方法:

一是:按照搞定證書的思路去想的話,就是要想辦法拿到真正的證書。

二是:Hook SSL 對數據解密數據的地方。

雙向認證-扣證書

 

方法一: 因為 APP 能正常跟服務端通信,所以真正的證書肯定是在 APP 里面。所以就是要想辦法從 APP 里摳出證書。摳證書有開源的 Frida Hook 腳本。如下地址是開源作者寫的 Frida Hook 腳本 https://gist.github.com/ceres- c/cb3b69e53713d5ad9cf6aac9b8e895d2gfgg 可以把證書從內存里讀出來保存到本地,並且證書密碼也能讀出來,非常的方便。

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

大部分情況下,我們不用非常熟悉安卓原理,比如安卓在代碼層面是如何操作證書的(當然熟悉更好)。因為資訊發達,一般靈活借助搜索引擎,靈活查閱資料,可以大體知道這些,就可以嘗試去寫 Hook 腳本去嘗試看看。 查閱資料可以知道,安卓操作證書通常是 java.security.KeyStore 這個類,然后再了解下這個類的用法,參數形式。就可以嘗試去 Hook 了。上述腳本就是 Hook  java.security.KeyStore 這個類的 load 方法,load 方法的形參就是我們需要的證書和密碼。 摳出的證書和密碼,配置進 fiddler 或 charles 里面,就可以抓到雙向認證的包。 PS: 還要注意證書的格式,摳出的證書可能是 jks 或 bks 格式的,fiddler 可能需要 p12 格式的, 所以要找工具先轉換一下格式。

雙向認證-ssl-logger

方法二: 如果只是想抓包,還有另一種方法,不需要摳證書的方法。雖然 https 在傳輸過程中是加密的,但在終端顯示的時候,必然會解密,不然 APP 上都沒法顯示了。所以如果能知道安卓解密 SSL  加解密是哪個類, Hook 這個類, 類里相關方法的輸入輸出肯定就是傳輸的明文數據。 所以可以查閱資料,看看相關類的用法,就可以嘗試去 Hook 打印輸出看看情況。也有開源作者開源了該 Hook 腳本, 比如 5alt 老板在google開源的腳本基礎上做了修改了的 ssl_logger 。 https://github.com/5alt/ssl_logger 能夠 Hook SSL 加解密的地方,它會把傳輸的數據保存為 pcap 格式。再使用 wireshark 打開該 pcap文件, 在 wireshark 上就可以看到明文的數據了。

如果要模擬向服務器發送請求的話,還是只能使用第一種方法,因為客服端必須要提交正確的證書,服務端才會正確響應。必須得摳出證書,模擬請求時必須帶上證書,才能請求到數據。安卓上的證書好多是 jks/bks格式的, 如果使用 Python requests 庫的話, 不支持這個格式, 所以要想辦法把證書轉成 cert 格式的。

上面兩種方法都是使用 Frida 進行 Hook ,所以要有 Root 過的手機和明白Frida 怎么使用就能搞定。 對於爬蟲來說,搞定抓包和請求參數加密的問題,大部分 Hook ,都可以通過 Hook 安卓系統 API 來找到 APP 代碼位置,或直接搞定。其實很少人能很熟悉安卓系統的各種原理,大部分時候能靈活通過各種關鍵字能查到相關原理的講解文獻,文獻里講的 API 靈活點拿去 Hook 康康線索,就能搞定很多拉。 其實使用雙向認證的 APP 還是少數, 對服務器性能多少有影響。 

 

####

 

 

####


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM