iOS Pentesting sin Jailbreak

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Idea principal

Las aplicaciones firmadas con el entitlement get_task_allow permiten que aplicaciones de terceros ejecuten una función llamada task_for_pid() con el ID de proceso de la aplicación inicial como argumento para obtener el task port sobre ella (poder controlarla y acceder a su memoria).

Sin embargo, no es tan fácil como simplemente extraer el IPA, re-firmarlo con el entitlement y volver a instalarlo en tu dispositivo. Esto se debe a la protección FairPlay. Cuando la firma de la app cambia, la clave DRM (Digital Rights Management) se invalida y la app no funcionará.

Con un dispositivo antiguo jailbroken, es posible instalar el IPA, descifrarlo usando tu herramienta favorita (como Iridium o frida-ios-dump), y extraerlo del dispositivo. Aunque, si es posible, se recomienda simplemente pedir al cliente el IPA descifrado.

Obtener el IPA descifrado

Get it from Apple

  1. Install the app to pentest in the 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.

Descifrando la app

Para descifrar el IPA vamos a instalarlo. Sin embargo, si tienes un iPhone antiguo jailbroken, potencialmente su versión puede no ser soportada por la aplicación ya que normalmente las apps solo soportan las versiones más recientes.

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

unzip redacted.ipa -d unzipped

Revisa el Info.plist para la versión mínima soportada y, si tu dispositivo es más antiguo que esa, cambia el valor para que sea compatible.

Vuelve a comprimir el IPA:

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

Luego, instala el IPA, por ejemplo, con:

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

Ten en cuenta que podrías necesitar AppSync Unified tweak de Cydia para evitar cualquier error invalid signature.

Una vez instalado, puedes usar Iridium tweak de Cydia para obtener el IPA descifrado.

Parchear entitlements y volver a firmar

Para volver a firmar la aplicación con el entitlement get-task-allow hay varias herramientas disponibles como app-signer, codesign y iResign. app-signer tiene una interfaz muy fácil de usar que permite volver a firmar un archivo IPA de forma muy sencilla indicando el IPA a re-firmar, ponerle get-taks-allow y el certificado y el perfil de aprovisionamiento a utilizar.

Con respecto al certificado y los perfiles de firma, Apple ofrece perfiles de firma de desarrollador gratuitos para todas las cuentas a través de Xcode. Simplemente crea una app y configura uno. Luego, configura que el iPhone confíe en las aplicaciones del desarrollador navegando a SettingsPrivacy & Security, y haz clic en Developer Mode.

Con el IPA re-firmado, es hora de instalarlo en el dispositivo para pentesting:

ideviceinstaller -i resigned.ipa -w

Parcheo de IPA + inyección de DYLIB + volver a firmar con Apple ID gratuito (CLI)

Si ya tienes un decrypted IPA, puedes parchearlo para cargar un DYLIB personalizado, añadir entitlements (p. ej., network), y volver a firmarlo sin Xcode usando un Apple ID gratuito. Esto es útil para la in-app instrumentation en dispositivos no-jailbroken.

Flujo típico:

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

Notas:

  • La firma con Apple ID gratuita suele expirar en 7 días y está limitada a 3 App IDs/semana y 10 sideloaded apps.
  • La herramienta puede volver a firmar cross-platform autenticándose con Apple vía SRP y generando un certificado de dev gratuito + provisioning profile. Los encabezados anisette de Apple se manejan por plataforma (macOS via AOSKit.framework, Linux via Anisette.py, Windows via un anisette server externo).
  • Esto no hace bypass al sandbox. El código inyectado se ejecuta dentro del proceso de la app y solo puede acceder al sandbox de la app y a los keychain access groups.

Acceso solo por USB al injected implant

Si el DYLIB inyectado expone un canal de control TCP local, puedes mantener el tráfico fuera de Wi‑Fi/cellular y reenviarlo por 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 el implant incluye keychain helpers, puedes volcar los elementos accesibles para esa app:

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

Habilitar Developer Mode (iOS 16+)

Desde iOS 16 Apple introdujo Developer Mode: cualquier binario que lleve get_task_allow o esté firmado con un certificado de desarrollo se negará a lanzarse hasta que Developer Mode esté habilitado en el dispositivo. Tampoco podrás adjuntar Frida/LLDB a menos que esta opción esté activada.

  1. Instala o envía cualquier IPA firmada por desarrollador al teléfono.
  2. Navega a Settings → Privacy & Security → Developer Mode y actívalo.
  3. El dispositivo se reiniciará; después de introducir el passcode se te pedirá que Turn On Developer Mode.

Developer Mode permanece activo hasta que lo desactives o borres el teléfono, así que este paso solo necesita realizarse una vez por dispositivo. La Documentación de Apple explica las implicaciones de seguridad.

Opciones modernas de sideloading

Hay ahora varias formas maduras de sideload y mantener IPAs re-firmadas actualizadas sin jailbreak:

ToolRequirementsStrengthsLimitations
AltStore 2 / SideStoremacOS/Windows/Linux 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)

Para pentests rutinarios en versiones actuales de iOS, Alt/Side-Store suelen ser la opción más práctica.

Hooking / dynamic instrumentation

Puedes hookear tu app exactamente como en un dispositivo jailbroken una vez que esté firmada con get_task_allow y Developer Mode esté activado:

# 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

Las versiones recientes de Frida (>=16) manejan automáticamente pointer authentication y otras mitigaciones de iOS 17, por lo que la mayoría de los scripts existentes funcionan de inmediato.

Inyección de Frida Gadget en IPAs sin jailbreak (listen mode)

Si puedes modificar y volver a firmar un IPA, puedes incrustar Frida Gadget y parchear el Mach-O para cargarlo mediante @rpath al inicio. Esto permite usar Frida/Objection sin jailbreak (el dispositivo debe aceptar el IPA re-firmado).

Un flujo de trabajo práctico es usar GadgetInjector (herramienta en Python) para inyectar FridaGadget.dylib y generar una configuración en listen-mode:

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

Restricciones de re-firmado (importante para instalaciones sin jailbreak):

  • Firme todos los dylibs embebidos con el mismo Team ID.
  • No agregue entitlements adicionales a FridaGadget.dylib.

Después de re-firmar e instalar el IPA, adjunte en modo escucha:

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

Análisis dinámico automatizado con MobSF (no jailbreak)

MobSF puede instrumentar un dev-signed IPA en un dispositivo real usando la misma técnica (get_task_allow) y proporciona una interfaz web con explorador del sistema de archivos, captura de tráfico y consola Frida【】. La forma más rápida es ejecutar MobSF en Docker y luego conectar tu iPhone por 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 desplegará automáticamente el binario, habilitará un servidor Frida dentro del sandbox de la app y generará un informe interactivo.

iOS 17 & Lockdown Mode: advertencias

  • Lockdown Mode (Settings → Privacy & Security) bloquea al enlazador dinámico para cargar bibliotecas dinámicas sin firmar o firmadas externamente. Cuando pruebes dispositivos que puedan tener este modo habilitado, asegúrate de que esté desactivado o tus sesiones de Frida/objection terminarán inmediatamente.
  • Pointer Authentication (PAC) se aplica a nivel de sistema en dispositivos A12+. Frida ≥16 maneja de forma transparente el PAC stripping — solo mantén tanto frida-server como la Python/CLI toolchain actualizadas cuando se publique una nueva versión mayor de iOS.

Referencias

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks