嚴(yán)正聲明:本文僅限于技術(shù)討論,嚴(yán)禁用于其他用途。
幾個(gè)月前,Cody Wass曾發(fā)表過(guò)一篇關(guān)于如何繞過(guò)Android驗(yàn)證和證書(shū)固定的文章。這篇文章給予了我很大的靈感,因此我決定也分享一些我在工作當(dāng)中發(fā)現(xiàn)的,關(guān)于繞過(guò)iOS SSL驗(yàn)證和證書(shū)固定的方法。Cody在他的文章里重申了中間人攻擊,在任何標(biāo)準(zhǔn)滲透測(cè)試當(dāng)中的重要性。通過(guò)中間人攻擊,我們可以攔截和fuzz所有的HTTP請(qǐng)求,并檢查是否存在安全漏洞。在下面的例子中,我將使用Burp Suite作為我的Web代理。本文假設(shè)讀者對(duì)iOS,Xcode,設(shè)置手機(jī)和在iOS使用Burp攔截HTTP流量有基本的了解。本文我將為大家介紹以下四種,繞過(guò)iOS中的SSL驗(yàn)證和證書(shū)固定的方法:
1. 安裝自己的 CA 證書(shū)2. 將軟件安裝到 iOS 設(shè)備3. 使用 Objection 和 Frida4. 使用反匯編程序修改 IPA 文件
方法1:安裝自己的 CA 證書(shū)
安裝自己的CA證書(shū)是擺脫SSL errors的第一步。在iOS中安裝CA證書(shū)相對(duì)容易。首先,要做的就是將CA證書(shū)放到設(shè)備上。這可以通過(guò)打開(kāi)電子郵件附件或下載證書(shū)來(lái)完成。然后,我們需要配置移動(dòng)設(shè)備和Web代理,以攔截經(jīng)過(guò)的網(wǎng)絡(luò)流量。具體來(lái)說(shuō)對(duì)于Burp Suite,你只需在瀏覽器中訪問(wèn)http://burp并單擊“CA Certificate”即可。
接下來(lái),系統(tǒng)將提示你“Install”證書(shū),如下所示。

單擊“Install”按鈕后,會(huì)提示將要安裝的證書(shū)添加到受信任證書(shū)列表中的警告。

你可以進(jìn)入Settings > General > Profile來(lái)驗(yàn)證證書(shū)是否已被成功安裝。
方法 2:將軟件安裝到 iOS 設(shè)備
如果仍出現(xiàn)SSL errors,或應(yīng)用程序本身因?yàn)榈却B接而發(fā)生卡死現(xiàn)象,則應(yīng)用程序服務(wù)器可能正在使用某種TLS鏈驗(yàn)證或SSL證書(shū)固定。繞過(guò)SSL證書(shū)固定的最簡(jiǎn)單方法是,安裝易于使用的工具軟件來(lái)幫我們完成這個(gè)過(guò)程。以下是我所使用的兩款工具:
SSLKillSwitch
Burp Mobile Assistant
具體的安裝大家直接參考工具的安裝說(shuō)明即可。但使用這些方法,我們需要越獄的iOS設(shè)備。近年來(lái),隨著蘋(píng)果公司對(duì)iOS設(shè)備安全性的不斷增強(qiáng),越獄的難度也變得越來(lái)越大。
方法 3:使用 Objection 和 Frida
另一種已驗(yàn)證過(guò)的方法是使用Frida hooks 和 Objection.。Frida是一個(gè)非常先進(jìn)的框架,允許你在運(yùn)行時(shí)干擾應(yīng)用程序的代碼。但Frida需要設(shè)備越獄后才能使用。但是,我們可以使用具有完整框架庫(kù)的Frida Gadget,這樣我們就不需要越獄設(shè)備了。Objection是這個(gè)框架的包裝器,將為我們自動(dòng)化的完成所有工作。
首先,我們需要Apple Developer帳戶(hù)的有效配置文件和代碼簽名證書(shū)。你可以通過(guò)在Xcode中創(chuàng)建測(cè)試應(yīng)用程序來(lái)創(chuàng)建有效的配置文件,并在這里注冊(cè)免費(fèi)的開(kāi)發(fā)人員帳戶(hù)。
創(chuàng)建測(cè)試項(xiàng)目后,下一步是設(shè)置代碼簽名證書(shū)。首先,打開(kāi)Xcode首選項(xiàng),然后選擇“Accounts”。要添加Apple ID帳戶(hù),請(qǐng)單擊左下角的加號(hào)并登錄你的帳戶(hù)。然后單擊右下角的“Manage Certificates”。

單擊該按鈕后,將會(huì)跳轉(zhuǎn)到以下界面。要?jiǎng)?chuàng)建證書(shū),請(qǐng)單擊左下方框中的加號(hào),然后選擇“iOS Development”。加載后,單擊“Done”,然后單擊“Download Manual Profiles”,將證書(shū)加載到計(jì)算機(jī)上。

將代碼簽名證書(shū)加載到計(jì)算機(jī)上后,我們可以通過(guò)運(yùn)行以下命令來(lái)找到它:
NetSPIs-MacBook-Pro:Test netspi$ security find-identity
Policy: X.509 Basic
Matching identities
1) A[REDACTED]1 "iPhone Developer: [REDACTED]@netspi.com ([REDACTED])"
2) 0[REDACTED]C "iPhone Developer: [REDACTED]@netspi.com ([REDACTED])"
2 identities found
Valid identities only
1) A[REDACTED]1 "iPhone Developer: [REDACTED]@netspi.com ([REDACTED])"
2) 0[REDACTED]C "iPhone Developer: [REDACTED]@netspi.com ([REDACTED])"
2 valid identities found
我們想要加載Frida Gadget動(dòng)態(tài)庫(kù),以能夠在運(yùn)行時(shí)修改應(yīng)用程序。在iOS應(yīng)用程序的上下文中,我們想要提取IPA文件,修改二進(jìn)制文件以加載FridaGadget.dylib,對(duì)二進(jìn)制文件和dylib進(jìn)行代碼簽名,然后重新打包更新的IPA文件。如上所述,我們可以使用Objection來(lái)自動(dòng)幫我們完成所有這些工作。只需運(yùn)行以下簡(jiǎn)單命令即可,其中-s是IPA文件,-c是代碼簽名證書(shū)。
NetSPIs-MacBook-Pro:NetSPI netspi$ objection patchipa -s netspi_test.ipa -c 0[REDACTED]C
Using latest Github gadget version: 12.0.3
Remote FridaGadget version is v12.0.3, local is v12.0.1. Downloading...
Downloading from: https://github.com/frida/frida/releases/download/12.0.3/frida-gadget-12.0.3-ios-universal.dylib.xz
Downloading iOS dylib to /Users/netspi/.objection/ios/FridaGadget.dylib.xz...
Unpacking /Users/netspi/.objection/ios/FridaGadget.dylib.xz...
Cleaning up downloaded archives...
Patcher will be using Gadget version: 12.0.3
No provision file specified, searching for one...
Found provision file /Users/netspi/Library/Developer/Xcode/DerivedData/test-fbleootdcdwdyafhyzjmvihvfiga/Build/Products/Debug-iphoneos/test.app/embedded.mobileprovision expiring in 307 days, 1:40:03.015176Found a valid provisioning profile
Working with app: NetSPI.app
Bundle identifier is: com.netspi.test
Codesigning 13 .dylib's with signature 0[REDACTED]C
Code signing: libswiftDarwin.dylib
Code signing: libswiftUIKit.dylib
Code signing: libswiftCoreImage.dylib
Code signing: libswiftos.dylib
Code signing: libswiftObjectiveC.dylib
Code signing: libswiftCoreGraphics.dylib
Code signing: FridaGadget.dylib
Code signing: libswiftCore.dylib
Code signing: libswiftCoreFoundation.dylib
Code signing: libswiftMetal.dylib
Code signing: libswiftQuartzCore.dylib
Code signing: libswiftFoundation.dylib
Code signing: libswiftDispatch.dylib
Creating new archive with patched contents...
Codesigning patched IPA...
Cannot find entitlements in binary. Using defaults
Copying final ipa from /var/folders/1k/mw7w1kfd4c96jkvkw5mp3qfm0000gn/T/netspi_test-frida-codesigned.ipa to current directory...
Cleaning up temp files...
一旦命令執(zhí)行完畢,就會(huì)為我們生成一個(gè)名為netspi_test-frida-codesigned.ipa的新IPA文件,我們可以將其部署到iOS設(shè)備上。有一個(gè)名為ios-deploy的工具,可以和未越獄的iOS設(shè)備配合使用。我們可以使用多種不同的選項(xiàng),具體取決于你要完成的任務(wù)(例如,運(yùn)行調(diào)試器,通過(guò)USB部署應(yīng)用程序等)。
要使用ios-deploy,我們需要解壓縮IPA文件并運(yùn)行ios-deploy命令。在下面的示例中,我指定了我想通過(guò)USB (-W)部署應(yīng)用程序,以及我要部署的包(-b)。
NetSPIs-MacBook-Pro:NetSPI netspi$ ios-deploy -W -b ./Payload/NetSPI.app
[....] Waiting for iOS device to be connected
[....] Using 3ff9c90d2b23beadeefdf7bc240211730c84adef (P105AP, iPad mini, iphoneos, armv7) a.k.a. 'MAPen's iPad'.
------ Install phase ------
[ 0%] Found 3ff9c90d2b23beadeefdf7bc240211730c84adef (P105AP, iPad mini, iphoneos, armv7) a.k.a. 'MAPen's iPad' connected through USB, beginning install
[ 5%] Copying /Users/netspi/test/NetSPI/Payload/NetSPI.app/META-INF/ to device
[TRUNCATED]
[ 52%] CreatingStagingDirectory
[ 57%] ExtractingPackage
[ 60%] InspectingPackage
[ 60%] TakingInstallLock
[ 65%] PreflightingApplication
[ 65%] InstallingEmbeddedProfile
[ 70%] VerifyingApplication
[ 75%] CreatingContainer
[ 80%] InstallingApplication
[ 85%] PostflightingApplication
[ 90%] SandboxingApplication
[ 95%] GeneratingApplicationMap
[100%] Installed package ./Payload/NetSPI.app
現(xiàn)在,我們已在iOS設(shè)備上安裝了應(yīng)用程序。接下來(lái)要做的是打開(kāi)應(yīng)用程序并通過(guò)Objection與它建立連接。
NetSPIs-MacBook-Pro:NetSPI netspi$ objection explore
_ _ _ _
___| |_ |_|___ ___| |_|_|___ ___
| . | . | | | -_| _| _| | . | |
|___|___|_| |___|___|_| |_|___|_|_|
|___|(object)inject(ion) v1.3.0
Runtime Mobile Exploration
by: @leonjza from @sensepost
[tab] for command suggestions
com.netspi.test on (iPad: 9.0.1) [usb] #
建立連接后,我們只需運(yùn)行繞過(guò)證書(shū)驗(yàn)證的內(nèi)置命令,代理流量即可。
com.netspi.test on (iPad: 9.0.1) [usb] # ios sslpinning disable
Job: b748974e-ed6d-4aaf-b5ea-3fb35a13720a - Starting
[3fb35a13720a] [ios-ssl-pinning-bypass] [NSURLSession] Found 1 matches for URLSession:didReceiveChallenge:completionHandler:
[3fb35a13720a] [ios-ssl-pinning-bypass] [NSURLConnection] Found 5 matches for connection:willSendRequestForAuthenticationChallenge:
[3fb35a13720a] [ios-ssl-pinning-bypass] Hooking lower level method: SSLSetSessionOption
[3fb35a13720a] [ios-ssl-pinning-bypass] Hooking lower level method: SSLCreateContext
[3fb35a13720a] [ios-ssl-pinning-bypass] Hooking lower level method: SSLHandshake
Job: b748974e-ed6d-4aaf-b5ea-3fb35a13720a - Started
方法 4:使用反匯編程序修改 IPA 文件
如果以上三種方法都嘗試失敗,那么你可以選擇使用反匯編程序來(lái)修改IPA文件的方法繞過(guò)證書(shū)驗(yàn)證。對(duì)iOS的反匯編內(nèi)容已超出了本文的討論范圍。對(duì)于iOS而言,最常用的反匯編程序是Hopper和IDA。你只需將二進(jìn)制文件加載到應(yīng)用程序,并觀察移動(dòng)應(yīng)用程序嘗試與應(yīng)用程序服務(wù)器建立SSL連接時(shí)調(diào)用的函數(shù)背后的邏輯,就可以找到證書(shū)固定發(fā)生的位置。修改IPA很可能會(huì)破壞已簽名的應(yīng)用程序,并導(dǎo)致其無(wú)法在iOS設(shè)備上進(jìn)行安裝。通過(guò)重簽名IPA文件,可以幫你解決這個(gè)問(wèn)題。
總結(jié)
就像本文開(kāi)頭說(shuō)的,能夠查看和修改從移動(dòng)應(yīng)用程序發(fā)送至服務(wù)器的HTTP請(qǐng)求,是滲透測(cè)試工作的重要組成部分。這能夠讓我們測(cè)試人員對(duì)應(yīng)用程序的功能,有更為全面的了解。本文中介紹的方法,都是我們?cè)谠u(píng)估期間常用到的方法,用于在出現(xiàn)SSL證書(shū)錯(cuò)誤和固定時(shí)查看和操縱流量。如果你對(duì)文中所提及的內(nèi)容有任何的疑問(wèn),或是你有更好的方法。那么,歡迎你在下面的評(píng)論中告訴我!
參考文獻(xiàn)
https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2015/january/bypassing-openssl-certificate-pinning-in-ios-apps/
http://dji.retroroms.info/howto/iosfrida
|