前言
作爲爬蟲工程師的基本功,抓包是經常遇到且非常重要的技能之一,尤其是現在的移動端的發展,更是在App抓包這裏做了很多防護措施,本文主要是針對iOS系統App的數據包抓取進行大概總結,主要是針對常規App數據包抓取、突破路由直連抓包以及通過簡單的逆向Hook手段突破SSL Ping防護抓取數據包。
常規抓包
對於常規無抓包防護的App數據抓取,可以直接在手機上通過設置HTTP代理的方式,配合Charles便可以抓取到目標App的數據包,不需要使用其他複雜的或者逆向Hook技術進行輔助。
-
設備:iPhone 5s、Mac -
Mac抓包工具:Charles
抓包實踐
手機和電腦連接同一個wifi,在一個局域網即可。
-
Mac安裝Charles之後,按照圖示操作,設置抓包端口爲8888 -
查看Mac端的內網ip -
手機端設置抓包代理。wifi找到連接的網絡-打開配置代理-切換到手動-輸入Charles的ip 192.168.43.16和端口8888
Charles會提示有新的連接,允許即可。
-
對於使用HTTP方式傳輸的數據包,經過上述操作便可順利抓取到其內容。不過對於一些使用HTTPS方式傳輸數據的APP,要想看到加密前的明文數據就需要做一些額外操作。HTTPS可以理解爲HTTP+SSL/TLS, 它是在HTTP基礎上加入SSL層,提高安全係數。這裏我們使用Charles的證書進行解密流量,下面是安裝Charles SSL證書的步驟:手機瀏覽器打開 chls.pro/ssl ,點擊允許下載描述文件之後,在設置裏面安裝並信任該證書,在iOS新版中有兩個地方需要操作 -
安裝描述文件:設置-通用-描述文件,安裝剛纔的描述文件即可。 -
信任證書:設置-通用-證書信任-找到該證書,並且信任。 -
打開Charles,代理-SSL代理設置-啓用SSL代理-包括的位置添加主機爲*,端口爲443 -
然後可以在Charles上看看到App的數據包。
路由直連
防護介紹
路由直連是客戶端流量直接到達服務器而不經過代理或者未設置代理服務器。參考ZXRequestBlock
項目:
+(NSURLSession *)zx_sessionWithConfiguration:(NSURLSessionConfiguration *)configuration
delegate:(nullable id<NSURLSessionDelegate>)delegate
delegateQueue:(nullable NSOperationQueue *)queue{
if (!configuration){
configuration = [[NSURLSessionConfiguration alloc] init];
}
if(isDisableHttpProxy){//開啓防代理抓包
configuration.connectionProxyDictionary = @{};//設置代理爲空字典
}
return [self zx_sessionWithConfiguration:configuration delegate:delegate delegateQueue:queue];
}
發現該項目是將connectionProxyDictionary
設置空字典,從而繞過中間人代理的數據抓取分析。關於connectionProxyDictionary
在官方文檔中這樣描述:也就是說:這個屬性可以設置網絡代理,默認值是 NULL,使用系統的代理設置。該示例App也就是通過將connectionProxyDictionary
設置爲空字典,從而繞過Charles等抓包軟件的抓取。即App中的所有網絡請求正常,但是所有的網絡請求不經過Charles代理軟件,針對這樣的抓包防護,可以通過建立虛擬網卡的方式進行數據流量抓取。
抓包實踐
-
在手機端藉助代理軟件App,按照如下設置。打開代理軟件App-首頁右上角的加號 -
類型選擇HTTP,地址選擇Charles的ip:192.168.43.16,端口也是Charles的端口8888,其他地方不用填寫。 -
新建一個HTTPS的代理類型,其他同HTTP代理。首頁的全局路由選擇 代理
-
打開開關,即可抓到示例App的數據包。
在Mac上通過Shell連接到手機,查看手機端的網卡信息。
-
未開啓代理軟件: -
開啓代理軟件:
可以看到代理軟件給在手機上建立了一個虛擬網卡,然後將流量轉發到Charles上邊,從而抓到該示例App的數據包。
Frida繞過iOS SSL Pinning
SSL Pinning防護介紹
SSL Pinning稱爲證書鎖定(SSL/TLS Pinning)也就是SSL證書綁定,顧名思義,將服務器提供的SSL/TLS證書內置到移動端開發的App客戶端中,當客戶端發起請求時,通過比對內置的證書和服務器端證書的內容,以確定這個連接的合法性。SSL Pinning又分爲單向證書校驗和雙向證書校驗:
-
單向證書校驗是App應用對服務端證書進行校驗,但是服務端不會對App的證書進行校驗。 -
雙向證書校驗是App應用對服務端證書進行校驗,服務端也會對App的證書進行校驗。如今,不少應用程序已在其移動應用中實現了SSL Pinning,具體表現抓包的時候,App顯示 無法連接網絡
或者請求失敗
之類的提示,這樣的防護是無法完成具體的抓包分析,抓包成了分析的第一座壁壘。這層壁壘在本文中使用Frida和基於Frida開發的工具objection
進行突破。這裏使用應用商店
作爲案例,突破單向證書校驗。 -
設備:越獄的iPhone 5s、Mac -
Mac抓包工具:Charles
安裝Frida
-
Frida是一個很常用的開源Hook工具,只需要編寫一段Javascript代碼就能對指定的函數進行Hook,而且它基本上可以主流平臺全覆蓋,除了iOS,還有Android和PC端的應用也可以用它來進行Hook,非常方便。
-
啓動 Cydia 然後通過 Manage -> Sources -> Edit -> Add 這個操作步驟把 https://build.frida.re 這個代碼倉庫加入進去。然後在Cydia裏面找到Frida的安裝包,最終將iOS設備插入電腦,並開始使用 Frida。
-
電腦上使用python3環境,然後
pip install frida-tools
Frida Hook 應用商店
電腦usb連接手機,並打開應用商店
,然後在Mac上的終端輸入frida-ps -Ua
,可以看到該應用商店的信息了。
打開該應用商店,並進行數據包抓取,可以清楚的發現該應用無網絡,很清晰的看到SSL Pinning的特徵。
Frida腳本:
/*
* Description: iOS 12 SSL Bypass based on blog post https://nabla-c0d3.github.io/blog/2019/05/18/ssl-kill-switch-for-iOS12/
* Author: @macho_reverser
*/
// Variables
var SSL_VERIFY_NONE = 0;
var ssl_ctx_set_custom_verify;
var ssl_get_psk_identity;
/* Create SSL_CTX_set_custom_verify NativeFunction
* Function signature https://github.com/google/boringssl/blob/7540cc2ec0a5c29306ed852483f833c61eddf133/include/openssl/ssl.h#L2294
*/
ssl_ctx_set_custom_verify = new NativeFunction(
Module.findExportByName("libboringssl.dylib", "SSL_CTX_set_custom_verify"),
'void', ['pointer', 'int', 'pointer']
);
/* Create SSL_get_psk_identity NativeFunction
* Function signature https://commondatastorage.googleapis.com/chromium-boringssl-docs/ssl.h.html#SSL_get_psk_identity
*/
ssl_get_psk_identity = new NativeFunction(
Module.findExportByName("libboringssl.dylib", "SSL_get_psk_identity"),
'pointer', ['pointer']
);
function custom_verify_callback_that_does_not_validate(ssl, out_alert) {
return SSL_VERIFY_NONE;
}
var ssl_verify_result_t = new NativeCallback(function (ssl, out_alert) {
custom_verify_callback_that_does_not_validate(ssl, out_alert);
}, 'int', ['pointer', 'pointer']);
function bypassSSL() {
console.log("[+] Bypass successfully loaded ");
Interceptor.replace(ssl_ctx_set_custom_verify, new NativeCallback(function (ssl, mode, callback) {
ssl_ctx_set_custom_verify(ssl, mode, ssl_verify_result_t);
}, 'void', ['pointer', 'int', 'pointer']));
Interceptor.replace(ssl_get_psk_identity, new NativeCallback(function (ssl) {
return "notarealPSKidentity";
}, 'pointer', ['pointer']));
}
bypassSSL();
上邊腳本保存爲killSSL.js文件,使用Frida加載腳本進行Hook:frida -U --no-pause -f com.***.AppStore -l killSSL.js
打開該應用商店之後即可抓包。
該腳本主要是通過Hook更App中ssl_ctx_set_custom_verify
、ssl_get_psk_identity
,替換其回調函數,從而不會去檢查服務端的證書鏈。
使用objection快速繞過SSL Pinning
objection 是基於Frida開發的並且功能強大、命令衆多,而且不用寫一行代碼,便可實現諸如內存搜索、類和模塊搜索、方法 Hook 打印參數返回值調用棧等。
objection Hook SSL Pinning實踐
上述腳本適用於iOS12系統,但在iOS9、iOS10、iOS11等系統無法使用,objection正好進行了整合,在objection
的源碼中(具體路徑objection/blob/master/agent/src/ios/pinning.ts
)可以看到它對iOS的多個版本以及Framework
等,通過觀察查看源碼,發現objection是通過Hook AFNetworking等常用庫和一些底層的methods實現繞過證書綁定。在Mac終端執行pip install objection
再去執行objection -g com.**.AppStore explore
,此時objection
已經附加在該應用商城了,然後在objecton的終端執行 ios sslpinning disable
就可以快速過繞過SSL Pinning,當然該命令是否能奏效還要視具體的App而定。最後效果同Frida繞過SSL Pinning。
小結
iOS端的短鏈抓包在很多App上面都沒有做相關防護,從而使抓包變得更容易,但是針對有抓包防護的App,都可以根據其抓包中出現的現象進行逐一突破,目前常用的也就是本文中提到的路由直連以及SSL Pinning,都可以使用代理軟件或者逆向Hook技術進行突破。
參考
-
https://codeshare.frida.re/@snooze6/ios-pinning-disable/ -
https://github.com/sensepost/objection -
https://github.com/SmileZXLee/ZXRequestBlock -
https://developer.Apple.com/documentation/foundation/nsurlsessionconfiguration/1411499-connectionproxydictionary
本文分享自微信公衆號 - 小白技術社(xbjss123)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。