iOS Pentesting ohne Jailbreak

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Hauptidee

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).

Es ist jedoch nicht so einfach, einfach das IPA zu ziehen, es mit dem Entitlement neu zu signieren und wieder auf dein Gerät zu flashen. Das liegt am FairPlay-Schutz. Wenn die Signatur der App sich ändert, wird der DRM (Digital Rights Management)-Schlüssel ungültig und die App funktioniert nicht mehr.

Mit einem alten jailbroken Gerät ist es möglich, das IPA zu installieren, es mit deinem bevorzugten Tool zu decrypt (z. B. Iridium oder frida-ios-dump) und anschließend vom Gerät zu holen. Wenn möglich wird jedoch empfohlen, stattdessen den Client für das decrypted IPA zu verwenden.

Beschaffung des decrypted IPA

Get it from Apple

  1. Installiere die App, die du pentesten möchtest, auf dem iPhone
  2. Install and launch Apple Configurator inside your macos
  3. Open Terminal on your Mac, and cd to /Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps. The IPA will appear in this folder later.
  4. You should see your iOS device. Double-click on it, and then click Add + → Apps from the top menu bar.
  5. After clicking Add, Configurator will download the IPA from Apple, and attempt to push it to your device. If you followed my recommendation earlier and installed the IPA already, a prompt asking you to reinstall the app will appear.
  6. The IPA should be downloaded inside /Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileAppsfrom where you can grab it

Check https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed for more detailed information about this process.

Decrypting the app

In order to decrypt the IPA we are going to install it. However, if you have an old jailbroken iPhone, potentailly it’s version is not going to be supported by the application as usually apps only suports latests versions.

So, in order to install it, just unzip the IPA:

unzip redacted.ipa -d unzipped

Überprüfe die Info.plist auf die minimal unterstützte Version; wenn dein Gerät älter ist, ändere den Wert, damit es unterstützt wird.

Zip die IPA zurück:

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

Installiere dann zum Beispiel die IPA mit:

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

Beachte, dass du möglicherweise den AppSync Unified tweak von Cydia benötigst, um invalid signature-Fehler zu verhindern.

Sobald installiert, kannst du den Iridium tweak von Cydia verwenden, um die entschlüsselte IPA zu erhalten.

Entitlements patchen & neu signieren

Um die Anwendung mit dem get-task-allow entitlement neu zu signieren, stehen mehrere Tools zur Verfügung, wie app-signer, codesign und iResign. app-signer hat eine sehr benutzerfreundliche Oberfläche, die es ermöglicht, eine IPA-Datei sehr einfach neu zu signieren, die IPA anzugeben, die neu signiert werden soll, das get-taks-allow zu setzen und das zu verwendende Zertifikat sowie das Provisioning Profile auszuwählen.

Bezüglich des Zertifikats und der Signing-Profile bietet Apple über Xcode kostenlose Entwickler-Signing-Profile für alle Accounts an. Erstelle einfach eine App und konfiguriere eines. Anschließend konfiguriere das iPhone so, dass es den Entwickler-Apps vertraut, indem du zu SettingsPrivacy & Security navigierst und auf Developer Mode klickst.

Mit der neu signierten IPA ist es Zeit, sie auf dem Gerät zu installieren, um es zu pentesten:

ideviceinstaller -i resigned.ipa -w

IPA patching + DYLIB injection + free Apple ID re-sign (CLI)

Wenn Sie bereits eine decrypted IPA haben, können Sie sie patchen, um eine benutzerdefinierte DYLIB zu laden, entitlements (z. B. network) hinzuzufügen und sie ohne Xcode mit einer free Apple ID neu zu signieren. Dies ist nützlich für in-app instrumentation auf non-jailbroken devices.

Typischer Ablauf:

# 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>

Hinweise:

  • Free Apple ID signing läuft normalerweise nach 7 Tagen ab und ist auf 3 App IDs/Woche und 10 sideloaded apps begrenzt.
  • Das Tool kann plattformübergreifend neu signieren, indem es sich bei Apple über SRP authentifiziert und ein kostenloses dev certificate + provisioning profile erzeugt. Apple’s anisette headers werden pro Plattform gehandhabt (macOS via AOSKit.framework, Linux via Anisette.py, Windows via einen externen anisette server).
  • Dies umgeht nicht die Sandbox. Der injizierte Code läuft innerhalb des App-Prozesses und kann nur auf die Sandbox der App und die keychain access groups zugreifen.

Nur USB-Zugriff auf das injizierte Implantat

Wenn die injizierte DYLIB einen lokalen TCP-Control-Kanal bereitstellt, kannst du den Traffic off Wi-Fi/cellular halten und ihn über USB weiterleiten:

# 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"

Wenn das implant keychain helpers enthält, kannst du Items dumpen, die für diese App zugänglich sind:

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

Developer Mode aktivieren (iOS 16+)

Seit iOS 16 hat Apple den Developer Mode eingeführt: jede Binary, die get_task_allow enthält oder mit einem Development-Zertifikat signiert ist, weigert sich zu starten, bis Developer Mode auf dem Gerät aktiviert ist. Du kannst außerdem Frida/LLDB nicht anhängen, solange dieses Flag nicht gesetzt ist.

  1. Installiere oder pushe irgendeine mit einem Development-Zertifikat signierte IPA auf das Telefon.
  2. Gehe zu Settings → Privacy & Security → Developer Mode und schalte es ein.
  3. Das Gerät wird neu starten; nach Eingabe des Passcodes wirst du aufgefordert, Turn On Developer Mode.

Developer Mode bleibt aktiv, bis du ihn deaktivierst oder das Telefon löschst, daher muss dieser Schritt pro Gerät nur einmal durchgeführt werden. Apple documentation erklärt die Sicherheitsimplikationen.

Moderne sideloading-Optionen

Es gibt inzwischen mehrere ausgereifte Möglichkeiten, re-signierte IPAs ohne Jailbreak zu sideloaden und aktuell zu halten:

ToolVoraussetzungenStärkenEinschränkungen
AltStore 2 / SideStoremacOS/Windows/Linux Begleitprogramm, das das IPA alle 7 Tage mit einem kostenlosen dev-Profil neu signiertAutomatisches Nachladen über Wi‑Fi, funktioniert bis iOS 17Benötigt einen Computer im selben Netzwerk, von Apple auferlegte 3‑App-Beschränkung
TrollStore 1/2Gerät mit iOS 14 – 15.4.1, verwundbar gegenüber dem CoreTrust-BugPermanente Signierung (keine 7‑Tage‑Begrenzung); kein Computer erforderlich, sobald installiertNicht unterstützt auf iOS 15.5+ (Fehler behoben)

Für routinemäßige pentests auf aktuellen iOS-Versionen sind Alt/Side-Store in der Regel die praktischste Wahl.

Hooking / dynamic instrumentation

Du kannst deine App genau wie auf einem jailbroken device hooken, sobald sie mit get_task_allow signiert ist und Developer Mode aktiviert ist:

# 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

Neuere Frida-Releases (>=16) behandeln automatisch pointer authentication und andere iOS 17 mitigations, sodass die meisten vorhandenen Skripte sofort funktionieren.

Frida Gadget-Injektion in nicht-gejailbreakten IPAs (listen mode)

Wenn du eine IPA modifizieren und neu signieren kannst, kannst du Frida Gadget einbetten und das Mach-O patchen, damit es beim Start über @rpath geladen wird. Das ermöglicht Frida/Objection ohne jailbreak (das Gerät muss die neu signierte IPA akzeptieren).

Ein praktischer Workflow besteht darin, GadgetInjector (Python-Tool) zu verwenden, um FridaGadget.dylib zu injizieren und eine listen-mode configuration zu erzeugen:

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

Einschränkungen beim Neu-Signieren (wichtig für nicht-jailbroken Installationen):

  • Signiere all embedded dylibs mit der gleichen Team ID.
  • Füge keine zusätzlichen entitlements zu FridaGadget.dylib hinzu.

Nach dem Neu-Signieren und der Installation der IPA, verbinde im 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

Automatisierte dynamische Analyse mit MobSF (no jailbreak)

MobSF kann ein dev-signed IPA auf einem echten Gerät instrumentieren, verwendet dabei die gleiche Technik (get_task_allow) und stellt eine Web-UI mit Dateisystem-Browser, Traffic-Capture und Frida-Konsole bereit【】. Der schnellste Weg ist, MobSF in Docker zu starten und dann dein iPhone per USB anzuschließen:

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 wird die Binärdatei automatisch bereitstellen, einen Frida-Server innerhalb der App-Sandbox aktivieren und einen interaktiven Bericht erstellen.

iOS 17 & Lockdown Mode Hinweise

  • Lockdown Mode (Settings → Privacy & Security) verhindert, dass der dynamic linker unsigned oder externally signed dynamische Bibliotheken lädt. Wenn Sie Geräte testen, bei denen dieser Modus aktiviert sein könnte, stellen Sie sicher, dass er deaktiviert ist, sonst werden Ihre Frida/objection-Sitzungen sofort beendet.
  • Pointer Authentication (PAC) wird systemweit auf A12+-Geräten durchgesetzt. Frida ≥16 handhabt PAC-Stripping transparent — halten Sie einfach sowohl frida-server als auch die Python/CLI toolchain aktuell, wenn eine neue große iOS-Version erscheint.

Referenzen

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks