iOS Pentesting bez Jailbreak

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Main idea

Aplikacje podpisane z entitlement get_task_allow pozwalają aplikacjom firm trzecich uruchomić funkcję task_for_pid() z identyfikatorem procesu początkowej aplikacji jako argumentem, aby uzyskać nad nią task port (możliwość kontrolowania jej i dostępu do pamięci).

Jednak nie jest tak prosto jak tylko pobrać IPA, podpisać go ponownie z tym entitlement i wgrać z powrotem na urządzenie. Dzieje się tak z powodu ochrony FairPlay. Kiedy podpis aplikacji się zmienia, klucz DRM (Digital Rights Management) jest unieważniany i aplikacja przestaje działać.

Na starym jailbroken urządzeniu możliwe jest zainstalowanie IPA, odszyfrowanie go za pomocą ulubionego narzędzia (takiego jak Iridium lub frida-ios-dump) i skopiowanie go z urządzenia. Jednak jeśli to możliwe, zaleca się po prostu użyć klienta dla odszyfrowanego IPA.

Obtain decrypted IPA

Get it from Apple

  1. Zainstaluj aplikację do pentest na iPhonie
  2. Zainstaluj i uruchom Apple Configurator na swoim macos
  3. Otwórz Terminal na swoim Macu i przejdź (cd) do /Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps. IPA pojawi się w tym folderze później.
  4. Powinieneś zobaczyć swoje urządzenie iOS. Kliknij je dwukrotnie, a następnie kliknij Add + → Apps z górnego paska menu.
  5. Po kliknięciu Add, Configurator pobierze IPA z Apple i spróbuje wypchnąć je na urządzenie. Jeśli wykonałeś moją wcześniejszą rekomendację i już zainstalowałeś IPA, pojawi się monit z prośbą o ponowną instalację aplikacji.
  6. IPA powinno zostać pobrane do /Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps, skąd możesz je pobrać

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

Decrypting the app

Aby odszyfrować IPA musimy je zainstalować. Jednak jeśli masz stare jailbroken iPhone, jego wersja prawdopodobnie nie będzie wspierana przez aplikację, ponieważ zwykle aplikacje wspierają tylko najnowsze wersje.

Aby ją zainstalować, rozpakuj IPA:

unzip redacted.ipa -d unzipped

Sprawdź Info.plist pod kątem minimalnej obsługiwanej wersji i jeśli twoje urządzenie jest starsze, zmień wartość, aby było obsługiwane.

Spakuj ponownie IPA:

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

Następnie zainstaluj IPA, na przykład za pomocą:

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

Zwróć uwagę, że możesz potrzebować AppSync Unified tweak z Cydia, aby zapobiec błędom invalid signature.

Po zainstalowaniu możesz użyć Iridium tweak z Cydia, aby uzyskać odszyfrowany IPA.

Patch entitlements & ponowne podpisanie

Aby ponownie podpisać aplikację z uprawnieniem get-task-allow, dostępnych jest kilka narzędzi, takich jak app-signer, codesign i iResign. app-signer ma bardzo przyjazny interfejs użytkownika, który pozwala bardzo łatwo podpisać ponownie plik IPA, wskazując IPA do ponownego podpisania, ustawić w nim get-taks-allow oraz certyfikat i profil provisioningowy do użycia.

Jeśli chodzi o certyfikaty i profile podpisywania, Apple oferuje free developer signing profiles dla wszystkich kont za pomocą Xcode. Wystarczy utworzyć aplikację i skonfigurować jeden. Następnie skonfiguruj iPhone to trust the developer apps przechodząc do SettingsPrivacy & Security i klikając Developer Mode.

Mając ponownie podpisane IPA, czas zainstalować je na urządzeniu, aby pentestować je:

ideviceinstaller -i resigned.ipa -w

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

Jeśli masz już decrypted IPA, możesz go zmodyfikować, aby załadować niestandardowy DYLIB, dodać entitlements (np. network) i re-signować go bez Xcode przy użyciu darmowego Apple ID. To przydatne do in-app instrumentation na non-jailbroken devices.

Typowy przebieg:

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

Notes:

  • Bezpłatne podpisywanie Apple ID zwykle wygasa po 7 dniach i jest ograniczone do 3 App IDs/week i 10 sideloaded apps.
  • Narzędzie może ponownie podpisać aplikację międzyplatformowo, uwierzytelniając się w Apple za pomocą SRP i generując darmowy certyfikat deweloperski + provisioning profile. Nagłówki Apple’s anisette są obsługiwane per platform (macOS via AOSKit.framework, Linux via Anisette.py, Windows via an external anisette server).
  • To nie omija sandboxu. Wstrzyknięty kod działa wewnątrz procesu aplikacji i może uzyskać dostęp jedynie do sandboxu aplikacji oraz keychain access groups.

USB-only access to the injected implant

If the injected DYLIB exposes a local TCP control channel, you can keep traffic off Wi-Fi/cellular and 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"

Jeśli implant zawiera keychain helpers, możesz zrzucić elementy dostępne dla tej aplikacji:

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

Włącz Developer Mode (iOS 16+)

Od iOS 16 Apple wprowadziło Developer Mode: każdy binarny plik, który zawiera get_task_allow lub jest podpisany certyfikatem deweloperskim, nie uruchomi się, dopóki Developer Mode nie będzie włączony na urządzeniu. Nie będzie też można podłączyć Frida/LLDB, chyba że ta flaga jest włączona.

  1. Zainstaluj lub wgraj na telefon dowolne IPA podpisane przez dewelopera.
  2. Przejdź do Settings → Privacy & Security → Developer Mode i włącz ją.
  3. Urządzenie się zrestartuje; po wpisaniu kodu dostępu zostaniesz poproszony o Turn On Developer Mode.

Developer Mode pozostaje aktywny, dopóki go nie wyłączysz lub nie wyczyścisz telefonu, więc ten krok trzeba wykonać tylko raz na urządzenie. Apple documentation wyjaśnia implikacje bezpieczeństwa.

Nowoczesne opcje sideloading

Istnieje kilka dojrzałych sposobów na sideloading i utrzymanie ponownie podpisanych IPA aktualnymi bez jailbreaka:

NarzędzieWymaganiaZaletyOgraniczenia
AltStore 2 / SideStoremacOS/Windows/Linux companion that re-signs the IPA every 7 days with a free dev profileAutomatyczne przeładowanie przez Wi‑Fi, działa do iOS 17Wymaga komputera w tej samej sieci, limit 3 aplikacji narzucony przez 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)

Do rutynowych pentests na obecnych wersjach iOS Alt/Side-Store zwykle są najbardziej praktycznym wyborem.

Hooking / dynamic instrumentation

Możesz hookować swoją aplikację dokładnie tak jak na jailbroken device, gdy tylko jest podpisana z get_task_allow i Developer Mode jest włączony:

# 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

Najnowsze wydania Frida (>=16) automatycznie obsługują pointer authentication oraz inne mechanizmy łagodzące iOS 17, dzięki czemu większość istniejących skryptów działa bez dodatkowej konfiguracji.

Frida Gadget injection w non-jailbroken IPAs (listen mode)

Jeśli możesz zmodyfikować i ponownie podpisać IPA, możesz osadzić Frida Gadget i załatać Mach-O tak, aby ładował go przez @rpath przy starcie. To umożliwia użycie Frida/Objection bez jailbreaka (urządzenie musi zaakceptować ponownie podpisane IPA).

Praktyczny workflow to użycie GadgetInjector (narzędzie w Pythonie) do wstrzyknięcia FridaGadget.dylib i wygenerowania konfiguracji w trybie listen:

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

Ograniczenia ponownego podpisywania (ważne dla instalacji bez jailbreaka):

  • Podpisz wszystkie wbudowane dylibs tym samym Team ID.
  • Nie dodawaj dodatkowych entitlements do FridaGadget.dylib.

Po ponownym podpisaniu i zainstalowaniu IPA, podłącz w trybie nasłuchiwania:

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

Zautomatyzowana analiza dynamiczna z MobSF (no jailbreak)

MobSF może instrumentować dev-signed IPA na prawdziwym urządzeniu używając tej samej techniki (get_task_allow) i zapewnia interfejs webowy z przeglądarką systemu plików, przechwytywaniem ruchu oraz Frida console【】. Najszybszy sposób to uruchomić MobSF w Dockerze i następnie podłączyć iPhone’a przez 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 automatycznie wdroży binarkę, włączy serwer Frida wewnątrz app sandbox i wygeneruje interaktywny raport.

iOS 17 & Lockdown Mode uwagi

  • Lockdown Mode (Settings → Privacy & Security) blokuje dynamiczny linker przed ładowaniem niepodpisanych lub zewnętrznie podpisanych bibliotek dynamicznych. Podczas testowania urządzeń, które mogą mieć ten tryb włączony, upewnij się, że jest on wyłączony, w przeciwnym razie sesje Frida/objection zakończą się natychmiast.
  • Pointer Authentication (PAC) jest egzekwowane systemowo na urządzeniach A12+. Frida ≥16 przezroczysto radzi sobie z usuwaniem PAC — po prostu utrzymuj zarówno frida-server, jak i toolchain Python/CLI zaktualizowane, gdy ukaże się nowa główna wersja iOS.

References

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks