Kategorie:

Hashe haseł, a higiena środowiska

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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *