iOS Pentesting sem Jailbreak

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

Ideia principal

Applications signed with the entitlement get_task_allow permitem que aplicações de terceiros executem uma função chamada task_for_pid() com o ID do processo da aplicação inicial como argumento para obter o task port sobre ela (poder controlá-la e acessar sua memória).

No entanto, não é tão simples quanto apenas extrair o IPA, re-assiná‑lo com o entitlement e colocá‑lo de volta no seu dispositivo. Isso ocorre por causa da proteção FairPlay. Quando a assinatura do app muda, a chave DRM (Digital Rights Management) é invalidada e o app não funciona.

Com um dispositivo antigo jailbroken, é possível instalar o IPA, descriptografá‑lo usando sua ferramenta favorita (como Iridium ou frida-ios-dump) e extraí‑lo do dispositivo. Embora, se possível, seja recomendado simplesmente usar o cliente para o IPA descriptografado.

Obter IPA descriptografado

Get it from Apple

  1. Instale o app a ser testado no iPhone
  2. Instale e abra Apple Configurator no seu macos
  3. Abra Terminal no seu Mac, e cd para /Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps. O IPA aparecerá nessa pasta depois.
  4. Você deverá ver seu dispositivo iOS. Dê um duplo-clique nele, e então clique em Add + → Apps na barra de menu superior.
  5. Após clicar em Add, o Configurator irá baixar o IPA da Apple e tentará enviá‑lo para o seu dispositivo. Se você seguiu minha recomendação anterior e já instalou o IPA, aparecerá um prompt pedindo para reinstalar o app.
  6. O IPA deverá ser baixado dentro de /Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps de onde você pode pegá‑lo

Consulte https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed para informações mais detalhadas sobre esse processo.

Decrypting the app

Para descriptografar o IPA vamos instalá‑lo. Porém, se você tem um iPhone antigo jailbroken, potencialmente sua versão pode não ser suportada pelo aplicativo, já que normalmente os apps suportam apenas as versões mais recentes.

Então, para instalá‑lo, basta descompactar o IPA:

unzip redacted.ipa -d unzipped

Verifique o Info.plist para a versão mínima suportada e, se seu dispositivo for mais antigo do que essa, altere o valor para que seja suportado.

Compacte novamente o IPA:

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

Em seguida, instale o IPA, por exemplo com:

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

Note que você pode precisar do AppSync Unified tweak do Cydia para evitar quaisquer erros de invalid signature.

Depois de instalado, você pode usar o Iridium tweak do Cydia para obter o IPA descriptografado.

Patch entitlements & re-sign

Para re-signar a aplicação com a entitlement get-task-allow existem várias ferramentas disponíveis, como app-signer, codesign e iResign. app-signer possui uma interface muito amigável que permite re-signar muito facilmente um arquivo IPA indicando o IPA a re-sign, colocar get-taks-allow e o certificado e o provisioning profile a serem usados.

Quanto ao certificado e aos perfis de assinatura, a Apple oferece perfis de assinatura de desenvolvedor gratuitos para todas as contas através do Xcode. Basta criar um app e configurar um. Em seguida, configure o iPhone to trust the developer apps navegando em SettingsPrivacy & Security e clicando em Developer Mode.

Com o IPA re-assinado, é hora de instalá-lo no dispositivo para pentesting:

ideviceinstaller -i resigned.ipa -w

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

Se você já tem um decrypted IPA, pode patchá-lo para carregar um DYLIB customizado, adicionar entitlements (e.g., network) e re-signá-lo without Xcode usando um Apple ID gratuito. Isso é útil para in-app instrumentation em dispositivos non-jailbroken.

Fluxo 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:

  • Free Apple ID signing geralmente expira em 7 days e é limitado a 3 App IDs/week e 10 sideloaded apps.
  • A ferramenta pode re-sign cross-platform autenticando-se com Apple via SRP e gerando um free dev certificate + provisioning profile. Apple’s anisette headers são tratados por plataforma (macOS via AOSKit.framework, Linux via Anisette.py, Windows via um external anisette server).
  • Isto does not bypass the sandbox. O injected code runs inside the app process e pode apenas acessar o app’s sandbox e keychain access groups.

USB-only access to the injected implant

Se o injected DYLIB exposes um local TCP control channel, você pode manter o tráfego off Wi-Fi/cellular e forward it over 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 o implant incluir keychain helpers, você pode dumpar itens acessíveis a esse app:

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

Ativar Modo de Desenvolvedor (iOS 16+)

Desde o iOS 16 a Apple introduziu o Modo de Desenvolvedor: qualquer binário que carregue get_task_allow ou esteja assinado com um certificado de desenvolvimento se recusará a iniciar até que o Modo de Desenvolvedor esteja ativado no dispositivo. Você também não poderá anexar Frida/LLDB a menos que essa opção esteja ativada.

  1. Instale ou envie qualquer IPA assinada por desenvolvedor para o telefone.
  2. Navegue para Ajustes → Privacidade & Security → Modo de Desenvolvedor e ative-o.
  3. O dispositivo irá reiniciar; após inserir o passcode você será solicitado a Turn On o Modo de Desenvolvedor.

O Modo de Desenvolvedor permanece ativo até que você o desative ou apague o telefone, então este passo só precisa ser executado uma vez por dispositivo. Apple documentation explains the security implications.

Opções modernas de sideloading

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

ToolRequirementsStrengthsLimitations
AltStore 2 / SideStoreCompanion macOS/Windows/Linux que re-assina a IPA a cada 7 dias com um perfil dev gratuitoRecarregamento automático via Wi-Fi, funciona até iOS 17Requer computador na mesma rede, limite de 3-apps imposto pela Apple
TrollStore 1/2Dispositivo com iOS 14 – 15.4.1 vulnerável ao CoreTrust bugAssinatura permanente (sem limite de 7 dias); não requer computador após instaladoNão suportado no iOS 15.5+ (bug corrigido)

For routine pentests on current iOS versions Alt/Side-Store are usually the most practical choice.

Hooking / instrumentação dinâmica

You can hook your app exactly as on a jailbroken device once it is signed with get_task_allow and o Modo de Desenvolvedor estiver ativado:

# 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

Lançamentos recentes do Frida (>=16) lidam automaticamente com pointer authentication e outras mitigações do iOS 17, então a maioria dos scripts existentes funciona imediatamente.

Injeção do Frida Gadget em IPAs sem jailbreak (listen mode)

Se você pode modificar e re-assinar uma IPA, pode embutir Frida Gadget e patchar o Mach-O para carregá-lo via @rpath na inicialização. Isso habilita Frida/Objection sem jailbreak (o dispositivo precisa aceitar a IPA re-assinada).

Um fluxo de trabalho prático é usar GadgetInjector (ferramenta Python) para injetar FridaGadget.dylib e gerar uma configuração listen-mode:

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

Restrições de re-assinatura (importante para instalações sem jailbreak):

  • Assine todos os embedded dylibs com o mesmo Team ID.
  • Não adicione entitlements extras ao FridaGadget.dylib.

Após reassinar e instalar o IPA, anexe em modo de escuta:

# (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álise dinâmica automatizada com MobSF (sem jailbreak)

MobSF pode instrumentar um dev-signed IPA em um dispositivo real usando a mesma técnica (get_task_allow) e fornece uma interface web com navegador de sistema de arquivos, captura de tráfego e console Frida【】. A maneira mais rápida é executar o MobSF no Docker e então conectar seu 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 implantará automaticamente o binário, ativará um servidor Frida dentro do sandbox do app e gerará um relatório interativo.

iOS 17 & Lockdown Mode — considerações

  • Lockdown Mode (Settings → Privacy & Security) bloqueia o dynamic linker de carregar bibliotecas dinâmicas não assinadas ou assinadas externamente. Ao testar dispositivos que possam ter esse modo habilitado, certifique-se de que ele esteja desativado ou suas sessões Frida/objection terminarão imediatamente.
  • Pointer Authentication (PAC) é aplicada em todo o sistema em dispositivos A12+. Frida ≥16 lida com PAC stripping de forma transparente — apenas mantenha tanto frida-server quanto a toolchain Python/CLI atualizadas quando uma nova versão principal do iOS for lançada.

Referências

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks