Active Directory Wachtwoordcontrole met DSInternals
Iedere systeembeheerder heeft op enig moment de behoefte om te weten of alle accounts nog voldoen aan de password policy. Als een goede password policy al lang in bedrijf is dan zullen de meeste accounts voorzien zijn van een prima beveiliging. Echter hebben we ook vaak te maken met zogenaamde “legacy”, dus accounts uit het verleden toen de password policy nog niet van kracht was. Maar ook service accounts die niet voldoen aan de password policy zijn vaak aanwezig. In deze post gaan we aan de slag met DSInternals welke ons meer informatie retourneert dan we hierboven geschetst hebben…. exciting!
Middels DSInternals kunnen we een wachtwoordcheck uitvoeren op Active Directory. Op de achtergrond haalt DSInternals het wachtwoord van de gebruikers in AD uit de database als hash (NTHash). DSInternals genereerd op zijn beurt hashes van alle wachtwoorden welke in de wachtwoordfile staan en controleert of er hashes overeen komen. Zo ja, dan wordt er een zwak (of eerder gehackt) wachtwoord gebruikt.
Alvorens je deze controle kunt uitvoeren is het zaak dat je over een goed wachtwoordbestand beschikt. Ik gebruik een custom bestand (plain text) welke in totaal beschikt over meer dan 340000 wachtwoorden. Let erop dat je deze aanvult met wachtwoorden waarvan je weet dat deze vaak gebruikt worden in de organisatie en wachtwoordcombinaties die specifiek zijn voor de organisatie.
Om de controle te doen download je DSInternals van GitHub (https://github.com/MichaelGrafnetter/DSInternals) en v.a. Powershell 5 kun je DSInternals ook installeren vanuit de Powershell Gallery.
Install-Module DSInternals -Force |
Na het downloaden (vanuit GitHub) “Unblock” je de ZIP file. Dit kun je doen door naar “eigenschappen” te gaan of via het commando:
Unblock-File -Path C:\Users\User01\Documents\Downloads\DSInternals.zip |
Dit is belangrijk want als je dit niet doet zullen alle DLL bestanden die je uitpakt ook in “blocked state” blijven waardoor Powershell ze niet kan laden en de module niet kan draaien.
Pak nu de DSInternals ZIP file uit naar een tijdelijke locatie (C:\Temp).
Kopieer de DSInternals directory naar je Powershell module folder in:
C:\Windows\system32\WindowsPowerShell\v1.0\Modules\DSInternals
OF
C:\Users\Gebruiker\Documents\WindowsPowerShell\Modules\DSInternals.
Nu kunnen we Windows Powershell gaan starten en aan de slag met DSInternals om de wachtwoordkwaliteit te controleren. Dit doen we met de “Test-PasswordQuality” cmdlet.
Get-ADReplAccount -All -Server DC01 –NamingContext " DC=domein,DC=nl" | Test-PasswordQuality –WeakPasswordHashes .\passwords.txt –IncludeDisabledAccounts |
We kunnen dit wat uitgebreider en dynamischer doen in een Powershell script:
<# Audit Active Directory Passwords met DSInternals Author: Jarno Baselier Created: 2019 #> #IMPORT DSInternals Module or install if needed (Powershell 5+) if (Get-Module -ListAvailable -Name DSInternals) { Import-Module DSInternals } else { Install-Module DSInternals -Force Import-Module DSInternals } #Script Variables $DictFile = "c:\tmp\passwords.txt" $OutputFile = "c:\tmp\pwoutput.txt" $DC = "DC01" $Domain = "DC=domein,DC=nl" #Convert password file to hashes $Dict = Get-Content $DictFile | ConvertTo-NTHashDictionary #Get AD Users and compare hashes Get-ADReplAccount -All -Server $DC -NamingContext $Domain | Test-PasswordQuality -WeakPasswordHashes $Dict -ShowPlainTextPasswords -IncludeDisabledAccounts | Out-File -FilePath $OutputFile |
Wanneer het script gedraaid heeft kunnen we de outputfile bekijken om te beoordelen welke accounts voorzien zijn van zwakke wachtwoorden. Het bestand is duidelijk opgebouwd uit verschillende kopjes.
De verschillende kopjes in het bestand:
Passwords of these accounts are stored using reversible encryption:
>Dit zijn de accounts waarvan wachtwoorden opgeslagen zijn met een zwakke encryptie. Bij voorkeur deze gebruikers aanschrijven om het wachtwoord te veranderen.
LM hashes of passwords of these accounts are present:
>Van deze gebruikers is een LM Hash aanwezig van het wachtwoord. Bij voorkeur deze verwijderen.
These accounts have no password set:
>Als het geen generieke accounts betreft een wachtwoord op deze accounts laten plaatsen.
Passwords of these accounts have been found in the dictionary:
>Deze wachtwoorden zijn gevonden in AD welke overeenkomen met wachtwoorden in het wachtwoordbestand. Deze wachtwoorden veranderen.
Historical passwords of these accounts have been found in the dictionary:
>Dit zijn oude wachtwoorden van getoonde gebruikers welke nog in AD aanwezig zijn maar niet meer actief zijn. Deze bij voorkeur verwijderen.
These groups of accounts have the same passwords:
Van alle getoonde groepen hebben de gebruikers in een groep hetzelfde wachtwoord. Zolang dit geen zwak wachtwoord is, is het niet zo erg. Maar het geeft wel aan dat er “simpele” wachtwoorden zijn die veel gebruikers gebruiken welke niet middels de tool gechecked zijn.
These computer accounts have default passwords:
>Computeraccounts met default wachtwoorden.
Kerberos AES keys are missing from these accounts:
>Deze accounts hebben geen Kerberos AES key. Voorstel is om het wachtwoord aan te passen.
Kerberos pre-authentication is not required for these accounts:
>Accounts waar Kerberos Pre-Authentication niet verplicht is. Voorstel is om het wachtwoord aan te passen.
Only DES encryption is allowed to be used with these accounts:
>Accounts waar alleen DES encryptie op van toepassing is (en dus zwak zijn). Voorstel is om DES-only eraf te halen en het wachtwoord aan te passen.
These administrative accounts are allowed to be delegated to a service:
>Deze accounts kunnen aan een service worden toegewezen. Dus als je een wachtwoord aanpast, hou hier dan rekening mee.
Passwords of these accounts will never expire:
Accounts waarvan het wachtwoord niet vervalt en dus mogelijk tegen de password policy ingaan. Voorstel is om “never expire” eraf te halen.
These accounts are not required to have a password:
Accounts die niet verplicht zijn om een wachtwoord in te stellen. Voorstel is om die verplichting in te schakelen.
Zoals je ziet genereert DSInternals een uitgebreid en duidelijk bestand waar je voor jezelf de juiste acties op kunt nemen. Door het Powershell script te scripten kun je zelfs op periodieke basis geautomatiseerd deze controle uitvoeren.
Wat is automatisering toch een mooi vak…!