版權(quán)聲明:本文為知乎博主loco
的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://zhuanlan.zhihu.com/p/56397466
本文只提供學(xué)習(xí)研究使用,若存在侵權(quán),請及時聯(lián)系刪除
文中均為Android環(huán)境下,iOS實現(xiàn)同樣的操作需要越獄,復(fù)雜度比Android高得多,強烈建議使用Android機進行調(diào)試
大家新年好啊,我又回來了,難得有空可以搞事情,就把前面挖的坑給填了吧,這次的中級篇就拿初級篇里Coande同學(xué)和不應(yīng)該呀同學(xué)提到的酷安和小紅書這兩個APP來開刀吧。
初級篇傳送門:當(dāng)你寫爬蟲抓不到APP請求包的時候該怎么辦?【初級篇】
首先說一下中級篇的主要內(nèi)容,中級篇要處理的是APP開啟SSL Pinning后導(dǎo)致出現(xiàn)的初級篇通殺方案失效的問題。
那么什么是SSL Pinning呢?簡單地說一下,SSL Pinning是一種防止中間人攻擊(MITM)的技術(shù),主要的機制是在客戶端發(fā)起請求->收到服務(wù)器發(fā)來的證書這一步之后,對收到的證書進行校驗,如果收到的證書不被客戶端所信任,就直接斷開連接不繼續(xù)請求。
所以在遇到對關(guān)鍵請求開啟了SSL Pinning的APP時,我們抓包就只能看到APP上提示無法連接網(wǎng)絡(luò)或者請求失敗之類的提示;而在抓包工具的界面上,要么就只能是看到一排CONNECT請求,獲取到了證書后卻沒有后續(xù)了,要么就只有一些無關(guān)的請求,找不到自己想要的那個接口。
無法抓到包的效果圖:


這個問題是怎么產(chǎn)生的呢?是這樣,當(dāng)我們使用抓包工具抓包時,抓包工具在攔截了服務(wù)端返回的內(nèi)容并重發(fā)給客戶端的時候使用的證書并不是服務(wù)端原來的證書,而是抓包工具自己的,抓包工具自己的證書并不是APP開發(fā)者設(shè)定的服務(wù)端原本的證書,于是就構(gòu)成了中間人攻擊,觸發(fā)SSL Pinning的機制導(dǎo)致連接被中斷,所以我們無法直接抓到包。
那應(yīng)該怎么辦呢?別急,辦法很多而且也很簡單,先了解一下常見的情況吧,常見的開啟了SSL Pinning的APP大致分為兩種操作:
- 服務(wù)端使用了某個權(quán)威證書頒發(fā)機構(gòu)(CA)頒發(fā)的證書,并在APP中校驗證書的CA是否是正常的。
- 服務(wù)端使用了CA頒發(fā)的證書或是自己給自己頒發(fā)的證書,并在APP中校驗證書本身是不是正常的,需要將證書與APP本體一同下發(fā)。有把證書混淆在代碼里藏起來的,也有直接放在資源目錄下的。
不過呢,這兩種操作都是能被通殺的,下面我將告訴你如何處理。本篇同樣提供多種通殺方案,請讀者自行根據(jù)自己所持設(shè)備的情況使用。
1、直接使用低版本系統(tǒng)的Android手機(低于7.0)
android 7.0 + 使用系統(tǒng)原生鎖定方案,而7.0 Nougat之前則TrustKit自己邏輯實現(xiàn)鎖定.
瘦蛟舞大佬在這篇文章中有提到,Android7.0以后是有系統(tǒng)原生的方案提供的,有些APP抓不到包的時候其實是因為版本比較高,用上了原生的方案。所以只要使用低于Android7.0版本系統(tǒng)的手機,就可以輕松繞過大部分APP的SSL Pinning,但這個方法畢竟不能徹底通殺,有些APP(也有可能是使用的請求庫)有自己實現(xiàn)的SSL Pinning方案,所以對低版本系統(tǒng)也會有效,建議配合第二個方案使用。
如圖所示,在Android 8下,抓包時無法抓到任何的有用的請求。



但在Android5.1.1下,卻沒有任何問題。



2、使用Xposed或兼容Xposed的框架+JustTrustMe
這個方案使用的是JustTrustMe這個Xposed模塊,它所做的事情就是將各種已知的的HTTP請求庫中用于校驗證書的API都進行Hook,使無論是否是可信證書的情況,校驗結(jié)果返回都為正常狀態(tài),從而實現(xiàn)繞過證書檢查的效果。
具體操作的時候唯一麻煩的就是安裝Xposed框架,但因為現(xiàn)在維術(shù)大佬的太極APP(關(guān)注他的公眾號《虛擬框架》下載)支持使用Magisk掛載啟動,實現(xiàn)了幾乎與Xposed框架同樣的使用方式和效果,并兼容了很多Xposed的模塊,所以如果覺得Xposed框架安裝太過麻煩或是擔(dān)心磚機的同學(xué)可以嘗試使用太極-Magisk,直接解了BL鎖之后刷入Magisk并在Magisk-Manager中添加太極模塊就可以使用了,安裝和使用教程后續(xù)會再寫一篇專門的說明鏈接過來,等不及的同學(xué)也可以直接看太極的文檔進行操作。
效果呢就是開啟JustTrustMe之后與低版本下抓包一致,關(guān)閉后打回原形,這里就不貼圖了。
注意:這個模塊在過高的系統(tǒng)版本(8-9)下偶爾會出現(xiàn)導(dǎo)致所有HTTP請求都失敗的BUG,如果不是使用專門的測試機安裝這個模塊的話,建議日常使用時將其關(guān)閉,以免遇到奇怪的問題。
注意:本人并未在日常用機上長時間使用太極-Magisk+JustTrustMe,不清楚是否存在其他BUG,如出現(xiàn)問題請聯(lián)系維術(shù)或JustTrustMe作者。
3、將抓包工具的證書安裝到系統(tǒng)根證書目錄中
這個方案的來源是這個貼子中letitbesqzr所提到的第二種方案,個人認(rèn)為較為麻煩,不推薦使用,畢竟有權(quán)限往system分區(qū)寫文件的時候完全可以用JustTrustMe了。
操作方法如下:
系統(tǒng)證書的目錄是:/system/etc/security/cacerts/ 每個證書的命名規(guī)則為:. Certificate_Hash 表示證書文件的 hash 值,Number 是為了防止證書文件的 hash 值一致而增加的后綴; 證書的 hash 值可以由命令計算出來,在終端輸入 openssl x509 -subject_hash_old -in ,其中 Certificate_File 為證書路徑,將證書重命名為 hash.0 放入系統(tǒng)證書目錄,之后你就可以正常抓包了。
4、VirtualXposed(VirtualApp)
這個方案的來源是這個貼子中letitbesqzr所提到的第三種方案。原理不明,疑似VirtualApp在轉(zhuǎn)發(fā)其內(nèi)部APP的操作時沒有進行校驗證書的操作?希望有研究過的大佬解釋一下具體原理。
使用這個方案時直接安裝VirtualXposed即可,代理的設(shè)置還是在原來的地方操作,只需要將需要抓包的APP添加至VirtualXposed中,再打開它內(nèi)部的那一個對應(yīng)的APP就可以抓到包了。但并未詳細測試這個方案對各種HTTP請求庫的兼容性,所以不清楚用了其他HTTP請求庫的APP是否也會是同樣的效果。
效果如下:


好了,學(xué)會了這四招之后,初級篇里的90%占比就被提升至99%了,剩下的那一小撮不被初、中級篇的方案破掉的APP將在高級篇中講解,但應(yīng)該是沒有能做到通殺的方案了,畢竟每家的處理方式都不同。
歡迎提供高級篇的素材,在評論或私信里告知我都可以。
如果這篇文章有幫到你,請大力點贊,謝謝~~ 歡迎關(guān)注我的知乎賬號loco_z,我會時不時地發(fā)一些爬蟲相關(guān)的干貨和黑科技,說不定能讓你有所啟發(fā)。