iOS Pentesting without Jailbreak
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
Idée principale
Les applications signées avec l’entitlement get_task_allow permettent aux applications tierces d’exécuter une fonction appelée task_for_pid() en passant l’ID de processus de l’application cible en argument afin d’obtenir son task port (pouvoir la contrôler et accéder à sa mémoire).
Cependant, ce n’est pas aussi simple que d’extraire l’IPA, de le re-signer avec l’entitlement et de le flasher de nouveau sur votre appareil. Ceci est dû à la protection FairPlay. Quand la signature de l’application change, la clé DRM (Digital Rights Management) est invalidée et l’application ne fonctionnera plus.
Avec un vieil appareil jailbroken, il est possible d’installer l’IPA, de le déchiffrer en utilisant votre outil préféré (comme Iridium ou frida-ios-dump), et de le récupérer depuis l’appareil. Cependant, si possible, il est recommandé d’utiliser simplement le client pour l’IPA déchiffré.
Obtain decrypted IPA
Get it from Apple
- Installez l’application à pentest sur l’iPhone
- Install and launch Apple Configurator inside your macos
- Open
Terminalon 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. - You should see your iOS device. Double-click on it, and then click Add + → Apps from the top menu bar.
- 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.
- 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.
Déchiffrer l’application
Pour déchiffrer l’IPA, nous allons l’installer. Cependant, si vous avez un vieux jailbroken iPhone, sa version pourrait ne pas être prise en charge par l’application, car les applications prennent généralement en charge uniquement les versions récentes.
Donc, pour l’installer, il suffit de dézipper l’IPA:
unzip redacted.ipa -d unzipped
Vérifiez le Info.plist pour la version minimale prise en charge et si votre appareil est plus ancien que cela, modifiez la valeur pour qu’il soit pris en charge.
Rezippez l’IPA :
cd unzipped
zip -r ../no-min-version.ipa *
Ensuite, installez par exemple l’IPA avec :
ideviceinstaller -i no-min-version.ipa -w
Notez que vous pourriez avoir besoin de AppSync Unified tweak depuis Cydia pour éviter toute erreur invalid signature.
Une fois installé, vous pouvez utiliser Iridium tweak depuis Cydia afin d’obtenir l’IPA déchiffrée.
Patch entitlements & re-sign
Pour re-signer l’application avec l’entitlement get-task-allow, plusieurs outils sont disponibles comme app-signer, codesign, et iResign. app-signer dispose d’une interface très conviviale qui permet de re-signer très facilement un fichier IPA en indiquant l’IPA à re-signer, de mettre le get-taks-allow et le certificat ainsi que le provisioning profile à utiliser.
Concernant le certificat et les signing profiles, Apple offre des free developer signing profiles pour tous les comptes via Xcode. Il suffit de créer une app et d’en configurer une. Ensuite, configurez l’iPhone to trust the developer apps en naviguant dans Settings → Privacy & Security, puis cliquez sur Developer Mode.
Avec l’IPA re-signée, il est temps de l’installer sur l’appareil pour le pentest :
ideviceinstaller -i resigned.ipa -w
IPA patching + DYLIB injection + free Apple ID re-sign (CLI)
Si vous avez déjà une decrypted IPA, vous pouvez la patcher pour charger un DYLIB personnalisé, ajouter des entitlements (e.g., network), et la re-signer without Xcode en utilisant un Apple ID gratuit. Ceci est utile pour l’in-app instrumentation sur des appareils non-jailbroken.
Flux typique :
# 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>
Remarques :
- La signature gratuite d’Apple ID expire généralement au bout de 7 jours et est limitée à 3 App IDs/semaine et 10 sideloaded apps.
- L’outil peut re-signer multiplateforme en s’authentifiant auprès d’Apple via SRP et en générant un certificat dev gratuit + provisioning profile. Les en-têtes anisette d’Apple sont gérés par plateforme (macOS via
AOSKit.framework, Linux via Anisette.py, Windows via an external anisette server). - Ceci ne contourne pas le sandbox. Le code injecté s’exécute dans le processus de l’app et ne peut accéder qu’au sandbox de l’app et aux keychain access groups.
USB-only access to the injected implant
Si le DYLIB injecté expose un canal de contrôle TCP local, vous pouvez garder le trafic hors Wi-Fi/cellulaire et le rediriger sur 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"
Si l’implant inclut des keychain helpers, vous pouvez dump des items accessibles à cette app :
python3 client.py "keychain dump"
python3 client.py "keychain dump --filter self"
python3 client.py "keychain dump --class generic"
Activer Developer Mode (iOS 16+)
Depuis iOS 16, Apple a introduit Developer Mode : tout binaire contenant get_task_allow ou signé avec un certificat de développement refusera de se lancer tant que Developer Mode n’est pas activé sur l’appareil. Vous ne pourrez pas non plus attacher Frida/LLDB à moins que ce flag soit activé.
- Installez ou poussez n’importe quelle IPA signée par un développeur sur le téléphone.
- Allez dans Settings → Privacy & Security → Developer Mode et activez-le.
- L’appareil redémarrera ; après avoir saisi le code, on vous demandera de Turn On Developer Mode.
Developer Mode reste actif jusqu’à ce que vous le désactiviez ou que vous effaciez le téléphone, donc cette étape n’a besoin d’être effectuée qu’une seule fois par appareil. Apple documentation explique les implications en matière de sécurité.
Options modernes de sideloading
Il existe désormais plusieurs méthodes matures pour sideloader et maintenir des IPAs re-signées à jour sans jailbreak :
| Tool | Requirements | Strengths | Limitations |
|---|---|---|---|
| AltStore 2 / SideStore | macOS/Windows/Linux companion that re-signs the IPA every 7 days with a free dev profile | Rechargement automatique via Wi‑Fi, fonctionne jusqu’à iOS 17 | Nécessite un ordinateur sur le même réseau, limite de 3 apps imposée par Apple |
| TrollStore 1/2 | Device on iOS 14 – 15.4.1 vulnerable to the CoreTrust bug | Permanent signing (no 7-day limit); no computer required once installed | Not supported on iOS 15.5+ (bug patched) |
Pour les pentests de routine sur les versions iOS actuelles, Alt/Side-Store sont généralement le choix le plus pratique.
Hooking / dynamic instrumentation
Vous pouvez effectuer du hooking sur votre app exactement comme sur un appareil jailbreaké une fois qu’elle est signée avec get_task_allow et que Developer Mode est activé :
# 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
Les versions récentes de Frida (>=16) gèrent automatiquement l’authentification des pointeurs et autres mitigations d’iOS 17, donc la plupart des scripts existants fonctionnent prêt-à-l’emploi.
Frida Gadget injection in non-jailbroken IPAs (listen mode)
Si vous pouvez modifier et re-signer une IPA, vous pouvez intégrer Frida Gadget et patcher le Mach-O pour le charger via @rpath au démarrage. Cela permet d’utiliser Frida/Objection sans jailbreak (l’appareil doit accepter l’IPA re-signée).
Une méthode pratique consiste à utiliser GadgetInjector (outil Python) pour injecter FridaGadget.dylib et générer une listen-mode configuration:
python3 gadget_injector.py MyApp.ipa
# Output: MyApp-frida-listen.ipa
Contraintes de re-signature (important pour les installations non-jailbreakées):
- Signez tous les embedded dylibs avec le même Team ID.
- Ne ajoutez pas d’entitlements supplémentaires à
FridaGadget.dylib.
Après la re-signature et l’installation de l’IPA, attachez en mode écoute:
# (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
Analyse dynamique automatisée avec MobSF (no jailbreak)
MobSF peut instrumenter une dev-signed IPA sur un appareil réel en utilisant la même technique (get_task_allow) et fournit une web UI avec filesystem browser, traffic capture et Frida console【】. La manière la plus rapide est d’exécuter MobSF dans Docker puis de connecter votre 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 déploiera automatiquement le binaire, démarrera un serveur Frida dans le sandbox de l’application et générera un rapport interactif.
iOS 17 et Lockdown Mode — précautions
- Lockdown Mode (Settings → Privacy & Security) empêche le dynamic linker de charger des bibliothèques dynamiques non signées ou signées par une entité externe. Lors de tests sur des appareils susceptibles d’avoir ce mode activé, assurez-vous qu’il est désactivé sinon vos sessions Frida/objection se termineront immédiatement.
- Pointer Authentication (PAC) est appliquée à l’échelle du système sur les appareils A12+. Frida ≥16 gère de façon transparente le PAC stripping — gardez simplement frida-server et la toolchain Python/CLI à jour lorsqu’une nouvelle version majeure d’iOS est publiée.
Références
- https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed
- Apple developer documentation – Enabling Developer Mode on a device: https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device
- Mobile Security Framework (MobSF): https://mobsf.github.io/Mobile-Security-Framework-MobSF/
- https://github.com/test1ng-guy/iOS-sandbox-explorer
- https://github.com/Saurabh221662/GadgetInjector
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.


