Active Directory : 4 outils gratuits et efficaces pour auditer les mots de passe
Sommaire
I. Présentation
Quels outils peut-on utiliser pour auditer les mots de passe de l'Active Directory ? C'est la question à laquelle nous allons répondre dans cet article.
En environnement Active Directory, la gestion des mots de passe est essentielle, car des mots de passe faibles ou compromis peuvent entraîner des compromissions de comptes. Les comptes concernés, difficilement identifiable sans un audit, ouvrent la porte à différentes attaques, dont celles par dictionnaire (brute force, credential stuffing).
Nous évoquerons uniquement des outils gratuits, dont certains sont accessibles en ligne de commande, notamment basés sur PowerShell, et un outil plus complet, doté d'une interface graphique et capable de générer un rapport prêt à l'emploi.
Si le sujet des mots de passe AD vous intéresse, je vous recommande la lecture de l'article suivant en complément de celui-ci :
II. Specops Password Auditor
Le premier outil que nous allons évoquer est une référence en matière d'audit des mots de passe Active Directory. Développé par Specops Software depuis plusieurs années, Specops Password Auditor est un outil simple et efficace. Au-delà de l'analyse, qui sur de nombreux points est similaire aux outils que nous évoquerons par la suite, sa grande force, c'est le rapport prêt à l'emploi qu'il est capable de générer.
Ce logiciel gratuit est capable de détecter les mots de passe compromis utilisés par vos utilisateurs Active Directory. Pour cela, il s'appuie sur une base de mots de passe téléchargée en locale : la version actuelle contient plus de 1 milliard de mots de passe. Il s'appuie également sur les hash des mots de passe pour effectuer la comparaison, comme les autres outils de ce type.
Vous pouvez télécharger l'outil via ce lien :
Quelques minutes suffisent pour générer le rapport présenté ci-dessous. Ce rapport en français (ou en une autre langue) est prêt à être présenté à la direction du système d'information (SI) ou à la personne en charge de la sécurité du SI. C'est un réel gain de temps en comparaison des 3 autres outils présentés dans cet article, car ils n'ont pas cette dimension "reporting".
Specops Password Auditor analyse les points de sécurité suivants :
- Conformité des politiques de mots de passe (ANSSI, CNIL, NIST, BSI, etc.)
- Comptes avec des mots de passe vides
- Comptes avec des mots de passe ayant fait l'objet d'une fuite de données (mots de passe compromis)
- Comptes avec des mots de passe identiques
- Comptes administrateur du domaine
- Comptes administrateur non protégés contre la délégation
- Comptes administrateur et utilisateurs inactifs
- Comptes où le mot de passe n'est pas obligatoire
- Comptes où le mot de passe n'expire jamais
- Comptes où le mot de passe est configuré pour expirer
- Comptes où le mot de passe est expiré
- L'âge du mot de passe sur chaque compte utilisateur / administrateur
- Liste des politiques de mots de passe avec les caractéristiques clés (dont l'entropie)
- Utilisation / affectation des politiques de mots de passe
Au-delà du rapport complet, vous pouvez exporter chaque liste d'utilisateurs dans un fichier texte au format CSV. Ceci peut vous permettre d'appliquer d'autres traitements aux comptes concernés par un problème de sécurité spécifique.
Cette application a déjà fait l'objet d'une présentation complète sur IT-Connect, ainsi que d'une vidéo. Voici les contenus correspondants :
Pour bénéficier d'une analyse approfondie, automatique et proactive, vous devez passer sur la solution payante baptisée Specops Password Policy. Elle est également associée à une base plus volumineuse comprenant plus de 4 milliards de mots de passe.
III. DSInternals
À partir de maintenant, nous allons basculer sur la ligne de commande PowerShell. Nous allons mettre à l'honneur le module PowerShell DSInternals
, qui a une très bonne réputation et éprouvé pendant des années. Il s'agit d'un module polyvalent et particulièrement pertinent pour tout ce qui tourne autour de la sécurité des mots de passe Active Directory. Il y a notamment un cmdlet nommé Test-PasswordQuality
capable d'effectuer un test de qualité des mots de passe Active Directory.
Cet outil analyse les points suivants :
- Mots de passe stockés avec un chiffrement réversible
- Présence des hash LM (LanMan) des mots de passe
- Comptes sans mot de passe défini (mot de passe vide)
- Mots de passe trouvés dans un dictionnaire (mots de passe faibles ou compromis)
- Les comptes utilisant le même mot de passe
- Comptes utilisateurs ayant leur SamAccountName comme mot de passe
- Comptes d'ordinateurs ayant des mots de passe par défaut
- Absence de clés Kerberos AES pour certains comptes
- Comptes ne nécessitant pas d'authentification préalable Kerberos (Kerberos pre-authentication)
- Comptes autorisés uniquement à utiliser le chiffrement DES
- Comptes vulnérables à l'attaque Kerberoasting
- Comptes administratifs (actuels ou anciens) autorisés à être délégués
- Comptes dont le mot de passe n'expirera jamais
- Comptes pour lesquels un mot de passe n'est pas requis
- Comptes nécessitant une authentification par carte à puce, mais ayant tout de même un mot de passe
Nous pouvons voir que l'analyse est complète et couvre une multitude de faiblesses potentielles. L'analyse sur l'Active Directory peut être effectuée en ligne ou hors ligne à partir d'un fichier de base ntds.dit
.
Sans plus attendre, installez le module PowerShell :
Install-Module DSInternals -Force
Ensuite, pour utiliser le module DSInternals, vous avez deux options :
- Disposer d'un dictionnaire de mots de passe pour voir si certains utilisateurs utilisent un mot de passe présent dans ce dictionnaire
- Ne pas utiliser de dictionnaire
La première option ouvre la porte à la détection de mots de passe compromis grâce à une liste de mots de passe. Il peut s'agir d'une base de mots de passe constituée par vos soins ou un dictionnaire correspondant à une fuite de données. À ce titre, nous pouvons citer la base de mots de passe RockYou dont la version 2024 contient plus de 10 milliards de mots de passe... Mais attention à la puissance de calcul nécessaire pour effectuer l'analyse.
Ici, nous utiliserons simplement un fichier nommé passwords.txt
avec ces valeurs :
IT-Connect
TutorielInformatique
P@ssword!
azertyuiop
azerty1234!
ActiveDirectory@Audit
Il y a donc trois variables à définir :
# Le chemin vers le fichier représentant le dictionnaire de mots de passe
$DictionaryFile = "C:\TEMP\passwords.txt"
# Le nom du contrôleur de domaine à interroger
$DC = "SRV-ADDS-01.it-connect.local"
# Le domaine où se situent les objets à rechercher
$Domain = "DC=it-connect,DC=local"
Nous allons utiliser le cmdlet PowerShell Get-ADReplAccount
pour lire le contenu de la base d'annuaire AD et récupérer la liste des objets ainsi que leurs attributs secrets. Pour chaque utilisateur, y compris ceux désactivés, nous allons évaluer le mot de passe.
Voici la commande :
Get-ADReplAccount -All -Server $DC -NamingContext $Domain | ` Test-PasswordQuality -WeakPasswordsFile $DictionaryFile -IncludeDisabledAccounts
Cette commande va retourner un rapport dans la console avec le résultat pour chaque point.
Nous pouvons constater que notre dictionnaire contient le mot de passe de trois comptes :
IT-CONNECT\Administrateur
IT-CONNECT\florian.burnel
IT-CONNECT\template_rh
De plus, deux groupes d'utilisateurs ont le même mot de passe :
Group 1:
IT-CONNECT\Administrateur
IT-CONNECT\florian.burnel
IT-CONNECT\template_rh
Group 2:
IT-CONNECT\chris.tal
IT-CONNECT\gerard.mensoif
IT-CONNECT\guy.mauve
IT-CONNECT\tech.t2
Vous pouvez effectuer la même analyse sans dictionnaire de mots de passe : tous les tests seront effectués, sauf la recherche de mots de passe.
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, nous pourrons en identifier certains via un dictionnaire. Cela est possible, car il n'y a pas de salage pour le chiffrement des mots de passe.
IV. PassTester
Publié en 2024, l'outil PassTester, écrit intégralement en PowerShell, sert à identifier les comptes utilisateurs AD les plus vulnérables à une attaque par brute force (ou par dictionnaire d'une manière générale). Pour effectuer cette analyse, l'outil s'appuie sur l'API du service I Have Been Pwned dans le but d'identifier les mots de passe compromis.
Pour ne pas exposer les hash des mots de passe vos utilisateurs, PassTester effectue une requête basée sur les 5 premiers caractères du hash du mot de passe. Grâce à cette première correspondance, l'outil récupère une liste de hash qui ont ces 5 caractères en commun et il effectue la comparaison, en local, avec le hash de l'AD. S'il y a une correspondance, alors nous pouvons considérer le mot de passe comme compromis.
Vous pouvez télécharger le script PassTester.ps1
depuis le GitHub officiel du projet. Vous devez un compte Administrateur du domaine pour exécuter l'analyse puisque l'outil travaille sur un dump de la base ntds.dit
. L'avantage étant de pouvoir faire un export sur une infrastructure et ensuite de réaliser l'analyse sur une autre machine déconnectée du SI du client (dans le cas où l'outil est utilisé dans le cadre d'une prestation).
Vous devez commencer par lancer le script et choisir l'option 1
pour réaliser un export de la base AD.
.\PassTester.ps1
Puis, relancez le script pour sélectionner l'option 2
. Cette fois-ci, l'outil va s'appuyer sur l'export précédemment effectué, et qu'il récupère sur le Bureau de l'utilisateur à l'origine de l'exécution, pour analyser les mots de passe.
.\PassTester.ps1
Le retour dans la console indique, pour chaque utilisateur, si le mot de passe est vulnérable ou non. De plus, si plusieurs utilisateurs ont le même mot de passe, l'information est remontée également, sans qu'il y ait un groupe comme avec DSInternals. Ici, nous pouvons voir que 3 utilisateurs ont un mot de passe vulnérable.
V. Lithnet Password Protection for AD
La solution gratuite Lithnet Password Protection for AD intègre plusieurs fonctionnalités et ne se limite pas à l'audit des mots de passe. Par exemple, vous pouvez l'utiliser pour bloquer certains mots de passe (grâce à un dictionnaire personnalisé).
Au même titre que PassTester, l'outil Lithnet compare les hash de mots de passe avec la base I Have Been Pwn, à la différence que cet outil télécharge la base de données en local. Cette étape est un peu contraignante, car elle nécessite du temps : malgré une bonne connexion Internet, il m'a fallu près de 2 heures pour télécharger les données.
Vous pouvez télécharger l'outil via ce lien :
Pour uniquement auditer les mots de passe, installez seulement le "PowerShell module" lors de l'installation. Comme ceci :
Ensuite, vous devez créer un store destiné à héberger la base de mots de passe HIBP. Il peut s'agir d'un répertoire local ou d'un répertoire partagé synchronisé entre plusieurs serveurs à l'aide de DFS-R.
À partir d'une console PowerShell exécutée en tant qu'administrateur, vous pouvez créer le store de cette façon :
New-Item -Path "C:\LithnetStore" -ItemType Directory
Import-Module LithnetPasswordProtection
Set-PasswordFilterConfig -StorePath "C:\LithnetStore"
Ici, nous créons le store à l'emplacement suivant : C:\LithnetStore
. Quand c'est fait, ouvrez le store via PowerShell :
Open-Store -Path "C:\LithnetStore"
Puis, lancez la synchronisation des hash de mots de passe. Patientez.... Une longue pause s'impose. Il y a environ 17 Go de données à télécharger.
Sync-HashesFromHibp
Quand l'opération sera terminée, il y aura une sortie comme celle-ci :
OperationStart : 02/04/2025 15:23:10
OperationFinish : 02/04/2025 17:14:36
Duration : 01:51:26.7203447
PagesRetrieved : 1048576
PagesWithChanges : 1048576
PagesUnchanged : 0
NewHashesImported : 1286782039
ExistingHashesDiscarded : 0
TotalHashesProcessed : 1286782039
Ensuite, vous pouvez utiliser le script ci-dessous, récupéré dans la documentation de Lithnet, pour analyser votre AD. Il s'appuie sur le cmdlet Test-IsADUserPasswordCompromised
du module LithnetPasswordProtection
. Un fichier de sortie avec les utilisateurs dont le mot de passe est compromis sera généré ici : C:\TEMP\get-pwned-users.csv
.
Import-Module LithnetPasswordProtection
$file = "C:\TEMP\get-pwned-users.csv"
"accountName,UPN,pwdLastSet,lastLogin,accountDisabled" | out-file $file
$Searcher = New-Object System.DirectoryServices.DirectorySearcher
$Searcher.PageSize = 200
$Searcher.SearchScope = "subtree"
$Searcher.Filter = "(&(objectCategory=person)(objectClass=user))"
$Attributes = @("PwdLastSet","lastLogonTimeStamp", "userAccountControl", "userPrincipalName", "name")
ForEach($Attribute In $Attributes)
{
$Searcher.PropertiesToLoad.Add($Attribute) > $Null
}
$Results = $null
$Total = 0
$NumChanged = 0
$Searcher.FindAll() | % {
$user = $_.Properties["UserPrincipalName"][0]
if ($user -eq $null)
{
write-warning "User $($_.Properties["Name"][0]) has a null UPN";
return;
}
$result = Test-IsADUserPasswordCompromised -UPN $user -server localhost
$pwdLastSet = $null
$lastLogin = $null
$disabled = $false;
if ($_.Properties["PwdLastSet"][0] -gt 0)
{
$pwdLastSet = [DateTime]::FromFileTimeUtc($_.Properties["pwdLastSet"][0]).ToLocalTime()
}
if ($_.Properties["lastLogonTimeStamp"][0] -gt 0)
{
$lastLogin = [DateTime]::FromFileTimeUtc($_.Properties["lastLogonTimeStamp"][0]).ToLocalTime()
}
if (($_.Properties["userAccountControl"][0] -band 2) -eq 2)
{
$disabled = $true;
}
if ($result -ne $true)
{
return;
}
$message = "$($_.Properties["Name"][0]),$user,$pwdLastSet,$lastLogin,$disabled"
Write-Output $message
$message | out-file $file -Append
}
Le fichier CSV généré en sortie contient plusieurs informations : Nom du compte, l'identifiant UserPrincipalName (UPN), date de dernière modification du mot de passe, date de dernière connexion, le compte est-il désactivé (vrai ou faux). Voici un exemple :
accountName,UPN,pwdLastSet,lastLogin,accountDisabled
Florian Burnel,florian.burnel@it-connect.tech,09/16/2024 18:43:59,11/29/2024 13:51:38,False
L'outil Lithnet présente l'avantage d'effectuer le traitement intégralement en local. Cette analyse intégrable dans des scripts PowerShell peut être automatisée et exécutée de façon régulière, ce qui est un avantage. A contrario, cette solution s'intéresse uniquement à la détection des mots de passe compromis, là où les autres outils évoqués effectuent une analyse plus large au niveau des problématiques liées aux mots de passe.
VI. Conclusion
Il existe d'autres outils gratuits pour auditer les mots de passe de l'Active Directory mais ces 4 outils gratuits couvrent déjà très bien le sujet. Plus ou moins léger, et plus ou moins complet, ils sauront répondre à différents besoins, entre ceux qui veulent un script léger, ou une solution complète capable de générer un rapport. À vous de choisir l'outil qui se rapproche le plus de votre cahier des charges.
Si vous souhaitez un outil simple qui ne nécessite aucune compétence technique particulière, intéressez-vous à Specops Password Auditor. C'est l'outil le plus accessible de cette sélection, et en plus, c'est aussi le seul à générer un rapport au format PDF.
Pour : « Lithnet Password Protection for AD ».
C’est possible d’avoir un script avec une tâche planifié pour :
Faire la synchro de la BDD. Et d’envoyer par mail la liste des utilisateurs compromis?
De plus, cela serait possible d’avoir un tuto pour ADMX de Lithnet?
Car on peut configurer ->
« Rejeter les mots de passe trouvés dans le magasin de mots de passe compromis »
« Rejeter les mots de passe normalisés trouvés dans le magasin de mots de passe compromis »
« Rejeter les mots de passe normalisés trouvés dans le magasin de mots interdits »
Cela serait vraiment sympa de le mettre en place.
Merci beaucoup.