I. Présentation
Les mots de passe utilisés par vos utilisateurs sont-ils complexes ? Sont-ils facilement détectables par un dictionnaire ? Certains utilisateurs ont-ils le même mot de passe ? Est-ce que certains mots de passe n’expirent jamais ? Est-ce qu’il y a des utilisateurs qui n’ont pas de mots de passe ? …. ?
Il y a de nombreuses questions que l’on peut se poser quant aux mots de passe des utilisateurs dans un Active Directory, la sécurité des comptes est primordiale et un audit des comptes peut-être réalisé facilement, en PowerShell.
Le module DSInternals disponible gratuitement sur Internet contient un lot de commandlets intéressants pour réaliser des opérations sur un Active Directory en ligne, ou même hors ligne directement sur la base ntds.dit. Il intègre notamment le commandlet « Test-PasswordQuality » qui permet d’analyser les mots de passe dans l’AD et de sortir un rapport suite à l’audit.
J’en profite également pour préciser qu’il y a certainement d’autres méthodes, d’autres solutions, alors si vous avez un retour n’hésitez pas à laisser un commentaire
Voyons comment l’utiliser.
II. DSinternals et Test-PasswordQuality
Ouvrez une console PowerShell et commencez par installer le module PowerShell DSInternals :
Install-Module -Name DSInternals
Ensuite, on va créer un dictionnaire de mots de passe (vous pouvez aussi essayer d’en trouver un sur internet), pour ma part j’en ai créé un pour l’occasion avec quelques mots de passe aléatoire et quelques mots de passe que j’ai définis pour l’occasion sur mes utilisateurs, au sein de mon AD de test :
Maintenant on va commencer le script, avec tout d’abord l’import du module :
# Modules Import-Module DSInternals
Puis on va se définir quelques variables :
# Variables prédéfinies $DictionaryFile = "C:\passwords.txt" $DC = "ADDS01" $Domain = "DC=it-connect,DC=local"
Elles correspondent au chemin vers le fichier dictionnaire ($DictionaryFile), au contrôleur de domaine ciblé ($DC) et au domaine sous la forme d’un DN ($Domain).
Désormais, nous allons attribuer à une variable « $Dictionary » le contenu de notre dictionnaire, puis nous allons convertir les entrées du dictionnaire en hash NT pour pouvoir les comparer avec les hash dans l’AD.
# Audit avec dictionnaire $Dictionary = Get-Content $DictionaryFile | ConvertTo-NTHashDictionary
Ensuite, on va utiliser le commandlet « Get-ADReplAccount » pour lire l’AD et récupérer la liste des objets ainsi que leurs attributs secrets, comme le hash NT, le hash LM ou encore l’historique des hashs de l’utilisateur. Pour chaque utilisateur (via le pipe), on va tester le mot de passe notamment avec le dictionnaire, tout en intégrant les comptes désactivés.
Note : Les mots de passe ne pourront pas être récupérés en clair directement (sauf s’ils sont définis avec un chiffrement réversible) mais en comparant les hash on pourra en retrouver certains via un dictionnaire.
Voici la commande :
Get-ADReplAccount -All -Server $DC -NamingContext $Domain | Test-PasswordQuality -WeakPasswordHashes $Dictionary -ShowPlainTextPasswords -IncludeDisabledAccounts
Ce qui donnera l’ensemble suivant :
# Modules Import-Module DSInternals # Variables prédéfinies $DictionaryFile = "C:\passwords.txt" $DC = "ADDS01" $Domain = "DC=it-connect,DC=local" # Audit avec dictionnaire $Dictionary = Get-Content $DictionaryFile | ConvertTo-NTHashDictionary Get-ADReplAccount -All -Server $DC -NamingContext $Domain | Test-PasswordQuality -WeakPasswordHashes $Dictionary -ShowPlainTextPasswords -IncludeDisabledAccounts
L’exécution du script donnera un rapport comme ceci :
Active Directory Password Quality Report ---------------------------------------- Passwords of these accounts are stored using reversible encryption: LM hashes of passwords of these accounts are present: These accounts have no password set: Invité Passwords of these accounts have been found in the dictionary: user2 Passw0rd user3 Okokokok1 Historical passwords of these accounts have been found in the dictionary: These groups of accounts have the same passwords: Group 1: Administrateur florian scvmm These computer accounts have default passwords: Kerberos AES keys are missing from these accounts: Kerberos pre-authentication is not required for these accounts: Only DES encryption is allowed to be used with these accounts: These administrative accounts are allowed to be delegated to a service: Administrateur krbtgt Passwords of these accounts will never expire: florian Invité scvmm user1 user2 user3 These accounts are not required to have a password: Invité
Selon les cas de figure dans votre AD et comment il est configuré, plus ou moins d’utilisateurs vont ressortir pour les différents tests. Une bonne complexité des mots de passe jouera pour beaucoup sur la qualité de vos mots de passe.
Si vous souhaitez effectuer le test sans utiliser de dictionnaire, il faudra utiliser simplement ceci (avec les variables à définir quand même) :
# Audit sans dictionnaire Get-ADReplAccount -All -Server $DC -NamingContext $Domain | Test-PasswordQuality -ShowPlainTextPasswords -IncludeDisabledAccounts
Voilà, alors vous allez le faire cet audit ?