W jednym z poprzednich postów opisywałem w jaki sposób wyciągnąć hashe haseł z bazy Active Directory, jeśli nie widzieliście zapraszam tutaj. Teraz pokaże Wam, jak posiadając już te dane, poprawić bezpieczeństwo środowiska, tzw. higienę haseł. Najwięcej incydentów związanych z atakiem na naszej środowisko jest spowodowanych kradzieżą loginu i hasła. Warto zatem zadbać o jakość haseł w naszym AD. O tym jak zdefiniować politykę haseł możecie przeczytać w poście o Tuningu AD #1. Natomiast w tym poście skupie się na analizie hashy haseł naszych użytkowników.
Na początek ze strony haveibeenpwned pobieram aktualną bazę wykradzionych haseł, posortowaną wg. hashy – łatwiej jest mi ją później dalej przetwarzać.
Najprostsza analiza z użyciem modułu DSInternals (tego samego co z poprzednim wpisie) pozwala, np. znaleźć grupy użytkowników posiadających takie same hasła, nie posiadających w ogóle ustawionego hasła, których hasło nigdy nie wygasa lub co gorsze użytkowników, dla których hasło nie jest wymagane.
Get-ADReplAccount -All -Server DC1 | Test-ADDBPasswordQuality
Na potrzeby tego ćwiczenia założyłem skryptem 150 kont w labie, część z nich ma proste hasło, a reszta skomplikowane hasła z generatora. Widać tutaj grupy kont zawierające takie same hasła. Wcześniej konta nie zawierające hasła.
W dalszej części raportu są kolejne konta, które m. in. mają ustawione hasło na nigdy nie wygasa. Konta, które nie wymagają hasła – bardzo niebezpieczna opcja, czy też konta z delegacją Kerberosową.
Jeśli dodacie do powyższego polecenia parametr WeakPasswordHashesSortedFile oraz ścieżkę do pobranego wcześniej pliku ze strony otrzymacie raport rozszerzony o hasła, które zostały skompromitowane.
Get-ADReplAccount -All -Server DC1 | Test-ADDBPasswordQuality -WeakPasswordHashesSortedFile "E:\pwned-passwords-ntlm-ordered-by-hash-v8\pwned-passwords-ntlm-ordered-by-hash-v8.txt"
Daje to pewien obraz jak wygląda nasze środowisko Active Directory, ile haseł należałoby zmienić. W przypadku, gdy środowisko jest małe nie stanowi to problemu, co jednak, gdy mamy do czynienia z większą ilością użytkowników. Otóż można wykorzystać Powershella do automatycznego powiadamiania o konieczności zmiany hasła. Przy okazji też można policzyć ile haseł się powtarza oraz spróbować zgadnąć 🙂 jakie to kombinacje są najczęściej wykorzystywane.
Poniżej kawałek kodu, który może posłużyć jako wsad do dalszych analiz. Jaką zatem ma przewagę nad tym wbudowanym w moduł, a np. oprócz tych które znajdują się w „słowniku”, możemy zobaczyć jaki mają hash, możemy tworzyć szersze raporty, uwzględniając dział, stanowisko, adres e-mail – na niego wysyłać automatyczne powiadomienie o konieczności zmiany hasła, itd.
Import-Module DSInternals
$dump = Get-ADReplAccount -All -Server DC1
Foreach($account in $dump)
{
If($account.NTHash)
{
$NTHash = -join ($account.NTHash | ConvertTo-Hex)
$hash_2char = ($NTHash).Substring(0,2)
$hash_5char = ($NTHash).Substring(0,5)
}
else
{
Write-Host "Puste hasło na koncie" $Account.SamAccountName -ForegroundColor Yellow
}
If($Account.SamAccountName -notlike "*$")
{
$user = Get-ADUser $Account.SamAccountName -Properties Enabled -ErrorAction SilentlyContinue
If($user.Enabled -eq $true)
{
$filepath = "E:\NTLMHashSort\" + $hash_2char + "\" + $hash_5char + ".txt"
If(Test-Path $filepath)
{
If(Get-Content $filepath | select-string -pattern $NTHash)
{
Write-host "Znaleziono hash" $NTHash "u użytkownika" $Account.SamAccountName -ForegroundColor Green
}
}
}
}
}
Aby przyspieszyć wyszukiwanie, raport przygotowuje częściej niż występuje aktualizacja bazy hashy, dzielę cały plik tekstowy z hasłami na mniejsze, zaczynające się od pierwszych 5 znaków ciągu.
Jakby Was ciekawiła jeszcze ta tematyka, dajcie znać w komentarzu.