
Exploit de RCE por Bluetooth de cero clics para Android 8-9 (CVE-2020-0022) con heap spraying, fuga de direcciones y ejecución de cadena JOP para ejecución remota de código a través de la vulnerabilidad BlueFrag.
Muchas gracias a Insinuator por su increíble publicación en el blog y código!
Todos los pasos mencionados en la publicación de Insinuator se han completado, y más. Hay muchos pasos para incluir en un archivo README.md, así que siéntete libre de consultar la publicación de Insinuator mencionada anteriormente.
El exploit está completamente terminado hasta el punto en que:
Este exploit difiere de la implementación de Insinuator en los siguientes aspectos:
libandroid_runtime.so en lugar de libicuuc.so, porque funcionó mejor en este teléfono/objetivoexecv directamente y otra que llama a fork y luego execvlibandroid_runtime.so y extrae los desplazamientos de funciones y gadgets (para facilitar el traslado del exploit a otros objetivos)Este es un video demo que muestra el exploit modificando el PC para apuntar a una dirección personalizada:

La primera iteración de la cadena es la que se puede ver en jop_experiment. Esta cadena llama a execv directamente sin llamar a fork. Se puede encontrar en el commit ca28fdf. Esto es lo que ocurre al usar esta cadena:

La segunda iteración de la cadena es la que llama a fork y luego a execv. Los detalles completos de esta cadena se pueden encontrar aquí. Esto es lo que ocurre al usar esta cadena:

Afortunadamente, el Pixel 3 XL tiene protecciones que evitan que el proceso de bluetooth llame a fork y/o execv. En términos de compartir conocimiento o presumir, mi trabajo aquí está hecho. Si escribo y comparto algo más avanzado, podría ser demasiado útil para los black-hats.
Considero que este exploit está completo. Las mejoras futuras podrían ser:
dlsym y luego mprotect para ejecutar shellcode personalizadoTodas estas cosas convierten este proyecto de un divertido proyecto de intercambio de conocimiento a un exploit black-hat que puede ser armado, así que aquí termina mi viaje, por ahora.... Si tienes alguna pregunta, no dudes en ponerte en contacto.
Para ejecutar el exploit, simplemente ejecuta:
make build run ARGS="00:00:00:00:00:00"
Donde 00:00:00:00:00:00 es la dirección MAC del dispositivo objetivo/víctima. Aparte de make clean, el resto de los objetivos de compilación solo son útiles si estás intentando modificar, mejorar o reimplementar el exploit, por lo que no es necesario mencionarlos en profundidad.
gdbserver de Android se puede encontrar en la carpeta del NDK# En el objetivo
/data/local/tmp/gdbserver 0.0.0.0:1234 --attach $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')
# En el host
adb forward tcp:1234 tcp:1234
gdb-multiarch -q -x ./gdbinit
# En el host
adb push ./gdbinit /data/local/tmp/gdbinit
# En el objetivo
su
/data/data/com.termux/files/usr/bin/gdb -q -x /data/local/tmp/gdbinit -p $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')
# O
/data/data/com.termux/files/usr/bin/gdb -q -p $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')
Puedes reiniciar el servicio bluetooth en la máquina atacante en caso de que deje de funcionar:
sudo systemctl restart bluetooth.service
Esta sección explica algunos de los fenómenos que se observaron durante el desarrollo de este exploit:

base::MessageLoop utilizado a través de get_message_loop:
unordered_map de partial_packets. Esto se descubrió usando map_experiment

