Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
bfinject — Dylib injection per iOS 11.0 - 11.1.2 con i jailbreak LiberiOS ed Electra | Kitploit
Strumenti/GitHubGitHub/bishopfox/bfinject
Analisi Dinamica (Sandboxing)Sicurezza iOSExploitPentesting di App MobiliPenetration TestingAnalisi di Binari
GitHubbishopfox/bfinject

bfinject

Dylib injection per iOS 11.0 - 11.1.2 con i jailbreak LiberiOS ed Electra

Vedi Repository
6411504 anni faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

bfinject

Iniezione semplice di dylib per iOS 64-bit jailbroken 11.0 - 11.1.2. Compatibile con i jailbreak Electra e LiberiOS.

bfinject carica dylib arbitrari in app App Store in esecuzione. Include il supporto integrato per la decrittazione delle app App Store e include iSpy e Cycript.

bfinject è un wrapper che si occupa di firmare correttamente i tuoi dylib prima di iniettarli usando bfinject4realz. È completamente autonomo, non richiede jailbreakd, QiLin o niente del genere. Funziona e basta.

Nota: bfinject non funziona su Electra se "Tweaks" è abilitato. Riavvia e riesegui Electra senza tweaks per usare bfinject. Se vedi errori con "thread_create", questo è il problema.

Nota: bfdecrypt è disponibile come dylib autonomo qui: https://github.com/BishopFox/bfdecrypt/

Navigazione

  • Configurazione di Electra
  • Configurazione di LiberiOS
  • Uso di bfinject
  • Un semplice test
  • Decrittazione delle app dell'App Store
  • Cycript
  • Come funziona?
  • Problemi noti
  • Crediti

Configurazione di Electra

  • Esegui il jailbreak del tuo dispositivo iOS 11.0 - 11.1.2 con Electra >= b7
  • Copia il tarball di bfinject, https://github.com/BishopFox/bfinject/raw/master/bfinject.tar, sul tuo dispositivo con jailbreak. Potresti doverlo copiare prima sul tuo computer perché Github impone SSL, ma la versione di wget di Electra non supporta SSL.
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

Configurazione di LiberiOS

  • Esegui il jailbreak del tuo dispositivo iOS 11.0 - 11.1.2 con LiberiOS >= 11.0.3
  • Copia il tarball di bfinject, https://github.com/BishopFox/bfinject/raw/master/bfinject.tar, sul tuo dispositivo con jailbreak. Potresti doverlo copiare prima sul tuo computer perché Github impone SSL, ma la versione di wget di LiberiOS non supporta SSL.
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

Uso di bfinject

  • Avvia l'app di destinazione nella quale inietterai la tua libreria condivisa
  • Digita bash bfinject per l'aiuto
  • NOTA: è importante far precedere il comando da bash o non funzionerà. Sandbox, eccetera eccetera.
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

Instead of specifying the PID with -p, bfinject can search for the correct PID based on the app name.
Just enter "-P identifier" where "identifier" is a string unique to your app, e.g. "fing.app".

Available features:
  cycript    - Inject and run Cycript
  decrypt    - Create a decrypted copy of the target app
  test       - Inject a simple .dylib to make an entry in the console log
  ispy       - Inject iSpy. Browse to http://<DEVICE_IP>:31337/

Un semplice test

Prima di fare qualsiasi cosa più complessa, verifica che funzioni. bfinject ha test automatici integrati. Ecco un esempio usando l'app Reddit come destinazione:

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.

Sullo schermo del dispositivo dovresti vedere questo:

In caso contrario, qualcosa è rotto ;)

Decrittazione delle app dell'App Store

Ecco un esempio di decrittazione dell'app Reddit su un iPhone con jailbreak Electra:

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.

Vedrai questa schermata sul tuo dispositivo:

Una volta completato, ti verrà mostrato un avviso UI che ti chiederà se vuoi avviare un servizio dal quale scaricare l'IPA decrittato:

Se tocchi Yes, verrà avviato un servizio sulla porta 31336 del tuo dispositivo. Collegati ad esso e riceverai una copia grezza dell'IPA, che può essere scaricata con netcat in questo modo:

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

In alternativa, controlla il registro di console del dispositivo: ti dirà dove è archiviato l'IPA decrittato. Per esempio:

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

Puoi anche cercare l'IPA nel filesystem in questo modo:

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

Per estrarre il file .ipa dal dispositivo puoi usare netcat. Sul tuo laptop, imposta un servizio in ascolto:

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

E sul dispositivo con jailbreak:

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

L'IPA sarà un clone dell'IPA originale dell'App Store, con l'unica differenza che il binario principale e tutti i framework e le librerie condivise associati saranno decrittati. Il flag CRYPTID sarà 0 in ogni file precedentemente cifrato. Puoi prendere l'IPA, estrarre l'app, modificarla come necessario, ri-firmarla con il tuo certificato sviluppatore e distribuirla su dispositivi senza jailbreak secondo necessità.

Cycript

Una delle funzionalità di bfinject è integrare strumenti comuni di pentesting, come Cycript. Altri verranno aggiunti nel tempo. Per usare Cycript avrai bisogno del client a riga di comando di Cycript installato sul tuo MacBook (http://www.cycript.org/). Poi, una volta installato bfinject sul tuo dispositivo di test, fai qualcosa come questo esempio, in cui iniettiamo Cycript nell'app Reddit:

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.

Una volta iniettato Cycript, vedrai il seguente messaggio sul tuo dispositivo:

Puoi connetterti a Cycript dal tuo MacBook in questo modo (supponendo che tu abbia installato Cycript in ~/bin/):

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

Come funziona?

Ad alto livello, bfinject4realz effettua il side-load di un .dylib auto-firmato in un'app App Store in esecuzione firmata da Apple.

Il processo viene eseguito in due fasi.

1. Firmare il dylib da iniettare

I controlli della firma del codice su iOS comprendono servizi nello spazio utente (amfid) e servizi nel kernel (AppleMobileFileIntegrity). Sia LiberiOS che Electra patchano il processo amfid nello spazio utente per bypassare i controlli della firma del codice, ma ci sono ancora ulteriori controlli eseguiti dal kernel.

Tuttavia, Electra e LiberiOS sono KPPless, il che significa che non patchano nulla nel kernel; nemmeno un singolo byte. Questo è dovuto alla Kernel Patch Protection ("KPP"), una tecnologia di sicurezza Apple che esegue una sofisticata introspezione del kernel per rilevare e contrastare le patch al kernel. Di conseguenza, i controlli del kernel sulla firma del codice sono ancora intatti.

Fortunatamente per noi, sembra che il kernel assuma che amfid abbia già verificato la validità della firma crittografica associata alle entitlement di un dylib. Di conseguenza, tutto ciò che dobbiamo fare è auto-firmare due entitlement in un dylib se vogliamo che il kernel lo accetti:

  • La prima è l'entitlement platform-application, che credo indichi che il dylib è software Apple.
  • La seconda è il Team ID del certificato di firma utilizzato per firmare il codice nel quale stiamo iniettando. Per esempio, l'app Reddit è firmata con il Team ID 2TDUX39LX8. Di conseguenza, per iniettare un dylib nell'app Reddit dobbiamo firmare il dylib con lo stesso Team ID: 2TDUX39LX8.

bfinject si occupa di tutte le manovre relative alla firma per te, il che è comodo.

2. Iniettare il dylib correttamente firmato nel processo di destinazione

  • Usando task_for_pid(), ottieni una porta mach per il processo di destinazione
  • Usa la porta per manipolare i thread e i segmenti di memoria non eseguibili nel processo di destinazione
    • Nota: senza patch al kernel, non è possibile modificare codice eseguibile in un processo.
    • Di conseguenza, dobbiamo usare trucchi ROP per eseguire il codice che scegliamo.
  • Alloca alcune pagine di memoria nel processo remoto per un nuovo stack temporaneo
  • Posiziona la stringa "/path/to/my.dylib" in una posizione nota nello stack
  • Usa alcuni trucchi per cercare l'indirizzo di dlopen() nel processo remoto
  • Trova un semplice gadget ROP RET in una pagina eseguibile (RET = "\xc0\x03\x5f\xd6" su arm64)
  • Crea un nuovo thread nel processo di destinazione
  • Imposta i registri della CPU per il thread:
    • $pc = Indirizzo di dlopen()
    • $x0 = Parametro 1 di dlopen: indirizzo della stringa "/path/to/dylib" nello stack temporaneo
    • $x1 = Parametro 2 di dlopen: il valore RTLD_LAZY | RTLD_GLOBAL
    • $sp = Metà dello stack temporaneo
    • $fp = Un quarto dello stack temporaneo
    • $lr = Indirizzo del gadget ROP
  • Riprendi il thread. Accadrà quanto segue:
    • _pthread_set_self viene chiamato per impostare il threading per dlopen()
    • dlopen() viene chiamato per iniettare la nostra libreria condivisa malevola
    • dlopen() farà RET al valore nel registro $lr, che è un'altra istruzione RET
    • RET ritornerà a RET, ritornerà a RET... all'infinito
  • Interroga i registri del thread per verificare che $pc == indirizzo del gadget ROP (l'istruzione RET)
  • Una volta raggiunto il gadget, termina il thread, libera la memoria, lavoro fatto.

Per una descrizione di basso livello, consulta il codice sorgente.

Problemi noti

Nota che su Electra, la versione di jtool (il multi-strumento di firma del codice di @morpheus) non supporta le entitlement dei binari di piattaforma, quindi bfinject fornisce jtool di LiberiOS e usa quello al suo posto. bfinject non usa inject_criticald di Electra.

Crediti

  • Stefan Esser (10n1c) per le idee e il codice originali alla base di dumpdecrypted (https://github.com/stefanesser/dumpdecrypted/blob/master/dumpdecrypted.c)
  • Dmitry Rodionov per lorgnette (https://github.com/rodionovd/liblorgnette/)
  • Jonathan Levin per il jailbreak LiberiOS (http://newosxbook.com/liberios/)
  • Ian Beer per l'exploit async_wake (https://bugs.chromium.org/p/project-zero/issues/detail?id=1417)
  • Apple per un grande sistema operativo mobile
Scarica lo strumento