
Um exploit totalmente público da vulnerabilidade RCE BlueFrag do Android CVE-2020-0022 (testado em Pixel 3 XL)
Muitos agradecimentos à Insinuator pelo seu incrível 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 em um arquivo README.md, então fique à vontade para conferir o post da Insinuator mencionado acima.
O exploit está totalmente completo até o ponto em que:
Este exploit difere da implementação da Insinuator das seguintes maneiras:
libandroid_runtime.so em vez de 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 mostrando o exploit modificando o PC para apontar para um endereço personalizado:

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

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

Felizmente, o Pixel 3 XL tem proteções que impedem o processo bluetooth de chamar fork e/ou execv. Em termos de compartilhamento de conhecimento ou de exibição, meu trabalho aqui está feito. Se eu escrever e compartilhar algo mais avançado, pode ser útil demais para black-hats.
Considero este exploit completo. Melhorias futuras podem ser:
dlsym e depois mprotect para executar shellcode personalizadoTodas essas coisas transformam este projeto de um projeto divertido de compartilhamento de conhecimento em um exploit black-hat que pode ser transformado em arma, então é aqui que minha jornada termina, por enquanto.... Se você tiver alguma dúvida, sinta-se à vontade para entrar em contato.
Para executar o exploit, basta executar:
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, o restante dos alvos de build só são úteis se você estiver tentando modificar, melhorar ou reimplementar o exploit, então não há necessidade de mencioná-los em profundidade.
gdbserver do android pode ser encontrado na pasta do NDK# On target
/data/local/tmp/gdbserver 0.0.0.0:1234 --attach $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')
# On host
adb forward tcp:1234 tcp:1234
gdb-multiarch -q -x ./gdbinit
# On host
adb push ./gdbinit /data/local/tmp/gdbinit
# On target
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}')
# OR
/data/data/com.termux/files/usr/bin/gdb -q -p $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')
Você pode reiniciar o serviço bluetooth na máquina do atacante caso ele pare de funcionar:
sudo systemctl restart bluetooth.service
Esta seçã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

