iOS Pentesting without Jailbreak

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

メインアイデア

Applications signed with the entitlement get_task_allow allow third party applications to run a function called task_for_pid() with the process ID of the initial application as argument in order to get the task port over it (be able to control it and access it’s memory).

しかし、単にIPAを取り出してentitlementを付けて再署名し、デバイスに戻すだけでは簡単にはいきません。これは FairPlay 保護のためです。アプリの署名が変更されると、DRM (Digital Rights Management) キーが 無効化されアプリが動作しなくなります

古いjailbrokenデバイスがあれば、IPAをインストールして、Iridiumやfrida-ios-dumpのような好きなツールで復号し、デバイスから取り出すことが可能です。ただし、可能であれば復号済みIPAのクライアントをそのまま使うことを推奨します。

Obtain decrypted IPA

Get it from Apple

  1. iPhoneにpentest対象のアプリをインストールする
  2. macOSにApple Configuratorをインストールして起動する
  3. MacのTerminal を開き、/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileAppsにcdする。IPAは後でこのフォルダに現れます。
  4. あなたのiOSデバイスが表示されるはずです。それをダブルクリックし、上部メニューバーの Add + → Apps をクリックします。
  5. Addをクリックすると、ConfiguratorはAppleからIPAをダウンロードし、デバイスへプッシュしようとします。前述の通り既にIPAをインストールしていれば、再インストールを促すプロンプトが表示されます。
  6. IPAは/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps内にダウンロードされるはずなので、そこから取得できます。

このプロセスの詳細は https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed を参照してください。

Decrypting the app

IPAを復号するためにはインストールする必要があります。しかし、古いjailbroken iPhoneを持っている場合、そのバージョンがアプリにサポートされていない可能性があります。通常、アプリは最新バージョンのみをサポートするためです。

なので、インストールするためにIPAを単純に解凍します:

unzip redacted.ipa -d unzipped

Info.plist を開いて最小サポートバージョンを確認し、デバイスがそれより古い場合はサポートされるように値を変更してください。

IPA を再度 Zip 圧縮する:

cd unzipped
zip -r ../no-min-version.ipa *

次に、例えば次のコマンドでIPAをインストールします:

ideviceinstaller -i no-min-version.ipa -w

CydiaからAppSync Unified tweakが必要になることがあり、invalid signatureエラーを防げることに注意してください。

インストールしたら、CydiaのIridium tweakを使って復号化されたIPAを取得できます。

エンタイトルメントのパッチと再署名

アプリをget-task-allowエンタイトルメントで再署名するために、app-signercodesigniResignなどのツールが利用できます。app-signerは非常にユーザーフレンドリーなインターフェースを持ち、再署名するIPAを指定してIPAファイルを簡単に再署名し、get-taks-allowを付与して使用する証明書とプロビジョニングプロファイルを指定できます。

証明書と署名プロファイルに関しては、AppleはXcodeを通じてすべてのアカウント向けにfree developer signing profilesを提供しています。アプリを作成して設定してください。次に、SettingsPrivacy & Security に移動し、Developer Mode をクリックして、iPhoneが開発者アプリを信頼するように設定します。

再署名したIPAがあれば、デバイスにインストールしてpentestを行う時です:

ideviceinstaller -i resigned.ipa -w

IPA patching + DYLIB injection + 無料の Apple ID re-sign (CLI)

すでにdecrypted IPAを持っている場合、カスタムDYLIBをロードするようにパッチを当て、entitlements(例: network)を追加し、無料のApple IDを使ってwithout Xcodeでre-signできます。これは脱獄していないデバイスでのin-app instrumentationに便利です。

典型的なフロー:

# Build the implant (macOS for build step)
make

# Patch the IPA to inject the DYLIB
python3 tools/patcher.py patch --ipa MyApp.ipa --dylib libShell.dylib
# -> MyApp_patched.ipa

# Patch + sign + install in one step (free Apple ID)
python3 tools/patcher.py full \
--ipa MyApp.ipa \
--dylib libShell.dylib \
--apple-id user@example.com \
--install \
--udid <device-udid>

ノート:

  • Free Apple ID signing は通常 7 days で期限切れになり、3 App IDs/week10 sideloaded apps に制限されます。
  • このツールは SRP を介して Apple に認証し、無料の dev certificate + provisioning profile を生成することでクロスプラットフォームで再署名できます。Apple の anisette ヘッダはプラットフォームごとに処理されます(macOS は AOSKit.framework、Linux は Anisette.py、Windows は外部の anisette server)。
  • これは sandbox をバイパスするものではありません。injected code はアプリのプロセス内で実行され、アプリの sandbox と keychain access groups にしかアクセスできません。

USB のみで injected implant にアクセス

もし injected DYLIB がローカルの TCP control channel を公開している場合、トラフィックを off Wi-Fi/cellular に保ち、USB 経由で転送できます:

# Forward device-local TCP port to host
iproxy 8080 8080

# Example client commands (host side)
python3 client.py "ls"
python3 client.py "pwd"
python3 client.py "scp -r Documents host:./downloads"

implant に keychain helpers が含まれている場合、そのアプリからアクセス可能なアイテムをdumpできます:

python3 client.py "keychain dump"
python3 client.py "keychain dump --filter self"
python3 client.py "keychain dump --class generic"

Enable Developer Mode (iOS 16+)

Since iOS 16 Apple introduced Developer Mode: any binary that carries get_task_allow or is signed with a development certificate will refuse to launch until Developer Mode is enabled on the device. You will also not be able to attach Frida/LLDB unless this flag is on.

  1. 任意の開発者署名済みIPAをデバイスにインストールまたはプッシュする。
  2. Settings → Privacy & Security → Developer Mode に移動してオンに切り替える。
  3. デバイスが再起動します。パスコード入力後、Turn On Developer Mode を求められます。

Developer Mode は無効化するかデバイスをワイプするまで有効なので、この手順はデバイスごとに一度だけ実行すれば十分です。セキュリティ上の影響については Apple documentation を参照してください。

モダンなサイドローディングオプション

jailbreakなしでIPAをサイドロードし、再署名済みIPAを最新の状態に保つ成熟した方法がいくつかあります:

ツール要件強み制限
AltStore 2 / SideStoremacOS/Windows/Linux 上のコンパニオンが無料のdevプロファイルでIPAを7日ごとに再署名するWi‑Fi経由で自動リロード、iOS 17まで動作同一ネットワーク上にコンピュータが必要、Appleによる3アプリ制限
TrollStore 1/2CoreTrustバグに対して脆弱なiOS 14 – 15.4.1のデバイスPermanent な署名(7日制限なし);一度インストールすればコンピュータ不要iOS 15.5以降ではサポートされない(バグが修正された)

現在のiOSバージョンでのルーチンpentestsでは、Alt/Side-Storeが通常もっとも実用的な選択肢です。

Hooking / dynamic instrumentation

一度アプリがget_task_allowで署名され、Developer Modeが有効であれば、jailbroken deviceとまったく同様にアプリにhookできます:

# Spawn & attach with objection
objection -g "com.example.target" explore

# Or plain Frida
frida -U -f com.example.target -l my_script.js --no-pause

Recent Frida リリース(>=16)では pointer authentication やその他の iOS 17 の緩和策が自動的に処理されるため、既存のスクリプトの多くはそのまま動作します。

non-jailbroken IPAs への Frida Gadget injection (listen mode)

もし modify and re-sign an IPA が可能であれば、Frida Gadget を埋め込み、Mach-O をパッチして起動時に @rpath 経由でロードさせることができます。これにより jailbreak なしで Frida/Objection を利用可能にします(デバイスは re-signed IPA を受け入れる必要があります)。

実用的なワークフローは、GadgetInjector(Python ツール)を使用して FridaGadget.dylib を注入し、listen-mode の設定を生成することです:

python3 gadget_injector.py MyApp.ipa
# Output: MyApp-frida-listen.ipa

再署名の制約 (important for non-jailbroken installs):

  • all embedded dylibs同じ Team ID で署名すること。
  • FridaGadget.dylib に余分な entitlements を追加しないこと。

IPA を再署名してインストールした後、listen mode でアタッチする:

# (Optional) start the app paused
xcrun devicectl device process launch \
--device <UDID> \
--start-stopped <bundle-id>

# Forward Frida listen port over USB (default 27042)
pymobiledevice3 usbmux forward 27042 27042

# Objection
objection -g <bundle-id> explore

# Or Frida CLI
frida -H 127.0.0.1:27042 -n MyApp

MobSF を使った自動的な動的解析 (no jailbreak)

MobSF は同じ手法(get_task_allow)を使って実機上の dev-signed IPA にインストルメントを行うことができ、ファイルシステムブラウザ、トラフィックキャプチャ、Frida コンソールを備えた web UI を提供します【】。最も手早い方法は MobSF を Docker で実行し、iPhone を USB 経由で接続することです:

docker pull opensecurity/mobile-security-framework-mobsf:latest
docker run -p 8000:8000 --privileged \
-v /var/run/usbmuxd:/var/run/usbmuxd \
opensecurity/mobile-security-framework-mobsf:latest
# Browse to http://127.0.0.1:8000 and upload your resigned IPA

MobSF はバイナリを自動的にデプロイし、アプリのサンドボックス内で Frida server を有効にして、インタラクティブなレポートを生成します。

iOS 17 & Lockdown Mode の注意点

  • Lockdown Mode (Settings → Privacy & Security) は dynamic linker が unsigned または外部署名された dynamic libraries をロードするのをブロックします。これが有効になっている可能性のあるデバイスをテストする場合は、必ず 無効 にしてください。さもないと Frida/objection セッションは即座に終了します。
  • Pointer Authentication (PAC) は A12+ デバイスでシステム全体に適用されます。Frida ≥16 は PAC のストリッピングを透過的に処理します — 新しいメジャーな iOS バージョンが出た際には frida-server と Python/CLI ツールチェーンの両方を最新に保ってください。

References

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする