iOS Pentesting senza Jailbreak

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Idea principale

Le applicazioni firmate con l’entitlement get_task_allow permettono ad applicazioni di terze parti di eseguire una funzione chiamata task_for_pid() passando l’ID di processo dell’applicazione iniziale come argomento, in modo da ottenere il task port su di essa (ossia poterla controllare e accedere alla sua memoria).

Tuttavia, non è così semplice come estrarre l’IPA, rifirmarla con l’entitlement e reinstallarla sul dispositivo. Questo è dovuto alla protezione FairPlay. Quando la firma dell’app cambia, la chiave DRM (Digital Rights Management) viene invalidata e l’app non funziona più.

Con un vecchio dispositivo jailbroken è possibile installare l’IPA, decriptarla usando il tuo strumento preferito (come Iridium o frida-ios-dump) e prelevarla dal dispositivo. Tuttavia, se possibile, è consigliato usare direttamente il client per l’IPA decriptata.

Ottenere l’IPA decriptata

Ottenerla da Apple

  1. Installa l’app da pentest sull’iPhone
  2. Installa e avvia Apple Configurator nel tuo macos
  3. Apri Terminal sul tuo Mac, e fai cd a /Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps. L’IPA apparirà in questa cartella più tardi.
  4. Dovresti vedere il tuo dispositivo iOS. Fai doppio clic su di esso, e poi clicca Add + → Apps dalla barra dei menu in alto.
  5. Dopo aver cliccato Add, Configurator scaricherà l’IPA da Apple e tenterà di inviarla al dispositivo. Se hai seguito la mia raccomandazione precedente e hai già installato l’IPA, apparirà una richiesta per reinstallare l’app.
  6. L’IPA dovrebbe essere scaricata in /Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps da cui potrai prelevarla

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

Decriptare l’app

Per decriptare l’IPA dobbiamo installarla. Tuttavia, se hai un vecchio iPhone jailbroken, è possibile che la sua versione non sia supportata dall’applicazione, dato che di solito le app supportano solo le versioni più recenti.

Quindi, per installarla, basta decomprimere l’IPA:

unzip redacted.ipa -d unzipped

Controlla l’Info.plist per la versione minima supportata e, se il tuo dispositivo è più vecchio, modifica il valore in modo che sia supportato.

Zippa di nuovo l’IPA:

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

Quindi, installa l’IPA ad esempio con:

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

Nota che potrebbe essere necessario il tweak AppSync Unified da Cydia per prevenire eventuali errori invalid signature.

Una volta installato, puoi usare il tweak Iridium da Cydia per ottenere l’IPA decrittografata.

Patch entitlements & re-sign

Per re-signare l’applicazione con l’entitlement get-task-allow ci sono diversi strumenti disponibili come app-signer, codesign e iResign. app-signer ha un’interfaccia molto user-friendly che permette di re-signare facilmente un file IPA specificando l’IPA da re-signare, di impostare il get-taks-allow e il certificato e il provisioning profile da utilizzare.

Per quanto riguarda il certificato e i provisioning profile, Apple offre free developer signing profiles per tutti gli account tramite Xcode. Basta creare un’app e configurarne uno. Poi, configura l’iPhone to trust the developer apps navigando in SettingsPrivacy & Security, e cliccando su Developer Mode.

Con l’IPA re-signed, è il momento di installarla sul dispositivo per pentestarlo:

ideviceinstaller -i resigned.ipa -w

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

Se hai già una decrypted IPA, puoi patcharla per caricare una DYLIB personalizzata, aggiungere entitlements (es., network) e re-signarla without Xcode usando un Apple ID gratuito. Questo è utile per in-app instrumentation su dispositivi non-jailbroken.

Flusso tipico:

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

Note:

  • La firma con Apple ID gratuito di solito scade in 7 giorni ed è limitata a 3 App IDs/settimana e 10 sideloaded apps.
  • Lo strumento può re-sign cross-platform autenticandosi con Apple via SRP e generando un free dev certificate + provisioning profile. Gli header di Apple anisette sono gestiti per piattaforma (macOS via AOSKit.framework, Linux via Anisette.py, Windows via un anisette server esterno).
  • Questo non bypassa la sandbox. The injected code gira all’interno del processo dell’app e può accedere solo alla sandbox dell’app e ai keychain access groups.

Accesso USB-only to the injected implant

Se l’injected DYLIB espone un canale di controllo TCP locale, puoi mantenere il traffico off Wi-Fi/cellular e inoltrarlo via 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"

Se l’implant include keychain helpers, puoi dump items accessibili a quell’app:

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

Abilitare la Modalità Sviluppatore (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. Installa o invia qualsiasi IPA firmato con certificato di sviluppo sul telefono.
  2. Vai su Impostazioni → Privacy & Security → Modalità Sviluppatore e attivala.
  3. Il dispositivo si riavvierà; dopo aver inserito il passcode ti verrà chiesto di Attivare la Modalità Sviluppatore.

La Modalità Sviluppatore rimane attiva fino a quando non la disabiliti o non resetti il telefono, quindi questo passaggio deve essere eseguito una sola volta per dispositivo. Apple documentation explains the security implications.

Opzioni moderne di sideloading

There are now several mature ways to sideload and keep re-signed IPAs up-to-date without a jailbreak:

ToolRequirementsStrengthsLimitations
AltStore 2 / SideStoremacOS/Windows/Linux app companion that re-signs the IPA every 7 days with a free dev profileAutomatic reload over Wi-Fi, works up to iOS 17Needs computer on the same network, 3-app limit imposed by Apple
TrollStore 1/2Device on iOS 14 – 15.4.1 vulnerable to the CoreTrust bugPermanent signing (no 7-day limit); no computer required once installedNot supported on iOS 15.5+ (bug patched)

Per pentests di routine sulle versioni iOS attuali Alt/Side-Store sono solitamente la scelta più pratica.

Hooking / dynamic instrumentation

You can hook your app exactly as on a jailbroken device once it is signed with get_task_allow and Developer Mode is on:

# 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

Le recenti release di Frida (>=16) gestiscono automaticamente pointer authentication e altre mitigazioni di iOS 17, quindi la maggior parte degli script esistenti funziona immediatamente.

Iniezione di Frida Gadget in non-jailbroken IPAs (listen mode)

Se puoi modificare e rifirmare un IPA, puoi incorporare Frida Gadget e patchare il Mach-O per caricarlo via @rpath all’avvio. Questo abilita Frida/Objection senza jailbreak (il dispositivo deve accettare l’IPA rifirmato).

Un flusso di lavoro pratico è usare GadgetInjector (tool Python) per iniettare FridaGadget.dylib e generare una configurazione in listen-mode:

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

Re-signing constraints (importante per installazioni non-jailbroken):

  • Firma tutti gli embedded dylibs con lo stesso Team ID.
  • Non aggiungere entitlements extra a FridaGadget.dylib.

Dopo il re-signing e l’installazione dell’IPA, esegui l’attach in 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

Analisi dinamica automatizzata con MobSF (senza jailbreak)

MobSF può strumentare un’IPA dev-signed su un dispositivo reale usando la stessa tecnica (get_task_allow) e fornisce un’interfaccia web con browser del filesystem, cattura del traffico e console Frida【】. Il modo più rapido è eseguire MobSF in Docker e poi collegare il tuo iPhone via 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 distribuirà automaticamente il file binario, avvierà un server Frida all’interno del sandbox dell’app e genererà un report interattivo.

iOS 17 & Lockdown Mode — avvertenze

  • Lockdown Mode (Settings → Privacy & Security) impedisce al dynamic linker di caricare librerie dinamiche non firmate o firmate esternamente. Quando testi dispositivi che potrebbero avere questa modalità abilitata, assicurati che sia disabilitata oppure le tue sessioni Frida/objection termineranno immediatamente.
  • Pointer Authentication (PAC) è applicata a livello di sistema sui dispositivi A12+. Frida ≥16 gestisce in modo trasparente il PAC stripping — tieni aggiornati sia frida-server che la toolchain Python/CLI quando viene rilasciata una nuova versione major di iOS.

Riferimenti

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks