Сложность пароля пользователя в домене Active Directory — это важный элемент безопасности как данных пользователя, так и домена целиком. Несмотря на рекомендации не использовать в качестве паролей личные данные, словарные слова и простые комбинации, многие пользователи продолжают использовать простые и легко запоминаемые пароли. В этой статье мы покажем, как выполнить аудит используемых паролей пользователей Active Directory, найти слабые и простые пароли с помощью PowerShell.
P@ssw0rd
или
Pa$$w0rd
Установка PowerShell модуля DSInternals (Directory Services Internals)
Чтобы сравнить хэши паролей пользователей, хранящихся в базе Active Directory (файл ntds.dit) со словарем простых и распространённых паролей можно использовать сторонний PowerShell модуль — DSInternals. Этот модуль содержит ряд командлетов, которые позволяет выполнять различные операции с базой данных AD в онлайн или офлайн режиме (непосредственно с файлом ntds.dit). В частности, нас интересует командлет Test-PasswordQuality, позволяющий найти пользователей со слабыми, одинаковыми, стандартными, пустыми паролями (Password Not Required), пароли которых никогда не истекают (Password Never Expires).
В PowerShell версии 5 (и выше) вы можете установить модуль DSInternals онлайн из официальной галереи скриптов PowerShell так:
Install-Module DSInternals
Для предыдущих версий PowerShell и на изолированных системах придется скачать zip архив с последней версией модуля с GitHub (https://github.com/MichaelGrafnetter/DSInternals/releases). На момент написания статьи последний релиз — DSInternals v4.4.1. Распакуйте содержимое архива в один из каталогов с модулями PowerShell:
- C:\Windows\system32\WindowsPowerShell\v1.0\Modules\DSInternals
- C:\Users\%username%\Documents\WindowsPowerShell\Modules\DSInternals
Или можно импортировать модуль DSInternals командой:
Import-Module C:\distr\PS\DSInternals\DSInternals.psd1
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass –Force
Список доступных командлетов модуля можно получить так:
Get-Command -Module DSInternals
Поиск слабых паролей в AD с помощью командлета Test-PasswordQuality
Далее необходимо создать словарь паролей. Это будет простой тестовый файл со списком распространениях используемых, слабых и других плохих паролей. Вы можете скачать словарь паролей из Интернета или создать его самостоятельно. Модуль DSInternal позволит сравнить хэши паролей ваших пользователей в Active Directory с хэшами слов из этого файла. Сохраните пароли в текстовый файл PasswordDict.txt.
Теперь создайте небольшой PowerShell скрипт. В следующих переменных укажите путь к файлу с паролями, имя домена и контроллера домена.
$DictFile = "C:\PS\PasswordDict.txt"
$DC = "msk-dc01"
$Domain = "DC=winitpro,DC=ru"
Далее с помощью командлета Get-ADReplAccount можно получить список пользователей в AD (по аналогии с Get-ADUser). Дополнительно данный командлет возвращает значения их NT, LM хешей, а также историю хешей.
Затем для каждого пользователя будет проведено сравнение соответствия хеша его пароля с хешами из файла-словаря (проверка выполняется также и для отключенных аккаунтов):
Get-ADReplAccount -All -Server $DC -NamingContext $Domain | Test-PasswordQuality -WeakPasswordsFile $DictFile -IncludeDisabledAccounts
Результат выполнения скрипта может выглядеть так:
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: WINITPRO\DefaultAccount WINITPRO\Guest Passwords of these accounts have been found in the dictionary: WINITPRO\aivanov WINITPRO\bpetrov WINITPRO\vsidorov These groups of accounts have the same passwords: Group 1: WINITPRO\anovak WINITPRO\Administrator WINITPRO\gpetrov WINITPRO\dkarpov Group 2: WINITPRO\bpetrov WINITPRO\vsidorov WINITPRO\aivanov 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: WINITPRO\Administrator WINITPRO\krbtgt Passwords of these accounts will never expire: WINITPRO\Administrator WINITPRO\DefaultAccount WINITPRO\Guest WINITPRO\krbtgt WINITPRO\web These accounts are not required to have a password: These accounts that require smart card authentication have a password:
Install-Module -Name DSInternals -RequiredVersion 2.23
Поиск по хэшам выполняется в том числе по истории паролей пользователей, хранящейся в AD. Как вы видите, были успешно найдены пользователи AD с простыми паролями (пароли совпадают со словарем). Также найдены несколько пользователей с одинаковыми паролями. Этот сценарий поможет вам найти аккаунты с простыми паролями, для которых действуют кастомные парольные политики Fine-Grained Password Policies.
Также вы можете выполнить офлайн сканирование файла базы данных Active Directory (ntds.dit). Вы можете получить копию файла ntds.dit из теневой копии или резервной копии контроллера домена.
Для офлайн проверки хэшей в файле ntds.dit воспользуйтесь такими командами:
$keyb= Get-BootKey -SystemHiveFilePath 'C:\ADBackup\registry\SYSTEM'
Get-ADDBAccount -All -DatabasePath 'C:\ADBackup\ntds.dit -BootKey $keyb| Test-PasswordQuality -WeakPasswordsFile $DictFile
Также можно выгрузить список всех хэшей в текстовый файл:
Get-ADDBAccount -All -DBPath 'C:\ADBackup\ntds.dit' -Bootkey $keyb | Format-Custom -View HashcatNT | Out-File c:\ps\adhashes.txt -Encoding ASCII
Итак, мы рассмотрели, как выполнить анализ качества паролей пользователей AD, их устойчивости перед брутфорсом по словарю, оценить используемую политику сложности паролей в домене, ну и сделать организационные выводы :). Такой аудит администраторы Active Directory могут (и даже должны) выполнять регулярно.