四種繞過iOS SSL驗證和證書鎖定的方法
幾個月前,Cody Wass釋出了一篇關於 ofollow,noindex">如何繞過Android驗證和證書鎖定(Certificate Pinning)的文章 。由此,我覺得也有必要寫一篇關於iOS的。正如Cody在部落格中所說的,中間人(MitM)攻擊是任何標準滲透測試的重要組成部分。通過中間人攻擊,我們能夠攔截並模糊處理所有HTTP請求,從而找到安全漏洞。在下面的示例中,我將使用Burp作為我的Web代理。本文假定各位讀者已經對iOS、Xcode、手機設定以及Burp如何攔截iOS的移動HTTP流量有基本瞭解。在本文中,我主要介紹四種繞過iOS中SSL驗證和證書鎖定的技術:
1、安裝自己的CA證書;
2、將軟體安裝到iOS裝置;
3、使用Objection和Frida;
4、使用反彙編程式修改IPA檔案。
方法1:安裝自己的CA證書
安裝自己的CA證書是繞過SSL報錯的第一步。在iOS中,安裝CA證書相對比較容易。首先,可以通過電子郵件附件或從網站下載證書的方式,將CA證書放到裝置上。在這裡,需要配置移動裝置和Web代理,以便能夠攔截網路流量。具體來說,如果使用Burp Suite,我們只需訪問 http://burp 隨後點選“CA Certificate”即可。
接下來,系統將提示“安裝”證書,如下圖所示。
點選“安裝”,會彈出提示將要把證書新增到受信任證書列表中的警告。
我們可以進入到“設定”-“常規”-“配置檔案”來驗證證書是否已經被成功安裝。
方法2:將軟體安裝到iOS裝置
如果仍然出現SSL錯誤,或者應用程式卡死在等待連線的狀態,那麼可能是因為應用程式伺服器使用了某種TLS鏈驗證或SSL證書鎖定機制。要繞過SSL證書鎖定,最簡單的方法是安裝一個軟體來完成這些工作。下面的這兩個工具在設定和執行上比較簡單:
SSLKillSwitch: https://github.com/nabla-c0d3/ssl-kill-switch2
Burp Mobile Assistant: https://portswigger.net/burp/help/mobile_testing
在工具的主頁上,已經詳細寫出了安裝說明。但是,要使用這種方法,首先需要先對iOS裝置進行越獄。近年來,隨著Apple安全性的不斷加強,越高版本的iOS系統越獄就越困難。
方法3:使用Objection和Frida
另一種經過驗證的方法,是使用 Frida 鉤子和 Objection 。Frida是一個非常高階的框架,允許我們在執行時干擾應用程式的程式碼。具體在這裡,就是干擾證書驗證的這個功能。同樣,該框架僅能執行在越獄後的裝置上。但是,我們可以使用具有完整框架庫的Frida Gadget,這就不再需要對裝置進行越獄了。Objection是這個框架的包裝器,同樣可以配合實現這種方法。
首先,我們需要Apple Developer賬戶的有效配置檔案和程式碼簽名證書,可以通過在Xcode中建立測試應用程式來建立有效的配置檔案。我們可以在這裡註冊免費的開發人員賬戶: https://developer.apple.com/account/ 。
在建立測試專案後,下一步要設定程式碼簽名證書。首先,開啟Xcode首選項,然後選擇“賬戶”(Accounts)。要新增Apple ID賬戶,需要點選左下角的加號,並登入。然後點選右下角的“管理證書”(Manage Certificates)。
點選該按鈕,就會跳轉到下面的螢幕。要建立證書,需要點選左下方框中的加號,然後選擇“iOS開發”(iOS Development)。載入後,點選“完成”(Done),然後點選“下載手動配置檔案”(Download Manual Profiles),然後將證書載入到計算機上。
將程式碼簽名證書載入到計算機上之後,可以通過執行下面的命令找到它:
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動態庫,以便能在執行時修改應用程式。在iOS應用程式的上下文中,我們想要提取IPA檔案,修改二進位制檔案以載入FridaGadget.dylib,對二進位制檔案和dylib進行程式碼簽名,然後重新打包更新後的IPA檔案。如前所述,我們可以使用Objection自動完成所有這些工作。可以通過下面的簡單命令來完成,其中-s引數是IPA檔案,-c引數是程式碼簽名證書。
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.015176 Found 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...
一旦命令執行完畢,我們就會得到一個名為netspi_test-frida-codesigned.ipa的新IPA檔案,我們可以將其部署到iOS裝置上。有一個名為ios-deploy(https://github.com/ios-control/ios-deploy)的便捷工具,適用於未越獄的iOS裝置。我們可以使用多種不同的選項,具體取決於想要完成的任務(例如:執行偵錯程式、通過USB部署應用程式等)。
要使用ios-deploy,我們需要解壓縮IPA檔案,並執行ios-deploy命令。在下面的示例中,我們指定了需要通過USB(-W)部署應用程式,同時也指定需要部署的包(-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
現在,我們已經在iOS裝置上安裝了應用程式。接下來,就要開啟應用程式,並通過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] #
現在剩下的工作,就是執行繞過證書驗證的內建命令,然後就可以開始代理流量。
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檔案
如果上述方法都沒有成功,或者我們想要挑戰自我,那麼可以使用反彙編程式來修改IPA檔案,從而繞過任何證書驗證。對iOS的反彙編已經超出了本文章的討論範圍,但針對於iOS裝置,比較常用的反彙編程式是Hopper和IDA。將二進位制檔案載入到應用程式後,我們需要重點關注應用程式嘗試與應用程式伺服器建立SSL連線時呼叫的函式,並弄清其背後的邏輯,就可以順藤摸瓜找到證書鎖定所在的位置。需要提醒大家的是,如果對IPA檔案進行修改,很可能會破壞應用程式已有的簽名,導致該應用無法再在iOS裝置上安裝。通過重新設計IPA檔案,我們就可以安裝應用程式。
總結
如前文所說,檢視並修改應用程式傳送到伺服器的HTTP請求,是滲透測試的重要組成部分。通過這樣的測試和分析,測試人員能夠全面地掌握應用程式內部的工作原理。本文中所講解的方法,都是我們在測試過程中使用的方法,用於在出現SSL證書錯誤或證書鎖定情況下進行流量的檢視和修改。如果對本文有任何疑問或指正,歡迎與我們一同討論。
參考文章
[1] https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2015/january/bypassing-openssl-certificate-pinning-in-ios-apps/
[2] http://dji.retroroms.info/howto/iosfrida