Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
bfinject — Dylib-Injektion für iOS 11.0 - 11.1.2 mit LiberiOS- und Electra-Jailbreaks | Kitploit
Tools/GitHubGitHub/bishopfox/bfinject
Dynamische Analyse (Sandboxing)iOS-SicherheitExploitationMobile App-PenetrationstestsPenetrationstestsBinäranalyse
GitHubbishopfox/bfinject

bfinject

Dylib-Injektion für iOS 11.0 - 11.1.2 mit LiberiOS- und Electra-Jailbreaks

Repository anzeigen
641150vor 4 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

bfinject

Einfache Dylib-Injektion für gejailbreakte 64-Bit-iOS-11.0–11.1.2-Geräte. Kompatibel mit den Electra- und LiberiOS-Jailbreaks.

bfinject lädt beliebige Dylibs in laufende App-Store-Apps. Es verfügt über integrierte Unterstützung zum Entschlüsseln von App-Store-Apps und wird mit iSpy und Cycript gebündelt.

bfinject ist ein Wrapper, der dafür sorgt, dass deine Dylibs vor der Injektion mit bfinject4realz korrekt codesigniert werden. Es ist vollständig eigenständig und benötigt weder jailbreakd, QiLin noch Ähnliches. Es funktioniert einfach.

Hinweis: bfinject funktioniert unter Electra nicht, wenn „Tweaks“ aktiviert ist. Starte das Gerät neu und führe Electra ohne Tweaks erneut aus, um bfinject verwenden zu können. Wenn du Fehler mit „thread_create“ siehst, ist das das Problem.

Hinweis: bfdecrypt ist als eigenständiges Dylib hier verfügbar: https://github.com/BishopFox/bfdecrypt/

Navigation

  • Electra-Einrichtung
  • LiberiOS-Einrichtung
  • Verwendung von bfinject
  • Testen von bfinject
  • Entschlüsseln von App-Store-Apps
  • Cycript
  • Wie funktioniert es?
  • Bekannte Probleme
  • Danksagungen

Electra-Einrichtung

  • Jailbreake dein iOS-11.0–11.1.2-Gerät mit Electra >= b7
  • Kopiere das bfinject-Tarball, https://github.com/BishopFox/bfinject/raw/master/bfinject.tar, auf dein gejailbreaktes Gerät. Möglicherweise musst du es zuerst auf deinen Laptop kopieren, da GitHub SSL erzwingt, die Electra-Version von wget jedoch kein SSL unterstützt.
root@kitploit:~
ssh root@your-device-ip # (the password is 'alpine')
mkdir bfinject
cd bfinject
wget http://<your_server>/bfinject.tar
tar xvf bfinject.tar

LiberiOS-Einrichtung

  • Jailbreake dein iOS-11.0–11.1.2-Gerät mit LiberiOS >= 11.0.3
  • Kopiere das bfinject-Tarball, https://github.com/BishopFox/bfinject/raw/master/bfinject.tar, auf dein gejailbreaktes Gerät. Möglicherweise musst du es zuerst auf deinen Laptop kopieren, da GitHub SSL erzwingt, die LiberiOS-Version von wget jedoch kein SSL unterstützt.
root@kitploit:~
ssh root@your-device-ip # (the password is 'alpine')
export PATH=$PATH:/jb/usr/bin:/jb/bin:/jb/sbin:/jb/usr/sbin:/jb/usr/local/bin:
cd /jb
mkdir bfinject
cd bfinject
wget http://<your_server>/bfinject.tar
tar xvf bfinject.tar

Verwendung von bfinject

  • Starte die Ziel-App, in die du deine Shared Library injizieren wirst
  • Gib bash bfinject ein, um Hilfe zu erhalten
  • HINWEIS: Es ist wichtig, dem Befehl bash voranzustellen, sonst funktioniert es nicht. Sandbox, yadda yadda.
root@kitploit:~
-bash-3.2# bash bfinject
Syntax: bfinject [-p PID | -P appname] [-l /path/to/yourdylib | -L feature]

For example:
   bfinject -P Reddit.app -l /path/to/evil.dylib   # Injects evil.dylib into the Reddit app
     or
   bfinject -p 1234 -L cycript                     # Inject Cycript into PID
     or
   bfinject -p 4566 -l /path/to/evil.dylib         # Injects the .dylib of your choice into PID

Anstatt die PID mit -p anzugeben, kann bfinject die korrekte PID anhand des App-Namens suchen. Gib einfach „-P identifier“ ein, wobei „identifier“ eine Zeichenfolge ist, die für deine App eindeutig ist, z. B. „fing.app“.

Verfügbare Funktionen: cycript - Cycript injizieren und ausführen decrypt - Eine entschlüsselte Kopie der Ziel-App erstellen test - Ein einfaches .dylib injizieren, um einen Eintrag im Konsolenprotokoll zu erzeugen ispy - iSpy injizieren. Öffne http://<DEVICE_IP>:31337/

Ein einfacher Test

Bevor du etwas Komplexeres unternimmst, teste, ob es funktioniert. bfinject verfügt über integrierte Selbsttests. Hier ist ein Beispiel mit der Reddit-App als Ziel:

root@kitploit:~
Cs-iPhone:~ root# bash bfinject -P Reddit -L test
[+] Electra detected.
[+] Injecting into '/var/containers/Bundle/Application/55C94FAA-A282-4FDC-967D-6A012D01087E/Reddit.app/Reddit'
[+] Getting Team ID from target application...
[+] Thinning dylib into non-fat arm64 image
[+] Signing injectable .dylib with Team ID 2TDUX39LX8 and platform entitlements...
[bfinject4realz] Calling task_for_pid() for PID 486.
[bfinject4realz] Calling thread_create() on PID 486
[bfinject4realz] Looking for ROP gadget... found at 0x1019a2ba0
[bfinject4realz] Fake stack frame at 0x12ac5c000
[bfinject4realz] Calling _pthread_set_self() at 0x182bfb814...
[bfinject4realz] Returned from '_pthread_set_self'
[bfinject4realz] Calling dlopen() at 0x1829bb460...
[bfinject4realz] Returned from 'dlopen'
[bfinject4realz] Success! Library was loaded at 0x1c016e1c0
[+] So long and thanks for all the fish.

Auf dem Gerätebildschirm solltest du Folgendes sehen:

Wenn nicht, ist etwas defekt ;)

Entschlüsseln von App-Store-Apps

Hier ist ein Beispiel zum Entschlüsseln der Reddit-App auf einem mit Electra gejailbreakten iPhone:

root@kitploit:~
Cs-iPhone:~ root# bash bfinject -P Reddit -L decrypt
[+] Electra detected.
[+] Injecting into '/var/containers/Bundle/Application/BCEBDD64-6738-45CE-9B3C-C6F933EA0793/Reddit.app/Reddit'
[+] Getting Team ID from target application...
[+] Thinning dylib into non-fat arm64 image
[+] Signing injectable .dylib with Team ID 2TDUX39LX8 and platform entitlements...
[bfinject4realz] Calling task_for_pid() for PID 3218.
[bfinject4realz] Calling thread_create() on PID 3218
[bfinject4realz] Looking for ROP gadget... found at 0x1016a5110
[bfinject4realz] Fake stack frame at 0x10a06c000
[bfinject4realz] Calling _pthread_set_self() at 0x181303814...
[bfinject4realz] Returned from '_pthread_set_self'
[bfinject4realz] Calling dlopen() at 0x1810c3460...
[bfinject4realz] Returned from 'dlopen'
[bfinject4realz] Success! Library was loaded at 0x1c03e1100
[+] So long and thanks for all the fish.

Du siehst diesen Bildschirm auf deinem Gerät:

Sobald der Vorgang abgeschlossen ist, wird eine UI-Warnung angezeigt, die fragt, ob du einen Dienst starten möchtest, von dem aus du dein entschlüsseltes IPA herunterladen kannst:

Wenn du auf Yes tippst, wird ein Dienst auf Port 31336 deines Geräts gestartet. Verbinde dich damit und du erhältst eine rohe Kopie des IPA, die wie folgt mit netcat heruntergeladen werden kann:

root@kitploit:~
carl@calisto-3 /tmp $ nc 192.168.1.33 31336 > decrypted.ipa
carl@calisto-3 /tmp $ ls -l decrypted.ipa
-rw-r--r--  1 carl  wheel  14649063 Jan 25 16:57 decrypted.ipa
carl@calisto-3 /tmp $ file decrypted.ipa
decrypted.ipa: iOS App Zip archive data, at least v2.0 to extract

Alternativ kannst du das Konsolenprotokoll des Geräts prüfen; es zeigt dir, wo das entschlüsselte IPA gespeichert ist. Zum Beispiel:

root@kitploit:~
[dumpdecrypted] Wrote /var/mobile/Containers/Data/Application/6E6A5887-8B58-4FC5-A2F3-7870EDB5E8D1/Documents/decrypted-app.ipa

Du kannst das Dateisystem auch wie folgt nach dem IPA durchsuchen:

root@kitploit:~
find /var/mobile/Containers/Data/Application/ -name decrypted-app.ipa

Das Übertragen der .ipa vom Gerät kann mit netcat erfolgen. Richte auf deinem Laptop einen Listener-Dienst ein:

root@kitploit:~
ncat -l 0.0.0.0 12345 > decrypted.ipa

Und auf dem gejailbreakten Gerät:

root@kitploit:~
cat /path/to/decrypted.ipa > /dev/tcp/<IP_OF_YOUR_COMPUTER>/12345

Die .ipa wird ein Klon der ursprünglichen .ipa aus dem App Store sein, mit der Ausnahme, dass die Hauptbinary und alle zugehörigen Frameworks und Shared Libraries entschlüsselt werden. Das CRYPTID-Flag wird in jeder zuvor verschlüsselten Datei 0 sein. Du kannst die .ipa nehmen, die App extrahieren, sie nach Bedarf modifizieren, sie mit deinem eigenen Entwicklerzertifikat neu signieren und sie bei Bedarf auf nicht gejailbreakte Geräte ausrollen.

Cycript

Eine der Funktionen von bfinject ist die Integration gängiger Pentesting-Tools wie Cycript. Weitere werden mit der Zeit hinzugefügt. Um Cycript zu verwenden, muss der Cycript-Befehlszeilenclient auf deinem MacBook installiert sein (http://www.cycript.org/). Sobald bfinject auf deinem Testgerät installiert ist, führe dann etwas wie dieses Beispiel aus, in dem wir Cycript in die Reddit-App injizieren:

root@kitploit:~
Cs-iPhone:~ root# bash bfinject -P Reddit -L cycript
[+] Electra detected.
[+] Injecting into '/var/containers/Bundle/Application/55C94FAA-A282-4FDC-967D-6A012D01087E/Reddit.app/Reddit'
[+] Getting Team ID from target application...
[+] Thinning dylib into non-fat arm64 image
[+] Signing injectable .dylib with Team ID 2TDUX39LX8 and platform entitlements...
[bfinject4realz] Calling task_for_pid() for PID 486.
[bfinject4realz] Calling thread_create() on PID 486
[bfinject4realz] Looking for ROP gadget... found at 0x1019a2ba0
[bfinject4realz] Fake stack frame at 0x10ab00000
[bfinject4realz] Calling _pthread_set_self() at 0x182bfb814...
[bfinject4realz] Returned from '_pthread_set_self'
[bfinject4realz] Calling dlopen() at 0x1829bb460...
[bfinject4realz] Returned from 'dlopen'
[bfinject4realz] Success! Library was loaded at 0x1c01786c0
[+] Injecting into '/var/containers/Bundle/Application/55C94FAA-A282-4FDC-967D-6A012D01087E/Reddit.app/Reddit'
[+] Getting Team ID from target application...
[+] Thinning dylib into non-fat arm64 image
[+] Signing injectable .dylib with Team ID 2TDUX39LX8 and platform entitlements...
[bfinject4realz] Calling task_for_pid() for PID 486.
[bfinject4realz] Calling thread_create() on PID 486
[bfinject4realz] Looking for ROP gadget... found at 0x1019a2ba0
[bfinject4realz] Fake stack frame at 0x10ab00000
[bfinject4realz] Calling _pthread_set_self() at 0x182bfb814...
[bfinject4realz] Returned from '_pthread_set_self'
[bfinject4realz] Calling dlopen() at 0x1829bb460...
[bfinject4realz] Returned from 'dlopen'
[bfinject4realz] Success! Library was loaded at 0x1c4179680
[+] So long and thanks for all the fish.

Sobald Cycript injiziert wurde, siehst du die folgende Meldung auf deinem Gerät:

Du kannst dich wie folgt von deinem MacBook mit Cycript verbinden (vorausgesetzt, du hast Cycript in ~/bin/ installiert):

root@kitploit:~
carl@calisto-3 /tmp $ ~/bin/cycript -r 192.168.1.33:1337
cy# UIApp
#"<RedditApplication: 0x102304a30>"
cy#

Wie funktioniert es?

Auf hoher Ebene lädt bfinject4realz ein selbstsigniertes .dylib in eine laufende, von Apple signierte App-Store-App.

Der Vorgang erfolgt in zwei Phasen.

1. Das zu injizierende Dylib signieren

Codesigning-Prüfungen unter iOS umfassen Userspace-Dienste (amfid) und Kernel-Dienste (AppleMobileFileIntegrity). Sowohl LiberiOS als auch Electra patchen den Userspace-Prozess amfid, um Codesigning-Prüfungen zu umgehen, aber es gibt immer noch weitere Prüfungen, die vom Kernel durchgeführt werden.

Electra und LiberiOS sind jedoch KPPless, was bedeutet, dass sie nichts im Kernel patchen; kein einziges Byte. Dies liegt an Kernel Patch Protection („KPP“), einer Apple-Sicherheitstechnologie, die anspruchsvolle Kernel-Introspection durchführt, um Kernel-Patches zu erkennen und zu vereiteln. Infolgedessen sind die Kernel-Codesigning-Prüfungen weiterhin intakt.

Zum Glück für uns scheint der Kernel anzunehmen, dass amfid die Gültigkeit der kryptografischen Signatur, die an den Entitlements eines Dylibs hängt, bereits geprüft hat. Daher müssen wir nur zwei Entitlements in ein Dylib selbst signieren, damit der Kernel es akzeptiert:

  • Das erste ist das platform-application-Entitlement, das meines Wissens angibt, dass es sich bei dem Dylib um Apple-Software handelt.
  • Das zweite ist die Team-ID des Signierzertifikats, mit dem der Code signiert wurde, in den wir injizieren. Zum Beispiel ist die Reddit-App mit der Team-ID 2TDUX39LX8 signiert. Um ein Dylib in die Reddit-App zu injizieren, müssen wir das Dylib daher mit derselben Team-ID signieren: 2TDUX39LX8.

bfinject kümmert sich um den gesamten Signier-Kram für dich, was ganz praktisch ist.

2. Das korrekt signierte Dylib in den Zielprozess injizieren

  • Verwende task_for_pid(), um einen Mach-Port für den Zielprozess zu erhalten
  • Verwende den Port, um Threads und nicht ausführbare Speichersegmente im Zielprozess zu manipulieren
    • Hinweis: Ohne Kernel-Patches ist es nicht möglich, ausführbaren Code in einem Prozess zu modifizieren.
    • Daher müssen wir ROP-Tricks einsetzen, um Code unserer Wahl auszuführen.
  • Alloziere einige Speicherseiten im entfernten Prozess für einen neuen temporären Stack
  • Platziere die Zeichenfolge „/path/to/my.dylib“ an bekannter Stelle im Stack
  • Verwende einige Tricks, um die Adresse von dlopen() im entfernten Prozess zu ermitteln
  • Finde ein einfaches RET-ROP-Gadget in einer ausführbaren Seite (RET = "\xc0\x03\x5f\xd6" auf arm64)
  • Erstelle einen neuen Thread im Zielprozess
  • Setze die CPU-Register für den Thread:
    • $pc = Adresse von dlopen()
    • $x0 = Parameter 1 von dlopen: Adresse der Zeichenfolge „/path/to/dylib“ im temporären Stack
    • $x1 = Parameter 2 von dlopen: der Wert RTLD_LAZY | RTLD_GLOBAL
    • $sp = Mitte des temporären Stacks
    • $fp = Ein Viertel hinein in den temporären Stack
    • $lr = Adresse des ROP-Gadgets
  • Setze den Thread fort. Folgendes wird passieren:
    • _pthread_set_self wird aufgerufen, um das Threading für dlopen() einzurichten
    • dlopen() wird aufgerufen, um unsere bösartige Shared Library zu injizieren
    • dlopen() wird ein RET auf den Wert im $lr-Register ausführen, bei dem es sich um eine weitere RET-Anweisung handelt
    • RET wird zu RET zurückkehren, das zu RET zurückkehrt ... ad infinitum
  • Frage die Register des Threads ab, um zu prüfen, ob $pc == Adresse des ROP-Gadgets (der RET-Anweisung) ist
  • Sobald das Gadget erreicht wurde, beende den Thread, gib den Speicher frei, fertig.

Für eine Low-Level-Beschreibung siehe den Quellcode.

Bekannte Probleme

Beachte, dass unter Electra die Version von jtool (dem Codesigning-Multitool von @morpheus) keine Platform-Binary-Entitlements unterstützt. Daher liefert bfinject jtool von LiberiOS mit und verwendet stattdessen dieses. bfinject verwendet nicht Electras inject_criticald.

Danksagungen

  • Stefan Esser (10n1c) für die ursprünglichen Ideen und den Code hinter dumpdecrypted (https://github.com/stefanesser/dumpdecrypted/blob/master/dumpdecrypted.c)
  • Dmitry Rodionov für lorgnette (https://github.com/rodionovd/liblorgnette/)
  • Jonathan Levin für den LiberiOS-Jailbreak (http://newosxbook.com/liberios/)
  • Ian Beer für den async_wake-Exploit (https://bugs.chromium.org/p/project-zero/issues/detail?id=1417)
  • Apple für ein großartiges mobiles Betriebssystem
Tool herunterladen