Active Directory : Auditer la qualité des mots de passe

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

Test-PasswordQuality-1

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 :

Test-PasswordQuality-2

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 ? 🙂

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian Burnel

Co-Fondateur d'IT-Connect, je souhaite partager mes connaissances et expériences avec vous, et comme la veille techno' est importante je partage aussi des actus.

florian a publié 1601 articles sur IT-Connect.See all posts by florian

8 réactions sur “Active Directory : Auditer la qualité des mots de passe

  • 26/08/2016 à 08:33
    Permalink

    Bonjour et merci pour cet excellent tutoriel. 🙂

    Répondre
  • 26/08/2016 à 10:35
    Permalink

    Super ! Merci pour ce tuto également. Des liens pour télécharger un dictionnaire de mot de passe ?
    Merci

    Répondre
  • 17/09/2016 à 12:10
    Permalink

    Voilà se que je cherchais depuis un moment.

    Maintenant je sais qui n’a pas de pwd dans mon domaine :@

    Merci.

    Répondre
  • 07/10/2016 à 08:53
    Permalink

    Bonjour,

    Merci pour cet outil très pratique 🙂

    Savez-vous comment faire pour que la worldlist fonctionne quand une des lignes est vide?
    En effet, il semblerait que ConvertTo-NTHashDictionary ne fonctionne pas quand il reçoit une entrée vide (après je m’y prends peut être mal, je début en powershell 🙂 )

    Merci

    Répondre
  • 16/11/2016 à 09:03
    Permalink

    Bonjour,
    j’ai testé, mais le soucis est que nous avions l’historique de mot de passe activé et qu’il ressort donc des mots de passe en lien avec le dictionnaire, mais qui ne sont pas ceux en cours (concrétement on va retrouver le premier mis lors de la création du compte qui est tout simple). Avez vous une parade à cela ? (j’ai désactivé l’historique de mot de passe car on ne s’en sert pas au final, mais cela ne purge pas la bdd derière)

    Répondre
    • 16/11/2016 à 09:31
      Permalink

      j’ai rien dit, j’avais pas vu que il y avait deux listes, la première sur les mots de passe en cours et la deuxième sur l’historique

      Répondre
  • 28/12/2016 à 14:33
    Permalink

    Bonjour, j’ai ce message lorsque que je tape : install-module -name dsinternals

    install-module…. le terme n’est pas reconnu comme nom d’applet de commande… vérifier que le chemin d’accès est correct.
    une idée peut-être ?
    je me trouve dans le dossier où sont placés les fichiers extrait du dsinternals

    Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *