
CVE-2026-54121 (Certighost) — إثبات مفهوم (PoC) لانتحال هوية وحدة التحكم بالمجال (DC) عبر AD CS. معالجة مُصحَّحة لـ SAN مع إعادة استخدام آمنة للحسابات ضمن حدود MAQ.
فورك عملي لأداة إثبات المفهوم الخاصة بـ CVE-2026-54121، والمعروفة أيضًا باسم Certighost. البحث الأصلي وإثبات المفهوم بواسطة @H0j3n و @aniqfakhrul، مع التحليل المفصل على:
يصلح هذا الفورك معالجة SAN التي كانت تمنع نجاح PKINIT على هيئات الشهادات (CAs) التي تحترم SAN المطلوب، ويقوّي تحليل --target-san، ويعيد هيكلة التعامل مع حساب الكمبيوتر بحيث لم يعد يستنفد ms-DS-MachineAccountQuota.
نفّذ بصلاحيات الجذر (root) لأن خدمتَي LDAP وSMB المزوّرتين تتطلبان المنفذين المميزين 389 و445.
sudo python3 certighost.py -d playground.local -u lowpriv -p 'Password1234' --dc-ip 192.168.1.10
عند اكتمال العملية بنجاح، يتم كتابة شهادة الهدف (.pfx) وذاكرة Kerberos المؤقتة (.ccache) في دليل العمل الحالي.
CERTIGHOST$، يُنشأ عند أول تشغيل) أو استخدام حساب محدد عبر --computer-name.cdc تشير إلى عنوان IP متحكم فيه (عبر --listener؛ اختيارية، ويتم اكتشافها تلقائيًا إذا حُذفت) بالإضافة إلى سمة rmd تحمل اسم DNS لوحدة التحكم بالمجال (DC) الهدف..ccache وتجزئة NT.كانت النسخة الأصلية تُنشئ SAN الخاص بالشهادة من كلٍّ من امتداد subjectAltName في CSR وسمة الطلب SAN:dns=، وذلك باستخدام اسم مضيف الكمبيوتر المزوّر بدلاً من FQDN الخاص بـ DC الهدف. وعلى هيئة شهادات تحترم SAN المطلوب، كانت الشهادة الصادرة تحمل dNSHostName للحساب المزوّر، لذلك قام PKINIT بتعيينه إلى الكيان الخاطئ وفشل مع:
KDC_ERR_CLIENT_NAME_MISMATCH(Reserved for PKINIT)
يستخدم SAN الآن dNSHostName الخاص بـ DC الهدف (rmd_value / target_dns)، وهو المعرّف الذي يعتمد عليه PKINIT لتعيين حساب الآلة. تعرض الشهادة الصادرة الآن DNS:<dc>.<domain> ويكتمل AS-REQ بهوية DC.
--target-san متينأصبح --target-san يقبل الآن أيًا من MEEREEN أو MEEREEN$ أو FQDN meereen.essos.local (يتم التطابق عبر sAMAccountName أو dNSHostName)، بدلاً من صيغة NAME القصيرة فقط.
كانت النسخة الأصلية تنشئ حسابًا عشوائيًا جديدًا GHOST********$ في كل تشغيل. وبما أن حسابات الكمبيوتر التي يتم إنشاؤها عبر ms-DS-MachineAccountQuota تكون مملوكة لمسؤولي المجال (Domain Admins) وليس لمنشئها، فإن المستخدم ذا الصلاحيات المنخفضة لا يمكنه حذفها، لذا كانت عمليات التشغيل المتكررة تستنفد الحصة (الافتراضي 10) سريعًا بحسابات يتيمة.
يعيد هذا الفورك استخدام حساب ثابت واحد (CERTIGHOST$، يُنشأ فقط إذا لم يكن موجودًا بالفعل)، وبالتالي لا تزداد الحصة أبدًا ولا يوجد ما يلزم تنظيفه بين عمليات التشغيل.
عند إنشاء الحساب لأول مرة، يطبع السكربت تحذيرًا يذكر فيه أنه يُترك في AD:
[!] WARNING: computer account CERTIGHOST$ was created and is left in AD.
يبقى الحساب لإعادة استخدامه في عمليات التشغيل اللاحقة. لإزالته بالكامل، احذفه بصلاحيات مسؤول المجال (مالك الكائن):
Get-ADComputer CERTIGHOST | Remove-ADComputer -Confirm:$false
impacketcryptography, pyasn1, asn1crypto, pycryptodomexلأغراض اختبار الأمان المصرح به والتعليم فقط. استخدمه فقط ضد الأنظمة التي لديك إذن صريح لاختبارها.