技術討論 | 四種繞過iOS SSL驗證和證書固定的方法
嚴正宣告:本文僅限於技術討論,嚴禁用於其他用途。
幾個月前, ofollow,noindex" target="_blank">Cody Wass 曾發表過一篇關於如何繞過Android驗證和證書固定的文章。這篇文章給予了我很大的靈感,因此我決定也分享一些我在工作當中發現的,關於繞過iOS SSL驗證和證書固定的方法。Cody在他的文章裡重申了中間人攻擊,在任何標準滲透測試當中的重要性。通過中間人攻擊,我們可以攔截和fuzz所有的HTTP請求,並檢查是否存在安全漏洞。在下面的例子中,我將使用Burp Suite作為我的Web代理。本文假設讀者對iOS,Xcode,設定手機和在iOS使用Burp攔截HTTP流量有基本的瞭解。本文我將為大家介紹以下四種,繞過iOS中的SSL驗證和證書固定的方法:
1. 安裝自己的 CA 證書
2. 將軟體安裝到 iOS 裝置
3. 使用 Objection 和 Frida
4. 使用反彙編程式修改 IPA 檔案
方法1:安裝自己的 CA 證書
安裝自己的CA證書是擺脫SSL errors的第一步。在iOS中安裝CA證書相對容易。首先,要做的就是將CA證書放到裝置上。這可以通過開啟電子郵件附件或下載證書來完成。然後,我們需要配置移動裝置和Web代理,以攔截經過的網路流量。具體來說對於Burp Suite,你只需在瀏覽器中訪問 http://burp 並單擊“CA Certificate”即可。
接下來,系統將提示你“Install”證書,如下所示。
單擊“Install”按鈕後,會提示將要安裝的證書新增到受信任證書列表中的警告。
你可以進入Settings > General > Profile來驗證證書是否已被成功安裝。
方法 2:將軟體安裝到 iOS 裝置
如果仍出現SSL errors,或應用程式本身因為等待連線而發生卡死現象,則應用程式伺服器可能正在使用某種TLS鏈驗證或 SSL證書固定 。繞過SSL證書固定的最簡單方法是,安裝易於使用的工具軟體來幫我們完成這個過程。以下是我所使用的兩款工具:
具體的安裝大家直接參考工具的安裝說明即可。但使用這些方法,我們需要越獄的iOS裝置。近年來,隨著蘋果公司對iOS裝置安全性的不斷增強,越獄的難度也變得越來越大。
方法 3:使用 Objection 和 Frida
另一種已驗證過的方法是使用 Frida hooks 和 Objection .。Frida是一個非常先進的框架,允許你在執行時干擾應用程式的程式碼。但Frida需要裝置越獄後才能使用。但是,我們可以使用具有完整框架庫的Frida Gadget,這樣我們就不需要越獄裝置了。Objection是這個框架的包裝器,將為我們自動化的完成所有工作。
首先,我們需要Apple Developer帳戶的有效配置檔案和程式碼簽名證書。你可以通過在Xcode中建立測試應用程式來建立有效的配置檔案,並在 這裡 註冊免費的開發人員帳戶。
建立測試專案後,下一步是設定程式碼簽名證書。首先,開啟Xcode首選項,然後選擇“Accounts”。要新增Apple ID帳戶,請單擊左下角的加號並登入你的帳戶。然後單擊右下角的“Manage Certificates”。
單擊該按鈕後,將會跳轉到以下介面。要建立證書,請單擊左下方框中的加號,然後選擇“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 的工具,可以和未越獄的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證書錯誤和固定時檢視和操縱流量。如果你對文中所提及的內容有任何的疑問,或是你有更好的方法。那麼,歡迎你在下面的評論中告訴我!
參考文獻
http://dji.retroroms.info/howto/iosfrida
*參考來源: netspi , FB小編secist編譯,轉載請註明來自FreeBuf.COM