前言
如果你是幹web安全的,當你在測試目前大多數的手機APP應用程序時,你一定遇到過burpsuite無法抓到數據包的情況,開始你以爲只是https的問題,但是當你使用了burpsuite僞證書也無法抓取到時,你心裏除了有句“MMP……”外,你一定也在思考這其中的蹊蹺。
爲什麼HTTPS的網站使用僞證書可以抓到,而在APP裏面同樣的方法就抓不到?答案是:APP啓用了SSL Pinning(又叫“SSL證書綁定”)。
HTTPS的原理你必然懂,在建立SSL通道的過程中,當客戶端向服務端發送了連接請求後,服務器會發送自己的證書(包括公鑰、證書有效期、服務器信息等)給客戶端,如果客戶端是普通的瀏覽器,比如IE瀏覽器,則:
- 使用內置的CA證書去校驗服務器證書是否被信任,如果不被信任,則會彈出https的告警提示信息,由用戶自己決定是否要繼續;
- 同樣,用戶也可以主動地將服務器證書導入到瀏覽器的受信任區,下次打開時該服務器證書將會自動被信任。
爲啥中間人可以劫持https流量,以及在瀏覽器上我們爲什麼可以使用burp僞造證書,正是因爲上面的2點,即:
- 瀏覽器允許用戶自行忽略證書告警,用戶在無足夠的信息安全意識時,可能會直接忽略劉瀏覽器的安全提示;
- 瀏覽器允許“導入證書到瀏覽器信任區“這個操作讓瀏覽器信任burp僞造的證書。這種僞造證書的中間人攻擊給HTTPS帶來了很大的威脅。
SSLPinning
如果能夠這樣做,是不是就可以解決這種“中間人劫持+僞造證書”攻擊的問題:
客戶端在收到服務器的證書後,對該證書進行強校驗,驗證該證書是不是客戶端承認的證書,如果不是,則直接斷開連接。
瀏覽器其實已經這樣做了,但是如“前面”所說,選擇權交給了用戶,且瀏覽器由於其開放性允許讓用戶自導入自己的證書到受信任區域。
但是在APP裏面就不一樣,APP是HTTPS的服務提供方自己開發的客戶端,開發者可以先將自己服務器的證書打包內置到自己的APP中,或者將證書籤名內置到APP中,當客戶端在請求服務器建立連接期間收到服務器證書後,先使用內置的證書信息校驗一下服務器證書是否合法,如果不合法,直接斷開。
當然攻擊者也可以通過把這個APP源碼給逆出來,然後找到證書校驗這段邏輯,給他幹掉,或者乾脆把證書信息換成自己的服務器證書信息,然後重新打包簽名,但是一旦APP做了代碼加密和混淆,這個操作也會變得比較難搞。
因此這樣看來,通過預先把服務器的證書信息“綁定“在APP的native端,然後建立連接時使用預先內置的綁定信息進行服務器證書校驗,同時使用足夠的代碼加密或混淆,是比較合適的解決辦法,這個搞法就是“SSL Pinning”.
【注意】 不要將SSL Pinning和 HTTPS 雙向認證搞混了,HTTPS協議本身是支持雙向認證的,既除了客戶端對服務器證書進行驗證外,服務器也可以要求客戶端提供自己的證書信息並對其進行驗證,在APP上,HTTPS雙向認真的方案也可以防止中間人劫持,但這種雙向認證開銷較大,且安全性與SSL Pinning一致,因此目前大多數APP都採用SSL Pinning這種方案。
突破證書校驗
如何突破APP客戶端的證書校驗?
如果你逆向比較在行,你就自己逆源碼,然後過加密混淆,然後幹掉SSL pinning。不過使用Xposed + JustTruestMe應該也不丟人。
- Xposed是一個框架,它可以改變系統和應用程序的行爲,而不接觸任何APK。它支持很多模塊,每個模塊可以用來幫助實現不同的功能。
- JustTrustMe 是一個用來禁用、繞過 SSL 證書檢查的基於 Xposed 模塊。JustTrustMe 是將 APK中所有用於校驗 SSL 證書的 API 都進行了 Hook,從而繞過證書檢查。
- 關於JustTrustMe繞過證書校驗的源碼分析,可閱讀文章 xposed+justTrustme使用與分析。
【環境準備】
【安裝過程】
1、選擇下載好的Xposed installer的apk包,即可開始安裝,安裝完成後,打開xposed應用,他會提示“xposed框架未安裝”,就如他提示所言,這裏安裝需要重啓:
2、點擊“確定”,開始安裝。
3、點擊“install”,他會自動下載安裝,下載速度根據網速而定。
4、當你看到這個的時候,就是安裝好了,接着就是重啓手機了。
5、接下來就是安裝可以禁止證書驗證的模塊,安好後就可以愉快的進行抓包了,把前面所述的JustTrustMe.apk 下載之後,直接安裝就行了。這個JustTrustme是沒有界面的,但手機會提示xposed模塊沒有激活;
6、打開Xposed中的模塊,就可以找到安裝好的JustTrustme,只需勾選上,然後重啓手機就行 。
7、接下來就可以直接使用Burpsuite正常抓包了,JustTrustMe會將APP中所有進行證書驗證的方法都Hook,繞過所有證書驗證,從而達到可以正常抓包的效果。
【注意】實際上,還需要在Xposed框架中同時安裝上 SSLkiller 模塊(下載地址),才能確保成功突破SSLPinning。
【測試案例】
1、對某行手機APP進行測試,未進行證書校驗且未加密的版本,可直接用BP抓包:
2、使用Xposed框架突破進行了客戶端證書校驗的加密版本的APP的證書校驗,成功抓包: