
Exploit RCE Bluetooth sem clique para Android 8-9 (CVE-2020-0022) com pulverização de heap, vazamento de endereço e execução de cadeia JOP para execução remota de código através da vulnerabilidade BlueFrag.
Muitos agradecimentos à Insinuator pelo excelente post no blog e código!
Todos os passos mencionados no post da Insinuator foram concluídos, e mais. São muitos passos para colocar num ficheiro README.md, por isso fique à vontade para consultar o post da Insinuator mencionado acima.
O exploit está completamente funcional até ao ponto em que:
Este exploit difere da implementação da Insinuator das seguintes formas:
libandroid_runtime.so em vez da libicuuc.so, porque funcionou melhor neste telefone/alvoexecv diretamente e outra que chama fork e depois execvlibandroid_runtime.so e extrai os offsets de funções e gadgets (para facilitar a portabilidade do exploit para outros alvos)Este é um vídeo de demonstração que mostra o exploit a modificar o PC para apontar para um endereço personalizado:

A primeira iteração da cadeia é a que pode ser vista no jop_experiment. Esta cadeia chama execv diretamente sem chamar fork. Pode ser encontrada no commit ca28fdf. Isto é o que acontece ao usar esta cadeia:

A segunda iteração da cadeia é a que chama fork e depois execv. Detalhes completos desta cadeia podem ser encontrados aqui. Isto é o que acontece ao usar esta cadeia:

Felizmente, o Pixel 3 XL tem proteções que impedem o processo bluetooth de chamar fork e/ou execv. Em termos de partilha de conhecimento ou exibição, o meu trabalho aqui está concluído. Se escrever e partilhar algo mais avançado, pode ser útil demais para hackers de chapéu preto.
Considero este exploit completo. Melhorias futuras podem ser:
dlsym e depois mprotect para executar shellcode personalizadoTodas estas coisas transformam este projeto de um projeto divertido de partilha de conhecimento para um exploit de chapéu preto que pode ser armadilhado, então é aqui que a minha jornada termina, por agora.... Se tiver alguma dúvida, sinta-se à vontade para entrar em contacto.
Para executar o exploit, basta correr:
make build run ARGS="00:00:00:00:00:00"
Onde 00:00:00:00:00:00 é o endereço MAC do dispositivo alvo/vítima. Além de make clean, os restantes alvos de compilação só são úteis se estiver a tentar modificar, melhorar ou reimplementar o exploit, por isso não há necessidade de os mencionar em detalhe.
gdbserver do Android pode ser encontrado na pasta NDK# No alvo
/data/local/tmp/gdbserver 0.0.0.0:1234 --attach $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')
# No anfitrião
adb forward tcp:1234 tcp:1234
gdb-multiarch -q -x ./gdbinit
# No anfitrião
adb push ./gdbinit /data/local/tmp/gdbinit
# No alvo
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}')
# OU
/data/data/com.termux/files/usr/bin/gdb -q -p $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')
Pode reiniciar o serviço bluetooth na máquina atacante caso ele pare de funcionar:
sudo systemctl restart bluetooth.service
Esta secção explica alguns dos fenómenos que foram observados durante o desenvolvimento deste exploit:

base::MessageLoop usado através de get_message_loop:
unordered_map de partial_packets. Isto foi descoberto usando o map_experiment

