Skip to content

Extraire NTDS.dit et casser tous les mots de passe du domaine

Comment extraire les hashs de domaine de NTDS.dit avec secretsdump, alimenter hashcat avec les hashs NT, les remapper sur les comptes, et détecter un DCSync.

Publié le 5 min de lecture

Extraire NTDS.dit, c'est la fin de partie. Une fois que vous avez tous les hashs de mots de passe du domaine, la mission cesse de tourner autour de l'accès et commence à tourner autour de ce que les mots de passe vous racontent. Et ils racontent toujours quelque chose.

Les hashs du domaine vivent dans NTDS.dit, la base Active Directory, présente sur chaque contrôleur de domaine. Les hashs qu'elle contient sont chiffrés avec la boot key, que vous dérivez de la ruche de registre SYSTEM. Il vous faut donc deux choses : la base et la ruche, ou les droits de réplication pour vous passer des deux.

Sortir les hashs

Le secretsdump.py d'Impacket est l'outil. Si vous avez un compte avec des droits de réplication (Domain Admins, ou tout ce qui s'est vu accorder le droit étendu Get-Changes-All), faites un DCSync et tirez tout à distance :

secretsdump.py -just-dc -dc-ip 10.0.0.10 contoso.local/administrator@10.0.0.10

-just-dc lui dit d'utiliser le service de réplication d'annuaire pour demander les secrets, exactement comme un DC se synchronise depuis un autre. Vous ne vous connectez jamais à la machine. Si vous préférez vous passer du krbtgt et des clés de confiance, -just-dc-ntlm ne vous donne que les hashs NT.

L'autre voie est hors ligne, depuis une copie des fichiers. Si vous pouvez obtenir un cliché instantané du volume du DC (via vss ou ntdsutil "activate instance ntds" "ifm" "create full c:\temp"), vous récupérez ntds.dit et la ruche SYSTEM et vous pointez secretsdump sur les fichiers locaux :

secretsdump.py -ntds ntds.dit -system SYSTEM LOCAL

Dans les deux cas, la sortie est une ligne par compte sous ce format :

contoso.local\jsmith:1104:aad3b435b51404eeaad3b435b51404ee:64f12cddaa88057e06a81b54e73b949b:::

C'est user:rid:lmhash:nthash:::. Le RID est l'identifiant relatif, le aad3b435... est le remplissage LM vide, et le champ qui vous intéresse est le hash NT.

Nettoyer avant de casser

Deux choses à retirer d'abord.

Les comptes machine. Chaque ordinateur du domaine a un compte qui se termine par $, et son mot de passe fait 120 caractères aléatoires qui tournent automatiquement. Les casser ne sert à rien, donc supprimez chaque ligne dont le nom d'utilisateur finit par $.

La colonne LM vide. À moins d'être sur un domaine antique, chaque compte affiche le même aad3b435b51404eeaad3b435b51404ee parce que les hashs LM ne sont plus stockés par défaut depuis Server 2008. Le LM ne compte que sur des domaines vraiment vieux, et si vous y trouvez de vrais hashs LM, ils se cassent trivialement avec le mode 3000. Sinon, ignorez la colonne entièrement.

Ce que vous voulez, c'est la colonne du hash NT, isolée, pour les comptes utilisateurs seulement.

Alimenter hashcat

Le hash NT part vers le mode hashcat 1000. Si vous avez besoin d'un rappel sur quel mode correspond à quel format de hash NTLM, le guide pour trouver le mode hashcat le détaille. Gardez les lignes user:hash intactes et utilisez --username pour que hashcat ignore le champ utilisateur au cassage mais le conserve pour la sortie :

hashcat -m 1000 --username ntds.txt rockyou.txt -r /usr/share/hashcat/rules/best64.rule

Les hashs NT sont sans sel et rapides, donc un dump complet de domaine casse à des milliards par seconde sur un seul GPU. La première passe avec rockyou et un jeu de règles videra en général un tiers à la moitié d'une entreprise typique dans la nuit. Ensuite, montez en gamme : dictionnaires plus gros, termes propres à l'entreprise mutés, masques pour les motifs évidents.

Quand vous voulez relire les résultats plus tard, ne relancez pas le cassage. Servez-vous du potfile :

hashcat -m 1000 --username --show ntds.txt

Ça affiche user:hash:plaintext pour tout ce qui est déjà dans le pot, donc vous remappez les mots de passe cassés directement sur les comptes qui les utilisaient.

Ce que l'ensemble cassé vous apprend

C'est là qu'est la valeur, et ça ne tourne que rarement autour d'un compte unique. Ça tourne autour de la réutilisation.

Triez les mots de passe cassés par fréquence. Vous trouverez le même mot de passe sur des dizaines de comptes, presque toujours la valeur de réinitialisation du support (Welcome1, Company2024!) que personne n'a changée. Vous trouverez des comptes de service partageant un mot de passe avec le compte personnel de leur propriétaire. Vous trouverez que le mot de passe de l'admin de domaine n'est qu'à un caractère de celui que vous avez cassé sur un admin local de poste trois étapes plus tôt. La carte de réutilisation est le vrai butin, parce qu'elle vous montre quels identifiants débloquent quels niveaux, et c'est ce que vous remettez au client comme constat qui change réellement les comportements.

Côté défenseur

Détectez le DCSync. La requête de réplication apparaît comme l'événement 4662 (une opération sur un objet d'annuaire) référençant les droits d'accès de contrôle de réplication, en particulier les GUID de Get-Changes (1131f6aa-...) et Get-Changes-All (1131f6ad-...). Légitimement, seuls les contrôleurs de domaine répliquent. Donc un 4662 avec ces GUID provenant de quoi que ce soit qui n'est pas un DC est un DCSync en cours. Alertez dessus, fort.

Structurellement, le correctif est le modèle administratif en niveaux. Le Tier 0 (les DC et les comptes qui peuvent les toucher) reste isolé des postes et serveurs où les identifiants se font moissonner. Si les seuls comptes avec des droits de réplication sont des identités tier 0 tenues serrées qui ne se connectent jamais aux niveaux inférieurs, le chemin vers un DCSync cesse d'exister.

Contrôlez aussi l'accès physique et de sauvegarde au DC. Un attaquant capable d'attraper un instantané de VM, une sauvegarde ou un cliché instantané du disque obtient ntds.dit et la ruche SYSTEM sans aucun droit de réplication et sans aucune détection. Traitez les sauvegardes de DC comme des secrets tier 0, parce que c'est exactement ce qu'elles sont.

Et celui qui limite les dégâts après un dump : des mots de passe longs et uniques. Un domaine où la réponse à "combien de comptes cassés cette nuit" se compte sur les doigts d'une main est un domaine qui a fait correctement sa politique de mots de passe et son hygiène de réutilisation. La plupart n'en sont pas encore là.

Articles liés

Comment l'AS-REP roasting permet à un attaquant non authentifié de récupérer un hash krb5asrep cassable sur les comptes sans préauth, et comment le détecter.
Empoisonnez LLMNR et NBT-NS avec Responder pour capturer un défi-réponse NetNTLMv2, cassez-le avec hashcat mode 5600, et sachez quand relayer plutôt.
Extrayez les hash DCC2 d'un hôte joint au domaine avec secretsdump, cassez-les avec hashcat mode 2100, et comprenez pourquoi MS-Cache v2 est lent par conception.