前提說明
我們經(jīng)常會(huì)遇到很多APP的 HTTPS 接口請(qǐng)求桩盲,Charles 安裝證書后也無法進(jìn)行抓包看到內(nèi)容寂纪。
為什么要抓包呢,如果我們能夠抓取APP任何的請(qǐng)求赌结,那么就可以干很多事情捞蛋,比如分析接口返回?cái)?shù)據(jù),分析下發(fā)內(nèi)容柬姚,分析性能拟杉,分析圖片,分析接口量承,等等很多用途搬设。
所以本篇文章主要是講是針對(duì)這種抓不到HTTPS 加密請(qǐng)求的解決方案和問題探究。
涉及
脫殼(Frida 脫殼撕捍,脫殼后才能進(jìn)行修改APP代碼)
重簽名 (非越獄機(jī)安裝ipa的一種方法)
動(dòng)態(tài)注入(修改代碼后拿穴,注入正常APP)
MonkeyDev (一種懶人越獄開發(fā)環(huán)境工具)
NSURLProtocol (用于攔截請(qǐng)求)
Charles中間人攻擊與HTTPS原理 (了解)
重簽名原理,動(dòng)態(tài)注入卦洽,脫殼贞言,本篇文章不做詳細(xì)深入。
目錄
背景說明
猜測(cè)連接為 CONNECT 原因?qū)е?/p>
Charles 抓取HTTPS原理
逆向思考 - 如何預(yù)防Charles 抓 HTTPS 包
客戶端判斷用戶是否代理訪問
使用 HTTPS 雙向認(rèn)證
客戶端本地證書校驗(yàn)
思考解決方案
得出最終結(jié)論
實(shí)戰(zhàn)破解探探APP阀蒂,HTTPS網(wǎng)絡(luò)請(qǐng)求
總結(jié)
一该窗、背景說明
(1)舉例
例如《探探》APP弟蚀,抓 HTTPS 的接口
可以看到 有些HTTPS請(qǐng)求能夠抓到返回內(nèi)容,有些不能夠抓到返回內(nèi)容酗失。
我們知道 MAC 客戶端可以通過Charles代理义钉,安裝信任Charles證書,然后抓取到HTTPS 請(qǐng)求返回內(nèi)容规肴。
(2)結(jié)論
但是還是發(fā)現(xiàn)很多APP捶闸,例如探探的接口,有的 HTTPS 接口能抓到返回拖刃,有的抓不到删壮,很是奇怪,不知原因兑牡,所以猜想幾個(gè)層面去解決央碟。
一、猜測(cè) - 連接為 CONNECT 原因?qū)е隆?/p>
有聽說請(qǐng)求Method 為 CONNECT 就無法進(jìn)行抓包均函。
實(shí)驗(yàn):嘗試抓取項(xiàng)目 HTTPS 請(qǐng)求
結(jié)論:Method 為 CONNECT
實(shí)驗(yàn):開啟SSL代理信任證書后
CONNECT結(jié)論
Method 變?yōu)?GET 亿虽,并且可以抓到HTTPS響應(yīng)內(nèi)容。
CONNECT 最終結(jié)論
HTTP 1.1定義了8種方法苞也,CONNECT 只是為其中之一洛勉,通常用于SSL加密服務(wù)器的鏈接。
當(dāng)客戶端向Proxy發(fā)起HTTP CONNECT Method的時(shí)候如迟,就是告訴Proxy收毫,先在Proxy和目標(biāo)服務(wù)器之間先建立起連接,在這個(gè)連接建立起來之后殷勘,目標(biāo)服務(wù)器會(huì)返回一個(gè)回復(fù)給Proxy牛哺,Proxy將這個(gè)回復(fù)轉(zhuǎn)發(fā)給客戶端,在此之后劳吠,客戶端跟目標(biāo)服務(wù)器的所有通信都將使用之前建立起來的建立。
Proxy僅僅實(shí)現(xiàn)轉(zhuǎn)發(fā)巩趁,而不會(huì)關(guān)心轉(zhuǎn)發(fā)的數(shù)據(jù)痒玩。因?yàn)镠TTPS的數(shù)據(jù)都是經(jīng)過加密的,Proxy是無法對(duì)Https的數(shù)據(jù)進(jìn)行解密的议慰,所以只能使用CONNECT蠢古,僅僅對(duì)通信數(shù)據(jù)進(jìn)行轉(zhuǎn)發(fā)。
HTTPS Method 基本均為 CONNECT (因?yàn)槭羌用艿臒o法解析别凹,只是建立一個(gè)通道而已)Charles 中間人攻擊后草讶,某些域名開啟后可以抓到內(nèi)容,某些域名依然抓取不到炉菲,所以跟 Method 為 CONNECT 沒有直接的絕對(duì)關(guān)系堕战。所以繼續(xù)往下找原因坤溃。
二、Charles抓取HTTPS原理 (簡(jiǎn)述)
(1)探究
思考過后嘱丢,想了下既然是要解決HTTPS抓包問題薪介,那么也是應(yīng)該了解下 Charles 抓 HTTPS的原理。
了解后知道 Charles 抓 HTTPS 的原理邏輯越驻,其實(shí)很簡(jiǎn)單明了汁政。
主要利用中間人攻擊原理,代理后Charles 會(huì)偽裝為客戶端和服務(wù)器缀旁,充當(dāng)雙面間諜记劈。
Charles作為“中間人代理”,客戶端與服務(wù)器的交流通信都會(huì)經(jīng)過Charles并巍,所以Charles可以 拿到 服務(wù)器證書公鑰目木, HTTPS連接的對(duì)稱密鑰等。
既然拿到了對(duì)稱密鑰履澳,那么就可以內(nèi)容一切都是透明的了嘶窄。
(2)結(jié)論
知道了 Charles 抓包原理,并且客戶端使用Charles進(jìn)行中間人攻擊距贷,開啟了SSL Proxying 代理柄冲,按照理論應(yīng)該是能抓到HTTPS內(nèi)容的,但是發(fā)現(xiàn)抓取 HTTPS 請(qǐng)求還是失敗忠蝗,所以繼續(xù)探究問題现横。
三、逆向思考 - 如何預(yù)防Charles 抓 HTTPS 包
既然前兩種方案都不可行阁最,那么思考想了一下不如逆向思維戒祠,不去思考如何抓 HTTPS 包,而是去思考果是我們速种,我們?cè)撊绾稳ヮA(yù)防別人 Charles 中間人攻擊抓取HTTPS包呢姜盈。
進(jìn)行思考與調(diào)研方案后,得出以下幾種方法:
(1)判斷是否代理訪問
如果檢測(cè)出客戶端使用代理訪問配阵,那么就不允許訪問馏颂。
(2)使用 HTTPS 雙向認(rèn)證
一般做法只有客戶端驗(yàn)證服務(wù)端公鑰證書是不是合法,服務(wù)器對(duì)來訪的客戶端身份不做任何限制棋傍。如果采用雙向驗(yàn)證的方式救拉,在通信過程中,不但客戶端驗(yàn)證服務(wù)端公鑰證書瘫拣,服務(wù)端也會(huì)驗(yàn)證客戶端 app 的公鑰證書亿絮。
在雙向驗(yàn)證中,客戶端需要用到保存自己的私鑰和證書,并且證書需要提前發(fā)給服務(wù)器派昧,由服務(wù)器放到它的信任庫中黔姜。
如果使用雙向驗(yàn)證,這時(shí)候就沒辦法使用 Charles(中間人攻擊的方式)進(jìn)行抓包斗锭。
結(jié)論
(1)探探APP 防止抓包的方法 猜測(cè)
首先從表面來看不是客戶端端判斷是否代理地淀,而禁止訪問。
在開啟SSL Proxying 后依然提示證書問題岖是,所以感覺應(yīng)該是使用了雙向驗(yàn)證或者類似的工程內(nèi)置證書帮毁,進(jìn)行驗(yàn)證的一種方式。
(2)針對(duì)雙向驗(yàn)證豺撑,破解的方法
SSL Kill Switch
didReceiveAuthenticationChallenge
修改HTTPS 請(qǐng)求
四烈疚、思考解決方案
思考后,準(zhǔn)備破解方法聪轿,目前想到有幾種:
(1)SSL Kill Switch 越獄插件
通過hook的方式將校驗(yàn)證書的結(jié)果返回true或者干脆不讓其做校驗(yàn)爷肝。
https://nabla-c0d3.github.io/blog/2016/02/21/ssl-kill-switch-twitter/
缺點(diǎn):需要越獄。
(2)didReceiveChallenge 代理方法
既然客戶端有驗(yàn)證證書的處理陆错,那么如果客戶端能夠信任所有證書灯抛,不就解決了問題。
NSURLSession有個(gè)代理方法 didReceiveChallenge 音瓷,只要訪問的是HTTPS就會(huì)調(diào)用对嚼。
該方法的作用就是?處理服務(wù)器返回的證書?。
如果使用了雙向驗(yàn)證和本地證書校驗(yàn)等绳慎,客戶端應(yīng)該會(huì)在里面進(jìn)行證書驗(yàn)證處理纵竖。
如果HOOK 這個(gè)代理方法,信任所有證書杏愤,那么問題就可以解決了靡砌。
例如一下代碼:
-(void)URLSession:(NSURLSession*)session didReceiveChallenge:(NSURLAuthenticationChallenge*)challenge completionHandler:(void(^)(NSURLSessionAuthChallengeDisposition,NSURLCredential*_Nullable))completionHandler{//? ? NSURLSessionAuthChallengeUseCredential = 0, 使用(信任)證書//? ? NSURLSessionAuthChallengePerformDefaultHandling = 1, 默認(rèn),忽略//? ? NSURLSessionAuthChallengeCancelAuthenticationChallenge = 2,? 取消//? ? NSURLSessionAuthChallengeRejectProtectionSpace = 3,? 這次取消珊楼,下載次再來問if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]){NSURLCredential*credential=[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];if(completionHandler)completionHandler(NSURLSessionAuthChallengeUseCredential,credential);}}
(4)修改Reuquest 請(qǐng)求schme
我們知道iOS可以利用NSURLProtocol 攔截請(qǐng)求進(jìn)行修改.
如果能夠攔截到所有 reuquest通殃,進(jìn)行修改HTTPS 為 HTTP 問題也可得到解決。
例如以下代碼
NSMutableURLRequest*mutableReq=[request mutableCopy];NSString*originUrlStr=mutableReq.URL.absoluteString;NSString*newURLStr=[originUrlStr stringByReplacingOccurrencesOfString:@"https"withString:@"http"];mutableReq.URL=[NSURL URLWithString:newURLStr];
五厕宗、得出最終結(jié)論
(1)SSL Kill Switch 越獄插件
這種方法邓了,需要設(shè)備越獄,比較費(fèi)事媳瞪,所以不采用。
(2)修改 Reuquest 和 信任所有證書辦法可行照宝,但是如何修改探探APP代碼呢蛇受,是個(gè)問題。
利用逆向技術(shù)即可解決厕鹃,利用逆向技術(shù)可以往APP中注入動(dòng)態(tài)庫兢仰,進(jìn)行執(zhí)行自己想要執(zhí)行的代碼乍丈,只要植入NSURLProtocol,在內(nèi)部進(jìn)行攔截拿到最高權(quán)限把将,進(jìn)行信任證書和修改Request等可隨意操作轻专。
具體步驟可參考之前文章:https://drive.google.com/open?id=1fpesf7U4PnzA0pLajbpD8K2FQL0ko7zH914MMRP05d8
六、實(shí)戰(zhàn) - 破解探探APP HTTPS網(wǎng)絡(luò)請(qǐng)求
(1)首先設(shè)備下載探探APP察蹲,然后對(duì)探探APP進(jìn)行脫殼请垛。
布置好 Frida 脫殼環(huán)境,連接設(shè)備SSH洽议,對(duì)探探APP進(jìn)行脫殼宗收。
(2)對(duì)探探APP進(jìn)行重簽名,注入NSURLProtocol代碼亚兄。
為了方便混稽,直接利用MonkeyDev 進(jìn)行重簽名和注入。
(3)操作 - 把所有HTTPS 請(qǐng)求 轉(zhuǎn)為 HTTP
可以看到所有HTTPS 請(qǐng)求 都轉(zhuǎn)為了HTTP 請(qǐng)求审胚,并且可以看到請(qǐng)求返回JSON內(nèi)容了匈勋。
(4)操作 - 信任所有證書
可以看到這時(shí)候再次開啟SSL Proxying 后,依然也是所有請(qǐng)求內(nèi)容都能看到了膳叨。
總結(jié)
本篇文章針對(duì)越獄相關(guān)和加密相關(guān)沒有特別深入去說明洽洁,主要探索出一種破解HTTPS請(qǐng)求的方案。
本人只測(cè)試了 探探 APP懒鉴,如果還有不能搞定的诡挂,可能還需其它方案去探求解決。
目前做到這一步如果擴(kuò)展思維临谱,利用逆向可以到更多事情璃俗,修改探探網(wǎng)絡(luò)請(qǐng)求,修改代碼邏輯悉默,等等城豁。
相關(guān)文檔
HTTPS 驗(yàn)證:?https://mp.weixin.qq.com/s/UiGEzXoCn3F66NRz_T9crA
Monkey 使用:https://drive.google.com/open?id=1fpesf7U4PnzA0pLajbpD8K2FQL0ko7zH914MMRP05d8
Frida脫殼:http://www.alonemonkey.com/2018/01/30/frida-ios-dump/