iOS逆向工程破解任意 APP HTTPS 加密

前提說明

我們經(jīng)常會遇到很多APP的 HTTPS 接口請求,Charles 安裝證書后也無法進行抓包看到內(nèi)容。

為什么要抓包呢,如果我們能夠抓取APP任何的請求,那么就可以干很多事情,比如分析接口返回數(shù)據(jù),分析下發(fā)內(nèi)容,分析性能,分析圖片,分析接口,等等很多用途。

所以本篇文章主要是講是針對這種抓不到HTTPS 加密請求的解決方案和問題探究。

涉及

脫殼(Frida 脫殼,脫殼后才能進行修改APP代碼)

重簽名 (非越獄機安裝ipa的一種方法)

動態(tài)注入(修改代碼后,注入正常APP)

MonkeyDev (一種懶人越獄開發(fā)環(huán)境工具)

NSURLProtocol (用于攔截請求)

Charles中間人攻擊與HTTPS原理 (了解)

重簽名原理,動態(tài)注入,脫殼,本篇文章不做詳細深入。

目錄

背景說明

猜測連接為 CONNECT 原因?qū)е?/p>

Charles 抓取HTTPS原理

逆向思考 - 如何預(yù)防Charles 抓 HTTPS 包

客戶端判斷用戶是否代理訪問

使用 HTTPS 雙向認證

客戶端本地證書校驗

思考解決方案

得出最終結(jié)論

實戰(zhàn)破解探探APP,HTTPS網(wǎng)絡(luò)請求

總結(jié)

一、背景說明

(1)舉例

例如《探探》APP,抓 HTTPS 的接口

可以看到 有些HTTPS請求能夠抓到返回內(nèi)容,有些不能夠抓到返回內(nèi)容。

我們知道 MAC 客戶端可以通過Charles代理,安裝信任Charles證書,然后抓取到HTTPS 請求返回內(nèi)容。

(2)結(jié)論

但是還是發(fā)現(xiàn)很多APP,例如探探的接口,有的 HTTPS 接口能抓到返回,有的抓不到,很是奇怪,不知原因,所以猜想幾個層面去解決。

一、猜測 - 連接為 CONNECT 原因?qū)е隆?/p>

有聽說請求Method 為 CONNECT 就無法進行抓包。

實驗:嘗試抓取項目 HTTPS 請求

結(jié)論:Method 為 CONNECT

實驗:開啟SSL代理信任證書后

CONNECT結(jié)論

Method 變?yōu)?GET ,并且可以抓到HTTPS響應(yīng)內(nèi)容。

CONNECT 最終結(jié)論

HTTP 1.1定義了8種方法,CONNECT 只是為其中之一,通常用于SSL加密服務(wù)器的鏈接。

當客戶端向Proxy發(fā)起HTTP CONNECT Method的時候,就是告訴Proxy,先在Proxy和目標服務(wù)器之間先建立起連接,在這個連接建立起來之后,目標服務(wù)器會返回一個回復(fù)給Proxy,Proxy將這個回復(fù)轉(zhuǎn)發(fā)給客戶端,在此之后,客戶端跟目標服務(wù)器的所有通信都將使用之前建立起來的建立。

Proxy僅僅實現(xiàn)轉(zhuǎn)發(fā),而不會關(guān)心轉(zhuǎn)發(fā)的數(shù)據(jù)。因為HTTPS的數(shù)據(jù)都是經(jīng)過加密的,Proxy是無法對Https的數(shù)據(jù)進行解密的,所以只能使用CONNECT,僅僅對通信數(shù)據(jù)進行轉(zhuǎn)發(fā)。

HTTPS Method 基本均為 CONNECT (因為是加密的無法解析,只是建立一個通道而已)Charles 中間人攻擊后,某些域名開啟后可以抓到內(nèi)容,某些域名依然抓取不到,所以跟 Method 為 CONNECT 沒有直接的絕對關(guān)系。所以繼續(xù)往下找原因。

二、Charles抓取HTTPS原理 (簡述)

(1)探究

思考過后,想了下既然是要解決HTTPS抓包問題,那么也是應(yīng)該了解下 Charles 抓 HTTPS的原理。

了解后知道 Charles 抓 HTTPS 的原理邏輯,其實很簡單明了。

主要利用中間人攻擊原理,代理后Charles 會偽裝為客戶端和服務(wù)器,充當雙面間諜。

Charles作為“中間人代理”,客戶端與服務(wù)器的交流通信都會經(jīng)過Charles,所以Charles可以 拿到 服務(wù)器證書公鑰, HTTPS連接的對稱密鑰等。

既然拿到了對稱密鑰,那么就可以內(nèi)容一切都是透明的了。

(2)結(jié)論

知道了 Charles 抓包原理,并且客戶端使用Charles進行中間人攻擊,開啟了SSL Proxying 代理,按照理論應(yīng)該是能抓到HTTPS內(nèi)容的,但是發(fā)現(xiàn)抓取 HTTPS 請求還是失敗,所以繼續(xù)探究問題。

三、逆向思考 - 如何預(yù)防Charles 抓 HTTPS 包

既然前兩種方案都不可行,那么思考想了一下不如逆向思維,不去思考如何抓 HTTPS 包,而是去思考果是我們,我們該如何去預(yù)防別人 Charles 中間人攻擊抓取HTTPS包呢。

進行思考與調(diào)研方案后,得出以下幾種方法:

(1)判斷是否代理訪問

如果檢測出客戶端使用代理訪問,那么就不允許訪問。

(2)使用 HTTPS 雙向認證

一般做法只有客戶端驗證服務(wù)端公鑰證書是不是合法,服務(wù)器對來訪的客戶端身份不做任何限制。如果采用雙向驗證的方式,在通信過程中,不但客戶端驗證服務(wù)端公鑰證書,服務(wù)端也會驗證客戶端 app 的公鑰證書。

在雙向驗證中,客戶端需要用到保存自己的私鑰和證書,并且證書需要提前發(fā)給服務(wù)器,由服務(wù)器放到它的信任庫中。

如果使用雙向驗證,這時候就沒辦法使用 Charles(中間人攻擊的方式)進行抓包。

結(jié)論

(1)探探APP 防止抓包的方法 猜測

首先從表面來看不是客戶端端判斷是否代理,而禁止訪問。

在開啟SSL Proxying 后依然提示證書問題,所以感覺應(yīng)該是使用了雙向驗證或者類似的工程內(nèi)置證書,進行驗證的一種方式。

(2)針對雙向驗證,破解的方法

SSL Kill Switch

didReceiveAuthenticationChallenge

修改HTTPS 請求

四、思考解決方案

思考后,準備破解方法,目前想到有幾種:

(1)SSL Kill Switch 越獄插件

通過hook的方式將校驗證書的結(jié)果返回true或者干脆不讓其做校驗。

https://nabla-c0d3.github.io/blog/2016/02/21/ssl-kill-switch-twitter/

缺點:需要越獄。

(2)didReceiveChallenge 代理方法

既然客戶端有驗證證書的處理,那么如果客戶端能夠信任所有證書,不就解決了問題。

NSURLSession有個代理方法 didReceiveChallenge ,只要訪問的是HTTPS就會調(diào)用。

該方法的作用就是?處理服務(wù)器返回的證書?。

如果使用了雙向驗證和本地證書校驗等,客戶端應(yīng)該會在里面進行證書驗證處理。

如果HOOK 這個代理方法,信任所有證書,那么問題就可以解決了。

例如一下代碼:

-(void)URLSession:(NSURLSession*)session didReceiveChallenge:(NSURLAuthenticationChallenge*)challenge completionHandler:(void(^)(NSURLSessionAuthChallengeDisposition,NSURLCredential*_Nullable))completionHandler{//? ? NSURLSessionAuthChallengeUseCredential = 0, 使用(信任)證書//? ? NSURLSessionAuthChallengePerformDefaultHandling = 1, 默認,忽略//? ? NSURLSessionAuthChallengeCancelAuthenticationChallenge = 2,? 取消//? ? NSURLSessionAuthChallengeRejectProtectionSpace = 3,? 這次取消,下載次再來問if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]){NSURLCredential*credential=[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];if(completionHandler)completionHandler(NSURLSessionAuthChallengeUseCredential,credential);}}

(4)修改Reuquest 請求schme

我們知道iOS可以利用NSURLProtocol 攔截請求進行修改.

如果能夠攔截到所有 reuquest,進行修改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è)備越獄,比較費事,所以不采用。

(2)修改 Reuquest 和 信任所有證書辦法可行,但是如何修改探探APP代碼呢,是個問題。

利用逆向技術(shù)即可解決,利用逆向技術(shù)可以往APP中注入動態(tài)庫,進行執(zhí)行自己想要執(zhí)行的代碼,只要植入NSURLProtocol,在內(nèi)部進行攔截拿到最高權(quán)限,進行信任證書和修改Request等可隨意操作。

具體步驟可參考之前文章:https://drive.google.com/open?id=1fpesf7U4PnzA0pLajbpD8K2FQL0ko7zH914MMRP05d8

六、實戰(zhàn) - 破解探探APP HTTPS網(wǎng)絡(luò)請求

(1)首先設(shè)備下載探探APP,然后對探探APP進行脫殼。

布置好 Frida 脫殼環(huán)境,連接設(shè)備SSH,對探探APP進行脫殼。

(2)對探探APP進行重簽名,注入NSURLProtocol代碼。

為了方便,直接利用MonkeyDev 進行重簽名和注入。

(3)操作 - 把所有HTTPS 請求 轉(zhuǎn)為 HTTP

可以看到所有HTTPS 請求 都轉(zhuǎn)為了HTTP 請求,并且可以看到請求返回JSON內(nèi)容了。

(4)操作 - 信任所有證書

可以看到這時候再次開啟SSL Proxying 后,依然也是所有請求內(nèi)容都能看到了。

總結(jié)

本篇文章針對越獄相關(guān)和加密相關(guān)沒有特別深入去說明,主要探索出一種破解HTTPS請求的方案。

本人只測試了 探探 APP,如果還有不能搞定的,可能還需其它方案去探求解決。

目前做到這一步如果擴展思維,利用逆向可以到更多事情,修改探探網(wǎng)絡(luò)請求修改代碼邏輯,等等。

相關(guān)文檔

HTTPS 驗證:?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/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容