以下抓包測(cè)試請(qǐng)確保手機(jī)和電腦是處于同一個(gè)局域網(wǎng)下
?
1、使用 Burpsuite 對(duì) APP 進(jìn)行抓包
環(huán)境:
Burpsuite Professional v2021.2
Pixel3 Android11 、已 root + Xposed
在 Burpsuite 里面 Proxy — Options — Proxy Listeners — Add然后在Speciffic address選擇172網(wǎng)段的那個(gè) IP 地址(即本機(jī)局域網(wǎng) IP 地址)
在手機(jī)里面網(wǎng)絡(luò)設(shè)置也要設(shè)置 手動(dòng)代理模式 ,輸入的 IP和端口 都要與 Burpsuite 一樣
然后在手機(jī)瀏覽器訪問(wèn) https://burp 這個(gè)地址,去進(jìn)行下載并安裝 burp 證書(shū),因?yàn)樽ト?HTTPS 流量是需要證書(shū)的,點(diǎn)擊 CA Certificate 即可進(jìn)行下載
下載之后要對(duì)證書(shū)文件后綴名進(jìn)行更改,因?yàn)槭謾C(jī)是無(wú)法打開(kāi) .der 后綴的文件,所以要吧 .der 改為 .cer ,然后再進(jìn)行安裝證書(shū)
那么安裝之后就可以進(jìn)行抓取 APP 數(shù)據(jù)包了
2、使用 Fiddler 對(duì) APP 進(jìn)行抓包
環(huán)境:
Fiddler v5.0.20204.45441
Pixel3 Android11 、已 root + Xposed
1、在 Fiddler 里面 Tools — Options
2、在 options 彈框中切換至 HTTPS ,勾選圖中標(biāo)記的 2 個(gè)選項(xiàng)并點(diǎn)擊 OK
3、勾選后會(huì)彈出安裝證書(shū)的提示,根據(jù)提示一直點(diǎn)擊 是 即可安裝成功4、接著在Tools — Options — Connections,端口寫(xiě) 9999(可隨意更改),并勾選 Allow remote computers to connect ,點(diǎn)擊 OK
5、重啟 Fiddler ( 修改fiddler配置要重啟后才能生效 )6、修改手機(jī)網(wǎng)絡(luò)設(shè)置
7、在瀏覽器訪問(wèn)上面設(shè)置的 IP 地址和端口號(hào),我這里是 172.20.10.5:9999(這里要根據(jù)實(shí)際情況),然后 FiddlerRoot certificate 進(jìn)行下載證書(shū),并自行安裝
那么安裝之后就可以進(jìn)行抓取 APP 數(shù)據(jù)包了
3、使用 Burpsuite + Fiddler 進(jìn)行對(duì) APP 進(jìn)行抓包
配置 Burpsuite 使用的代理監(jiān)聽(tīng)是 127.0.0.1:8080
在 Fiddler 里面 Tools — Options — Gateway 配置的代理監(jiān)聽(tīng)是 127.0.0.1:8080(這里的配置與 Burpsuite 代理一致)
接著在 Tools — Options — Connections ,端口寫(xiě) 9999(可隨意更改),并勾選 Allow remote computers to connect ,點(diǎn)擊 OK
修改手機(jī)網(wǎng)絡(luò)設(shè)置
也就是說(shuō)從手機(jī)的流量經(jīng)過(guò) Fiddler 進(jìn)行轉(zhuǎn)發(fā)到Burpsuite
4、使用小黃鳥(niǎo) HttpCanary 對(duì) APP 進(jìn)行抓包
環(huán)境:
HttpCanary v3.3.6
Pixel3 Android11 、已 root + Xposed首先安裝 HttpCanary APP 應(yīng)用
?
?
HttpCanary 支持 HTTP/HTTPS/HTTP2 網(wǎng)絡(luò)數(shù)據(jù)包的抓取和分析,其實(shí)和 Charles 類(lèi)似,要抓取 HTTPS 需要使用 MITM 中間技術(shù)對(duì) TLS/SSL 數(shù)據(jù)包進(jìn)行解密以及明文輸出,因此需要安裝自簽的 CA 證書(shū)
?
這里要提一下 Android 系統(tǒng)默認(rèn)對(duì)證書(shū)信任證書(shū)的問(wèn)題
因?yàn)槲业?Pixel3 手機(jī)是已經(jīng) root 了,而且是 Android11 系統(tǒng),在安卓 7.0 之前系統(tǒng),直接下載證書(shū)裝入即可,安卓 7.0 及以上系統(tǒng)對(duì)于證書(shū)的安全策略做了修改,意味著,從 sdcard 安裝用戶級(jí) CA 將無(wú)法攔截應(yīng)用流量。我們需要將證書(shū)命名為計(jì)算出的哈希值后綴 .0 或者直接在手機(jī)里面的 用戶憑據(jù) 可以看到后綴 .0的證書(shū)文件 名字,然后導(dǎo)入到根證書(shū)目錄:/system/etc/security/cacerts 讓系統(tǒng)默認(rèn)可信任。因此安裝證書(shū)的方式也有所不同,默認(rèn)它是安裝在用戶那里的。
首先按照我下面的圖順序進(jìn)行安裝證書(shū)
?
?
?
先導(dǎo)出 HttpCanary根 證書(shū)文件 .pem
?
點(diǎn)擊它,即可完成安裝證書(shū)
?
那么這里就看到它是安裝在用戶那里的,但是由于我的設(shè)備是已經(jīng) root 了,要把這個(gè)證書(shū)安裝在 系統(tǒng) 那里才能進(jìn)行抓取 HTTPS 流量
那么這時(shí)就需要把證書(shū)的文件移動(dòng)到系統(tǒng)目錄下就可以了,這里選擇導(dǎo)出 System Trusted(.0)
?
那么就把證書(shū)進(jìn)行移動(dòng)到系統(tǒng)證書(shū)目錄 /etc/security/cacerts/
?
在 Android 10 以及以上安裝證書(shū)到 /system/etc/security/cacerts/會(huì)出現(xiàn) system 無(wú)法寫(xiě)入使用 mount 報(bào)錯(cuò)如下:
?
?
'/system' not in /proc/mounts '/dev/block/dm-4' is read-only
?
?
由于 Android 10 采用了某些安全策略,將系統(tǒng)分區(qū) /system掛載為只讀,就算你 root 了也沒(méi)用,無(wú)法寫(xiě)入系統(tǒng)分區(qū)也就無(wú)法導(dǎo)入系統(tǒng)證書(shū),在使用 HTTPCanary 這樣的軟件抓包分析的時(shí)候,很多 app 只認(rèn)系統(tǒng)證書(shū),不認(rèn)用戶證書(shū)遇見(jiàn)此類(lèi)情況有兩種方式解決:1、在 Magisk 里面安裝 `Move Certificates模塊`[1],該插件可以一鍵將所有用戶證書(shū)自動(dòng)轉(zhuǎn)換為系統(tǒng)區(qū)證書(shū)
使用方法:所有證書(shū)安裝為用戶證書(shū)后,安裝此插件,并重啟。
?
2、創(chuàng)建一個(gè)新的掛載點(diǎn)來(lái)覆蓋 這種方式是內(nèi)存覆蓋的方式所以手機(jī)重啟后失效。(想要持久化需考慮搞一個(gè)開(kāi)機(jī)啟動(dòng)服務(wù))
?
?
#?創(chuàng)建一個(gè)臨時(shí)目錄,保存當(dāng)前證書(shū) mkdir?/sdcard/tmp/ #?復(fù)制現(xiàn)有證書(shū)到臨時(shí)目錄 cp?/system/etc/security/cacerts/*?/sdcard/tmp/ #?創(chuàng)建內(nèi)存掛載 mount?-t?tmpfs?tmpfs?/system/etc/security/cacerts #?將現(xiàn)有證書(shū)復(fù)制回?tmpfs?掛載 mv?/sdcard/tmp/*?/system/etc/security/cacerts/ #?更新?perms?和?selinux chown?root:root?/system/etc/security/cacerts/* chmod?644?/system/etc/security/cacerts/* chcon?usystem_file:s0?/system/etc/security/cacerts/*
?
?
再進(jìn)來(lái)這個(gè)看證書(shū)的界面就已經(jīng)看到已經(jīng)把 用戶 的證書(shū)安裝在 系統(tǒng) 那里了
?
雖然 HttpCanary 是一個(gè)很不錯(cuò)的抓包工具,但是它并不能跟其他抓包工具進(jìn)行一個(gè)聯(lián)動(dòng)轉(zhuǎn)發(fā)抓包,所以當(dāng)滲透測(cè)試人員在使用它進(jìn)行抓包之后,可以直接在手機(jī)上進(jìn)行修改數(shù)據(jù)包進(jìn)行測(cè)試,但是可能在手機(jī)上工作效率沒(méi)那么高,于是就把要測(cè)試的數(shù)據(jù)包復(fù)制出來(lái)到 Burpsuite 上進(jìn)行修改并發(fā)包,這個(gè)過(guò)程也會(huì)浪費(fèi)很多時(shí)間。
下面是 HttpCanary 的工作原理
HttpCanary 采用 VPN 的方式將網(wǎng)絡(luò)包轉(zhuǎn)發(fā)給本地代理服務(wù)器,本地代理服務(wù)器將數(shù)據(jù)包轉(zhuǎn)發(fā)虛擬網(wǎng)關(guān),由虛擬網(wǎng)關(guān)進(jìn)行不同策略地?cái)r截和協(xié)議解析,最后再將數(shù)據(jù)發(fā)送給終端
最重要的一層就是虛擬網(wǎng)關(guān) Virtual Gateway ,需要對(duì)協(xié)議進(jìn)行鑒定解析等等,包括數(shù)據(jù)包的攔截注入都是在這一層處理的,比如 HTTPS 的中間人(MITM)解析出明文包等
因此從上圖觀察它的工作原理進(jìn)行分析之后,讓我尋找到另一種方式抓包(它的工作方式也和 HttpCanary 有點(diǎn)相似 )可以用它來(lái)代替 HttpCanary —— Postern + Charles + Burpsuite組合,至于怎樣操作,可以在文章下面 7、使用Postern + Charles + Burpsuite進(jìn)行對(duì)APP進(jìn)行抓包 進(jìn)行詳細(xì)閱讀
5、使用 Charles 對(duì) APP 進(jìn)行抓包
環(huán)境:
Charles v4.6.2
Pixel3 Android11 、已 root + Xposedcharles 是一款非常優(yōu)秀的抓包工具,全平臺(tái)支持,在 mac,windows,linux 上都可以使用,既可以抓取 web 端的包,也可以抓 app 端的包c(diǎn)harles 主要的功能包括如下幾點(diǎn):
截取 Http 和 Https 網(wǎng)絡(luò)封包。
支持重發(fā)網(wǎng)絡(luò)請(qǐng)求,方便后端調(diào)試。
支持修改網(wǎng)絡(luò)請(qǐng)求參數(shù)。
支持網(wǎng)絡(luò)請(qǐng)求的截獲并動(dòng)態(tài)修改。
支持模擬慢速網(wǎng)絡(luò)。
代理服務(wù)器的工作原理如下所示:
客戶端發(fā)起請(qǐng)求,請(qǐng)求通過(guò) charles 轉(zhuǎn)發(fā)給服務(wù)器,服務(wù)器返回響應(yīng),響應(yīng)通過(guò) charles 轉(zhuǎn)發(fā)給客戶端。
charles 所起的作用就相當(dāng)于信使,把信息從 A 傳遞給 B,并且把回信從 B 傳遞給 A,正因?yàn)樗@個(gè)信使的工作,所以他對(duì)信息的內(nèi)容了如指掌(不管是原信還是回信),正因?yàn)槿绱?,charles 也就可以篡改信息的內(nèi)容,即篡改請(qǐng)求和響應(yīng)。
Charles 下載地址:
https://www.charlesproxy.com/download/
然后自行安裝之后,要對(duì)它進(jìn)行激活
注冊(cè)碼生成地址:
https://www.zzzmode.com/mytools/charles/
激活 Charles在 Help->Registered 輸入 key 和生成的激活碼即可
?
設(shè)置代理,在 Proxy — Proxy Settings ( 注意:此時(shí)我的Windows Proxy是去掉對(duì)勾的,因?yàn)檫@里我是想在PC端抓手機(jī)端的包,所以沒(méi)必要打開(kāi)電腦的本地代理 )
填入代理端口 8888(或者自定義,但不能和系統(tǒng)已占用端口沖突),并且勾上 Support HTTP/2 和 Enable transparent HTTP proxying ,點(diǎn)擊右下角 OK 即可
然后分別在 PC 端和手機(jī)端安裝證書(shū)選擇 Help — SSL Proxying — Install Charles Root Certificate 就可以下載安裝上 PC 端了
?
證書(shū)存儲(chǔ)選擇 受信任的根證書(shū)頒發(fā)機(jī)構(gòu)
接下來(lái)再給手機(jī)端安裝證書(shū),步驟如下:選擇 Help — SSL Proxying — Install Charles Root Certificate on a Mobile Device or Remote Browser
點(diǎn)擊后會(huì)彈出窗口提示設(shè)置的方法,按照提示在手機(jī)端將代理設(shè)置為電腦的 ip:8888( 我這里是192.168.1.251:8888 ),這里要先確保手機(jī)和電腦連接同一個(gè)無(wú)線網(wǎng)絡(luò) 。然后在手機(jī)的瀏覽器打開(kāi) http://chls.pro/ssl ,按提示下載證書(shū)即可。
?
如果 Charles 有彈出提示,一定要點(diǎn)擊 Allow
首先按照我下面的圖順序進(jìn)行安裝證書(shū)
?
?
?
?
找到選擇剛剛下載的證書(shū)文件,點(diǎn)擊即可完成安裝
它也是安裝在 用戶 那里,但是由于我的設(shè)備是已經(jīng) root 了,要把這個(gè)證書(shū)安裝在 系統(tǒng) 那里才能進(jìn)行抓取 HTTPS 流量
但是移動(dòng)證書(shū)的前提要知道證書(shū)安裝之后的證書(shū)文件是被命名為什么,于是可以在 用戶憑據(jù) 這里可以看到
文件為 b905ae73.0 ,它目前是在用戶目錄下 /data/misc/user/0/cacerts-added/
?
然后把它復(fù)制到 /etc/security/cacerts/ 系統(tǒng)目錄下
?
?
HTTPS 解析
然后在 Proxy — SSL Proxying Settings 進(jìn)行 SSL Proxying Settings 設(shè)置勾選 enable SSL Proxying 復(fù)選框代表開(kāi)啟 SSL Proxying 代理,并在 include 欄中添加域名和端口號(hào)。include 中的列表項(xiàng)代表 Charles 能夠展示這些域名的 SSL 請(qǐng)求和響應(yīng)的明文。
并且說(shuō)明中也提示了我們 Charles 要想使用 SSL Proxying 代理,需要進(jìn)行 SSL Certificates,即證書(shū)簽名。這個(gè)我們?cè)谏厦嬉呀?jīng)完成了。
Stop SSL Proxying 按鈕可以控制 SSL 代理的開(kāi)關(guān)。(必須要開(kāi)啟SSL Proxying)
到此,PC 端的設(shè)置都已經(jīng)配置好了,然后就能進(jìn)行抓包了
6、使用 Charles + Burpsuite 進(jìn)行對(duì) APP 進(jìn)行抓包
選擇勾選 Proxy — External Proxy Settings 就是要將 Charles 作為手機(jī)端的代理,再由 Charles 將包轉(zhuǎn)發(fā)給 burpsuite,所以對(duì)于 Charles 來(lái)說(shuō),burpsuite 就成了一個(gè) External Proxy Server —— 外部代理服務(wù)器
勾選 HTTP 和 HTTPS 代理,這里 HTTP 和 HTTPS 的代理服務(wù)器地址都是 127.0.0.1:8080(這里的配置與 Burpsuite 代理一致)
已經(jīng)設(shè)置了外部代理了,就必須打開(kāi) burp(當(dāng)然了主要是要打開(kāi) burp 中對(duì) 127.0.0.1:8080 的監(jiān)聽(tīng)),否則就會(huì)出現(xiàn) 連不上網(wǎng)了 的現(xiàn)象。在 burp 的菜單欄中的 Proxy 選項(xiàng)下的 Options 中打開(kāi) 127.0.0.1:8080 的代理監(jiān)聽(tīng)(默認(rèn)應(yīng)該是已經(jīng)打開(kāi)的),在 Intercept 中關(guān)閉請(qǐng)求攔截。
完成上面的配置步驟后,從手機(jī)上打開(kāi)瀏覽器搜索內(nèi)容,應(yīng)該已經(jīng)可以在 Charles 窗口左側(cè)的列表中找到想抓的包,并且也可以看到數(shù)據(jù)包從 Charles 轉(zhuǎn)發(fā)到 Burpsuite 了
7、使用 Postern + Charles + Burpsuite 進(jìn)行對(duì) APP 進(jìn)行抓包
在實(shí)際抓手機(jī) App 包場(chǎng)景中,有很多種方案,經(jīng)典的就是 Fiddler 、 Burpsuite ,但是 Fiddler 、 Burpsuite 會(huì)遇到一個(gè)問(wèn)題,如果 App 為了防止中間人抓包,特意設(shè)置了不走代理這個(gè)選項(xiàng),那單獨(dú)直接用 Fiddler 、 Burpsuite 這些抓包工具就不能抓包的,那總不可能說(shuō)不能抓包就認(rèn)為目標(biāo)系統(tǒng)很安全吧?為了抓到完整的包,于是就衍生出 Postern + Charles 這個(gè)組合,是因?yàn)?Charles 沒(méi)有直接監(jiān)聽(tīng)到 App,Charles 是監(jiān)聽(tīng)到了 Postern 上,Postern 就是一個(gè)VPN ,所以 App 設(shè)置不走代理也沒(méi)用,它是通過(guò) VPN 將所有流量轉(zhuǎn)發(fā)到 Charles 的 socks 代理,再打開(kāi) Charles 的 External Proxy Server — (外部代理服務(wù)器)轉(zhuǎn)發(fā)到 Burpsuite,從而實(shí)施中間人抓包
環(huán)境:
Postern 3.1.3
Charles v4.6.2
Burpsuite Professional v2021.2
Pixel3 Android11 、已 root + Xposed
先配置 Charles
在 Proxy — Proxy Settings ,勾選 Enable SOCKS proxy 進(jìn)行設(shè)置 SOCKS 代理(按照下圖的操作),端口號(hào)我這里設(shè)置 16666(或者自定義,但不能和系統(tǒng)已占用端口沖突)
配置代理
添加代理服務(wù)器
?
點(diǎn)擊保存
配置規(guī)則
添加規(guī)則
按照下圖進(jìn)行操作并點(diǎn)擊保存
?
打開(kāi)/關(guān)閉 Postern
那么只要上面的 使用Charles + Burpsuite進(jìn)行對(duì)APP進(jìn)行抓包 設(shè)置好之后,打開(kāi)你想要抓的目標(biāo) APP 就可以看到數(shù)據(jù)包已經(jīng)轉(zhuǎn)發(fā)到 Burpsuite 了
但是如果遇到某些比較敏感的 APP,檢測(cè) root 的話,可以參考下面的兩篇文章進(jìn)行設(shè)置
隱藏 Root - Zygisk 版面具 Magisk 過(guò)銀行 App 等 Root 檢測(cè),Shamiko 模塊的妙用[2]
magisk 安裝與配置[3]
Charles 和 Fiddler 的比較
Fiddler 雖然也可以完成對(duì)手機(jī)的抓包,但是如果 App 設(shè)置了不走代理,那 Fiddler 就失敗了,并且 Fiddler 每次都需要手動(dòng)修改網(wǎng)絡(luò)設(shè)置的代理,但是 Charles 與 Postern 聯(lián)動(dòng)配合就不需要手動(dòng)修改網(wǎng)絡(luò)設(shè)置,只需要配置好 Postern 和 Charles 的連接就可以了,并且可以對(duì)絕大部分的 App 進(jìn)行抓包,不使用代理時(shí),直接關(guān)閉 Postern 即可
目前來(lái)說(shuō),F(xiàn)iddler 和 Charles 都是很流行的,但是相對(duì)來(lái)說(shuō),還是 Postern + Charles 適用范圍更廣一些。
8、使用 Frida + Xposed + Objection + Burpsuite 進(jìn)行對(duì) APP 進(jìn)行抓包
SSL 證書(shū)綁定
什么是證書(shū)綁定呢?其實(shí)網(wǎng)上叫法蠻多的,SSL 證書(shū)綁定、英文名字:SSL Pinning 或者證書(shū)檢驗(yàn)??傊疅o(wú)論怎么叫都是檢驗(yàn)證書(shū)是否可信任。我們知道從 HTTP 到 HTTPS 數(shù)據(jù)在傳輸過(guò)程中添加了一層 SSL/TLS,讓我們數(shù)據(jù)流量處于加密狀態(tài),不再是明文可見(jiàn)。這時(shí)候便有了 CA 證書(shū)。
我們?cè)谧ト?HTTPS 數(shù)據(jù)包得時(shí)候,做的就是利用假的 CA 證書(shū),來(lái)實(shí)現(xiàn)中間人劫持?jǐn)?shù)據(jù)。一旦 app 校驗(yàn)了證書(shū)的指紋信息。我們的證書(shū)不再受信任了。自然而然就無(wú)法建立連接,所以必須想辦法讓 app 信任,才能繼續(xù)抓包。當(dāng)然這個(gè)分為兩種情況:
(1)單項(xiàng)校驗(yàn)-客戶端校驗(yàn)服務(wù)端的證書(shū)。
(2)雙向認(rèn)證-客戶端不僅僅要校驗(yàn)服務(wù)端的證書(shū),也會(huì)在 app 內(nèi)放一張證書(shū);服務(wù)端也會(huì)檢驗(yàn)客戶端里的證書(shū)。
單向校驗(yàn)
Android 系統(tǒng)中已經(jīng)提供了檢驗(yàn)證書(shū)的 api,我們只需要實(shí)現(xiàn) checkClientTrusted 、 checkServerTrusted 、 verify 等方法即可。
這類(lèi)的對(duì)抗需要我們將這些函數(shù)的校驗(yàn)進(jìn)行置空,默認(rèn)信任所有證書(shū)即可。
使用 Xposed + JustTruestMe 來(lái)突破 SSL Pinning
Xposed 是一個(gè)框架,它可以改變系統(tǒng)和應(yīng)用程序的行為,而不接觸任何 APK。它支持很多模塊,每個(gè)模塊可以用來(lái)幫助實(shí)現(xiàn)不同的功能。JustTrustMe 是一個(gè)用來(lái)禁用、繞過(guò) SSL 證書(shū)檢查的基于 Xposed 模塊。JustTrustMe 是將 APK 中所有用于校驗(yàn) SSL 證書(shū)的 API 都進(jìn)行了 Hook,從而繞過(guò)證書(shū)檢查。
環(huán)境:
Pixel3 Android11 、已 root + Xposed
SSLUnpinning 2.0 插件
JustMePlush 插件
Frida-server-15.1.27-android-arm64
PC 端的 Frida v15.1.27
Objection v1.11.0
首先下載 Xposed 框架插件 SSLUnpinning + JustTrustMe , SSLUnpinning 插件可以直接在 Xposed 商店下載,而 JustTrustMe[4] 插件需要到下面的 GitHub 鏈接自行下載
我這里就使用 SSLUnpinning 2.0 插件和 JustMePlush 插件,效果都是一樣的,插件安裝完之后,記得啟動(dòng)插件,然后 重啟手機(jī) 后插件才能生效
然后使用 Objection 進(jìn)行繞過(guò)
Objection 是一款基于 frida 的 hook 框架,由于 frida 需要我們自己編寫(xiě)腳本,使用比較麻煩,objection 內(nèi)置了在安卓和 IOS 逆向中常用的一些 hook 腳本,我們通過(guò)簡(jiǎn)單的命令行就可以進(jìn)行 hook 動(dòng)態(tài)篡改,非常方便
因?yàn)?Objection 是基于 Frida 的所以必須先安裝 Frida 然后才能安裝 Objection
pip3 install objection
按照上面的操作進(jìn)行部署 Frida 環(huán)境之后,就啟動(dòng) Frida服務(wù)端程序
接著用 Objection 注入到目標(biāo) APP 應(yīng)用程序上
objection -g 包名 explore
如果不知道 APP 包名,可以用以下命令進(jìn)行查看,但是依然前提要啟動(dòng)了 Frida服務(wù)端程序
frida-ps -Ua
然后輸入關(guān)閉 APP 的 SSL 校驗(yàn)命令
android sslpinning disable
并在手機(jī)里面網(wǎng)絡(luò)設(shè)置也要設(shè)置手動(dòng)代理模式,輸入的 IP 和端口都要與 Burpsuite 一樣
?
即可完成繞過(guò) SSL Pinning 進(jìn)行抓包
如果出現(xiàn)還是依然無(wú)法繞過(guò) SSL Pinning 的情況,可以參考下面兩篇文章
Android 抓包總結(jié)[5]
[Frida.Android.Practice (ssl unpinning)](https://github.com/WooyunDota/DroidDrops/blob/master/2018/Frida.Android.Practice.md "Frida.Android.Practice (ssl unpinning "Frida.Android.Practice (ssl unpinning)")")
雙向校驗(yàn)
APP 除了校驗(yàn)服務(wù)端的證書(shū),服務(wù)端還會(huì)檢驗(yàn) APP 的證書(shū)。HTTPS 雙向證書(shū)校驗(yàn)在實(shí)際中幾乎很少用到,因?yàn)榉?wù)器端需要維護(hù)所有客戶端的證書(shū),這無(wú)疑增加了很多消耗,因此大部分廠商選擇使用單向證書(shū)綁定。對(duì)抗雙向認(rèn)證需要完成兩個(gè)環(huán)節(jié):
(1)讓客戶端認(rèn)為 burp 是服務(wù)端 ,這一步其實(shí)就是破解 SSL pinning,方法和上述過(guò)程完全相同。
(2)讓服務(wù)端認(rèn)為 burp 是客戶端 ,這一步需要導(dǎo)入客戶端的證書(shū)到 burp,客戶端的證書(shū)一定會(huì)存在本地代碼中,而且還可能會(huì)有密碼,這種情況下需要逆向客戶端 app,找到證書(shū)和密碼,并轉(zhuǎn)為 pkcs12 格式導(dǎo)入到 burp。User options -> SSL -> Client SSL Certificate。
?
?
雙向校驗(yàn)的app 案例: https://www.wandoujia.com/apps/8280413
?
?
通常情況下應(yīng)用會(huì)將證書(shū)放置在資源目錄 app/asset下,后綴名為 p12 、 pfx的文件。當(dāng)然也可能會(huì)偽裝成其他文件,例如圖片文件等。
怎么找到證書(shū)密碼呢?一般要么逆向分析找到密碼,要么通過(guò) hook api java.security.KeyStore 使密碼自吐。
(1)Jadx 中搜索證書(shū)的名字、或者證書(shū)鏈 x509certificate 分析定位到關(guān)鍵位置。
(2)服務(wù)器對(duì)客戶端進(jìn)行校驗(yàn)過(guò)程中,客戶端將證書(shū)公鑰發(fā)送給服務(wù)器,以及從服務(wù)器獲取 session 和私鑰解密過(guò)程中,需要 API 進(jìn)行操作,API 存在于 java 層框架內(nèi),所以 hook 框架層代碼 java.security.KeyStore,使密碼自吐。這里下圖的案例 APK 解壓之后在 assets 目錄下有一個(gè) client.p12 的證書(shū)文件,但是不知道它的密碼,因此要使用 Frida 對(duì)目標(biāo) APP 進(jìn)行 hook,讓它密碼自吐。
注意:.p12后綴的證書(shū)文件是由 .crt證書(shū)和 key 文件合并成.p12證書(shū)文件,并且在合并生成 .p12 文件的時(shí)候必須對(duì)證書(shū)進(jìn)行加密(也就是加個(gè)證書(shū)密碼),不加密碼 Burpsuite 是無(wú)法導(dǎo)入的
?
function?hook_KeyStore_load()?{ ????Java.perform(function?()?{ ????????var?StringClass?=?Java.use("java.lang.String"); ????????var?KeyStore?=?Java.use("java.security.KeyStore"); ????????KeyStore.load.overload('java.security.KeyStore$LoadStoreParameter').implementation?=?function?(arg0)?{ ????????????console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new())); ????????????console.log("KeyStore.load1:",?arg0); ????????????this.load(arg0); ????????}; ????????KeyStore.load.overload('java.io.InputStream',?'[C').implementation?=?function?(arg0,?arg1)?{ ????????????console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new())); ????????????console.log("KeyStore.load2:",?arg0,?arg1???StringClass.$new(arg1)?:?null); ????????????this.load(arg0,?arg1); ????????}; ????????console.log("hook_KeyStore_load..."); ????}); } setImmediate(hook_KeyStore_load)
?
?
腳本可以在大佬博客這里復(fù)制,并命名為 ssl.js(可自定義) 抓包之服務(wù)器校驗(yàn)客戶端證書(shū)[6]
執(zhí)行下面的命令
frida -U -f APP 包名 -l ssl.js --no-pause
可以發(fā)現(xiàn)我們通過(guò) hook 框架層代碼得到了 client.p12證書(shū)密碼為 111111,然后在 Burpsuite 里面選擇 User options — TLS — Client TLS Certificates — Add 進(jìn)行導(dǎo)入證書(shū),Destination host寫(xiě)*進(jìn)行匹配所有地址,證書(shū)類(lèi)型選擇File(PKCS#12),然后選擇Next
加載 assets 目錄下的 client.p12 證書(shū)文件,和輸入上面 hook 出的密碼 111111
?
導(dǎo)入證書(shū)之后,就可以正常的抓包了,可以看下面的圖,下面的 403 是沒(méi)導(dǎo)入證書(shū)的時(shí)候,它就不允許你抓包訪問(wèn),上面的 200 是我導(dǎo)入證書(shū)之后,就可以正常抓包了
還有就是在某些特殊場(chǎng)景 web頁(yè)面 或者 APP 需要在 PC 電腦端安裝證書(shū)才能進(jìn)行訪問(wèn)抓包的,那么就要根據(jù)實(shí)際情況去操作
9、使用 Frida 寫(xiě) Hook 代碼來(lái)進(jìn)行對(duì) APP 模擬抓包
環(huán)境:
夜神模擬器 32 位 Android7.1.2 已 root
Frida-server-15.1.27-android-x86
PC 端的 Frida v15.1.27
Objection v1.11.0
使用 Charles 抓不到包怎么辦呢,我們有 Frida,可以通過(guò) frida 來(lái) hook 住 APP 構(gòu)造網(wǎng)絡(luò)請(qǐng)求和接收數(shù)據(jù)地方的代碼,然后打印出來(lái)請(qǐng)求和返回?cái)?shù)據(jù),這樣 APP 向服務(wù)器進(jìn)行的網(wǎng)絡(luò)請(qǐng)求和接收的數(shù)據(jù)便一覽無(wú)余了。
一般網(wǎng)絡(luò)請(qǐng)求和接收數(shù)據(jù)的代碼都會(huì)寫(xiě)在一個(gè)類(lèi)中,我們只要找到一個(gè)點(diǎn)來(lái)追蹤去找到這個(gè)類(lèi)就可以了。
在大佬的 Github 項(xiàng)目里面找到一個(gè)Frida 實(shí)現(xiàn)攔截 okhttp 的腳本[7]
它的工作原理就是:
由于所有使用的 okhttp 框架的 App 發(fā)出的請(qǐng)求都是通過(guò)RealCall.java發(fā)出的,那么我們可以 hook 此類(lèi)拿到 Request 和 Response, 也可以緩存下來(lái)每一個(gè)請(qǐng)求的 call 對(duì)象,進(jìn)行再次請(qǐng)求,所以選擇了此處進(jìn)行 hook。find 前新增 check,根據(jù)特征類(lèi)尋找是否使用了 okhttp3 庫(kù),如果沒(méi)有特征類(lèi),則說(shuō)明沒(méi)有使用 okhttp; 找到特征類(lèi),說(shuō)明使用了 okhttp 的庫(kù),并打印出是否被混淆。 這里我使用了真機(jī)進(jìn)行測(cè)試,遇到下面的報(bào)錯(cuò),應(yīng)該是有檢測(cè)到我真機(jī)的一些環(huán)境原因吧,因此我就使用了夜神模擬器進(jìn)行下面的操作
首先將 okhttpfind.dex 拷貝到 /data/local/tmp/ 目錄下,并賦予權(quán)限
adb push okhttpfind.dex /data/local/tmp/
chmod 777 okhttpfind.dex
然后啟動(dòng)Frida服務(wù)端程序
接著執(zhí)行命令啟動(dòng) hook 腳本
frida -U -l okhttp_poker.js -f APP 包名 --no-pause
如果有需要可追加參數(shù) -o [output filepath] 保存到文件
okHttp 的 app 案例[8]
?
然后復(fù)制被混淆后的類(lèi)名(上圖紅色框圈住的內(nèi)容),粘貼到 okhttp_poker.js 文件中(如下圖),并進(jìn)行保存,F(xiàn)rida 會(huì)自動(dòng)實(shí)時(shí)識(shí)別更新后的腳本內(nèi)容執(zhí)行相關(guān)操作
然后運(yùn)行 hold() 命令開(kāi)啟 hook 攔截,然后操作 App 后,會(huì)出現(xiàn)攔截的內(nèi)容如下:
如果想對(duì) okHTTP 進(jìn)行深入的研究可以前往這篇大佬的文章進(jìn)行閱讀 [原創(chuàng)] 如何實(shí)現(xiàn) Https 攔截進(jìn)行 非常規(guī)“抓包”(20.9.13-代碼更新)[9]
總結(jié)
整理了以上九種不同的抓包方式其實(shí)是可以應(yīng)對(duì)目前市面上各大的 APP 抓包場(chǎng)景,當(dāng)然抓包的方式肯定不只這九種,比如還有肉絲大佬 `r0ysue` 的安卓應(yīng)用層抓包通殺腳本[10],有興趣的大佬可以去嘗試一下。其實(shí)能多掌握一些抓包的技巧,也許能夠在測(cè)試的過(guò)程中發(fā)現(xiàn)更多意想不到的新技術(shù)。
編輯:黃飛
?
評(píng)論
查看更多