Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
bfinject — Inyección de Dylib para iOS 11.0 - 11.1.2 con los jailbreaks LiberiOS y Electra | Kitploit
Herramientas/GitHubGitHub/bishopfox/bfinject
Análisis Dinámico (Sandboxing)Seguridad iOSExplotaciónPentesting de Apps MóvilesPruebas de PenetraciónAnálisis de Binarios
GitHubbishopfox/bfinject

bfinject

Inyección de Dylib para iOS 11.0 - 11.1.2 con los jailbreaks LiberiOS y Electra

Ver Repositorio
641150hace 4 añosRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

bfinject

Inyección sencilla de dylibs para iOS de 64 bits con jailbreak 11.0 - 11.1.2. Compatible con los jailbreaks de Electra y LiberiOS.

bfinject carga dylibs arbitrarios en apps de App Store en ejecución. Tiene soporte integrado para descifrar apps de App Store y viene incluido con iSpy y Cycript.

bfinject es un envoltorio que se encarga de firmar correctamente tus dylibs antes de inyectarlos mediante bfinject4realz. Es completamente independiente, no requiere jailbreakd, QiLin ni nada parecido. Simplemente funciona.

Nota: bfinject no funciona en Electra si "Tweaks" está habilitado. Reinicia y vuelve a ejecutar Electra sin tweaks para poder usar bfinject. Si ves errores relacionados con "thread_create", este es el problema.

Nota: bfdecrypt está disponible como dylib independiente aquí: https://github.com/BishopFox/bfdecrypt/

Navegación

  • Configuración de Electra
  • Configuración de LiberiOS
  • Uso de bfinject
  • Prueba de bfinject
  • Descifrado de apps de App Store
  • Cycript
  • ¿Cómo funciona?
  • Problemas conocidos
  • Créditos

Configuración de Electra

  • Haz jailbreak a tu dispositivo iOS 11.0 - 11.1.2 con Electra >= b7
  • Copia el tarball de bfinject, https://github.com/BishopFox/bfinject/raw/master/bfinject.tar, en tu dispositivo con jailbreak. Puede que necesites copiarlo primero a tu portátil porque Github exige SSL, pero la versión de wget de Electra no soporta 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

Configuración de LiberiOS

  • Haz jailbreak a tu dispositivo iOS 11.0 - 11.1.2 con LiberiOS >= 11.0.3
  • Copia el tarball de bfinject, https://github.com/BishopFox/bfinject/raw/master/bfinject.tar, en tu dispositivo con jailbreak. Puede que necesites copiarlo primero a tu portátil porque Github exige SSL, pero la versión de wget de LiberiOS no soporta 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 de bfinject

  • Inicia la app objetivo en la que vas a inyectar tu librería compartida
  • Escribe bash bfinject para obtener ayuda
  • NOTA: es importante preceder el comando con bash o no funcionará. Sandbox y todo eso.
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/

Una prueba sencilla

Antes de hacer nada más complejo, comprueba que funciona. bfinject tiene pruebas automáticas integradas. Aquí tienes un ejemplo usando la app de Reddit como objetivo:

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.

En la pantalla del dispositivo deberías ver esto:

Si no, algo está roto ;)

Descifrar apps de App Store

Este es un ejemplo de descifrado de la app de Reddit en un iPhone con jailbreak de 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.

Verás esta pantalla en tu dispositivo:

Cuando termine, se te mostrará una alerta de interfaz para preguntarte si quieres iniciar un servicio desde el que puedas descargar tu IPA descifrado:

Si tocas Yes, se iniciará un servicio en el puerto 31336 de tu dispositivo. Conéctate a él y recibirás una copia sin procesar del IPA, que puedes descargar con netcat así:

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

Alternativamente, revisa el registro de consola del dispositivo; te indicará dónde se almacena el IPA descifrado. Por ejemplo:

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

También puedes buscar el IPA en el sistema de archivos así:

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

Para sacar el .ipa del dispositivo puedes usar netcat. En tu portátil, configura un servicio a la escucha:

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

Y en el dispositivo con jailbreak:

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

El .ipa será un clon del .ipa original de App Store, excepto que el binario principal y todos sus frameworks y librerías compartidas asociados estarán descifrados. El indicador CRYPTID será 0 en cada archivo previamente cifrado. Puedes tomar el .ipa, extraer la app, modificarla según sea necesario, volver a firmarla con tu propio certificado de desarrollador y desplegarla en dispositivos sin jailbreak cuando lo necesites.

Cycript

Una de las funciones de bfinject es incorporar herramientas habituales de pentesting, como Cycript. Con el tiempo se irán añadiendo más. Para usar Cycript necesitarás tener instalado el cliente de línea de comandos de Cycript en tu MacBook (http://www.cycript.org/). Después, una vez que bfinject esté instalado en tu dispositivo de prueba, haz algo como este ejemplo en el que inyectamos Cycript en la app de 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 vez inyectado Cycript, verás el siguiente mensaje en tu dispositivo:

Puedes conectarte a Cycript desde tu MacBook de esta manera (suponiendo que instalaste Cycript en ~/bin/):

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

¿Cómo funciona?

A alto nivel, bfinject4realz hace una carga lateral (side-load) de un .dylib autofirmado en una app de App Store firmada por Apple y en ejecución.

El proceso se realiza en dos etapas.

1. Firmar el dylib que se va a inyectar

Los controles de firma de código en iOS incluyen servicios de espacio de usuario (amfid) y servicios de kernel (AppleMobileFileIntegrity). Tanto LiberiOS como Electra parchean el proceso amfid del espacio de usuario para omitir los controles de firma de código, pero el kernel aún realiza más comprobaciones.

Sin embargo, Electra y LiberiOS son KPPless, lo que significa que no parchean nada en el kernel; ni un solo byte. Esto se debe a Kernel Patch Protection ("KPP"), una tecnología de seguridad de Apple que realiza una introspección sofisticada del kernel para detectar y frustrar parches del kernel. En consecuencia, los controles de firma de código del kernel siguen intactos.

Por suerte para nosotros, parece que el kernel asume que amfid ya ha comprobado la validez de la firma criptográfica asociada a los entitlements de un dylib. Por lo tanto, todo lo que necesitamos hacer es autofirmar dos entitlements en un dylib para que el kernel lo acepte:

  • El primero es el entitlement platform-application, que creo que indica que el dylib es software de Apple.
  • El segundo es el Team ID del certificado de firma que se usó para firmar el código en el que estamos inyectando. Por ejemplo, la app de Reddit está firmada por el Team ID 2TDUX39LX8. Por lo tanto, para inyectar un dylib en la app de Reddit debemos firmar el dylib con el mismo Team ID: 2TDUX39LX8.

bfinject se encarga de todas las triquiñuelas de la firma por ti, lo cual es una ventaja.

2. Inyectar el dylib correctamente firmado en el proceso objetivo

  • Usando task_for_pid(), obtén un puerto mach para el proceso objetivo
  • Usa el puerto para manipular los hilos y los segmentos de memoria no ejecutables del proceso objetivo
    • Nota: sin parches del kernel, no es posible modificar código ejecutable en un proceso.
    • En consecuencia, tenemos que usar trucos de ROP para ejecutar el código de nuestra elección.
  • Asigna algunas páginas de memoria en el proceso remoto para una nueva pila temporal
  • Coloca la cadena "/path/to/my.dylib" en una ubicación conocida de la pila
  • Usa algunos trucos para localizar la dirección de dlopen() en el proceso remoto
  • Busca un gadget ROP simple de RET en una página ejecutable (RET = "\xc0\x03\x5f\xd6" en arm64)
  • Crea un nuevo hilo en el proceso objetivo
  • Establece los registros de CPU para el hilo:
    • $pc = Dirección de dlopen()
    • $x0 = Parámetro 1 de dlopen: dirección de la cadena "/path/to/dylib" en la pila temporal
    • $x1 = Parámetro 2 de dlopen: el valor RTLD_LAZY | RTLD_GLOBAL
    • $sp = Medio de la pila temporal
    • $fp = Un cuarto de la pila temporal
    • $lr = Dirección del gadget ROP
  • Reanuda el hilo. Esto es lo que ocurrirá:
    • Se llama a _pthread_set_self para preparar el uso de hilos para dlopen()
    • Se llama a dlopen() para inyectar nuestra librería compartida maliciosa
    • dlopen() hará RET al valor del registro $lr, que es otra instrucción RET
    • RET retornará a RET, que retornará a RET... ad infinitum
  • Consulta los registros del hilo para comprobar si $pc == dirección del gadget ROP (la instrucción RET)
  • Una vez que se alcanza el gadget, termina el hilo, libera la memoria y listo.

Para una descripción de bajo nivel, consulta el código fuente.

Problemas conocidos

Ten en cuenta que en Electra, la versión de jtool (la herramienta multifunción de firma de código de @morpheus) no soporta los entitlements de binarios de plataforma, por lo que bfinject incluye el jtool de LiberiOS y usa ese en su lugar. bfinject no usa el inject_criticald de Electra.

Créditos

  • Stefan Esser (10n1c) por las ideas originales y el código detrás de dumpdecrypted (https://github.com/stefanesser/dumpdecrypted/blob/master/dumpdecrypted.c)
  • Dmitry Rodionov por lorgnette (https://github.com/rodionovd/liblorgnette/)
  • Jonathan Levin por el jailbreak de LiberiOS (http://newosxbook.com/liberios/)
  • Ian Beer por el exploit async_wake (https://bugs.chromium.org/p/project-zero/issues/detail?id=1417)
  • Apple por un gran sistema operativo móvil
Descargar herramienta