
Inyección de Dylib para iOS 11.0 - 11.1.2 con los jailbreaks LiberiOS y Electra
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/
wget de Electra no soporta SSL.ssh root@your-device-ip # (the password is 'alpine')
mkdir bfinject
cd bfinject
wget http://<your_server>/bfinject.tar
tar xvf bfinject.tar
wget de LiberiOS no soporta SSL.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
bash bfinject para obtener ayudabash o no funcionará. Sandbox y todo eso.-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/
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:
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 ;)
Este es un ejemplo de descifrado de la app de Reddit en un iPhone con jailbreak de Electra:
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í:
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:
[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í:
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:
ncat -l 0.0.0.0 12345 > decrypted.ipa
Y en el dispositivo con jailbreak:
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.
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:
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/):
carl@calisto-3 /tmp $ ~/bin/cycript -r 192.168.1.33:1337
cy# UIApp
#"<RedditApplication: 0x102304a30>"
cy#
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.
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:
platform-application, que creo que indica que el dylib es software de Apple.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.
task_for_pid(), obtén un puerto mach para el proceso objetivoPara una descripción de bajo nivel, consulta el código fuente.
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.