Аудит слабых паролей в Active Directory
Сложность пароля пользователя в домене Active Directory является одним из ключевых элементов безопасности как пользовательских данных, так и всей инфраструктуры домена. Многие пользователи предпочитают использовать простые и легко запоминающиеся пароли, несмотря на рекомендации не использовать в качестве паролей личную информацию, словарные слова и простые комбинации. В этой статье мы покажем вам, как проверять пароли пользователей Active Directory, находить слабые и простые пароли с помощью PowerShell.
Даже при наличии сложной политики паролей домена пользователь может технически установить слабый пароль или пароль по умолчанию, например
Pa$$w0rdили
P@ssw0rd.
Как установить модуль PowerShell DSInternals (внутренние службы каталогов)?
Чтобы сравнить хэши паролей пользователей, хранящихся в базе данных Active Directory (файл ntds.dit), со словарем простых и распространенных паролей, можно использовать сторонний модуль PowerShell — DSInternals. Этот модуль содержит ряд командлетов, позволяющих выполнять различные действия с базой данных AD в онлайн- или офлайн-режиме (напрямую с помощью ntds.dit). В частности, нас интересует командлет Test-PasswordQuality, который позволяет обнаруживать пользователей, имеющих слабые, похожие, стандартные, пустые пароли (пароль не требуется) или чьи пароли никогда не истекают.
Примечание. Естественно, пароли пользователей не могут быть получены из базы данных AD в виде обычного текста. Пароли, хранящиеся в Active Directory, хешируются. Однако вы можете сравнить хэши паролей пользователей AD с хэшами слов из файла словаря и найти слабые пароли.
В 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 в текущий сеанс PowerShell с помощью этой команды:
Import-Module C:\distr\PS\DSInternals\DSInternals.psd1Если ошибка «
cannot be loaded because running scripts is disabled on this system» появляется при импорте модуля, вам необходимо изменить текущую политику выполнения PowerShell и разрешить запуск внешних PS-скриптов хотя бы в текущем сеансе:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -ForceСписок доступных командлетов модуля можно получить следующим образом:
Get-Command -Module DSInternalsНайдите слабые пароли Active Directory с помощью командлета Test-PasswordQuality
Далее вам необходимо создать словарь паролей. Это будет простой текстовый файл со списком часто используемых, слабых и других плохих паролей. Файл словаря паролей можно скачать из Интернета или создать самостоятельно. Модуль DSInternal позволяет сравнивать хэши паролей ваших пользователей в Active Directory с хешами слов из этого файла. Сохраните пароли в текстовый файл PasswordDict.txt.
Теперь создайте небольшой скрипт PowerShell. В следующих переменных укажите путь к файлу паролей, имя домена и имя контроллера домена:
$DictFile = "C:\distr\PS\DSInternals\PasswordDict.txt"
$DC = "lon-dc01"
$Domain = "DC=active-directory,DC=loc"Затем с помощью командлета 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:
TEST\DefaultAccount
TEST\Guest
Passwords of these accounts have been found in the dictionary:
TEST\a.adams
TEST\jbrion
TEST\jsanti
These groups of accounts have the same passwords:
Group 1:
TEST\a.novak
TEST\Administrator
TEST\amuller
TEST\k.brown
Group 2:
TEST\a.adams
TEST\jbrion
TEST\jsanti
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:
TEST\a.adams
TEST\a.novak
TEST\Administrator
TEST\jbrion
TEST\jsanti
TEST\k.brown
TEST\krbtgt
Passwords of these accounts will never expire:
TEST\a.adams
TEST\Administrator
TEST\DefaultAccount
TEST\Guest
TEST\k.brown
TEST\krbtgt
TEST\web
These accounts are not required to have a password:
TEST\ADFS1$
TEST\DefaultAccount
TEST\Guest
These accounts that require smart card authentication have a password:
В предыдущих версиях модуля DSInternal
ShowPlainTextбыл доступен параметр для отображения пароля пользователя в открытом виде, если его хэш был найден в словаре. Он отсутствует в текущей версии Test-PasswordQuality. Если вы хотите использовать более старую версию модуля DSInternals, установите его командой:
Install-Module -Name DSInternals -RequiredVersion 2.23Поиск по хешу выполняется, включая историю паролей пользователей, хранящуюся в AD. Как видите, пользователи AD с простыми паролями были успешно найдены (пароли соответствуют словарю). Также было обнаружено несколько пользователей с одинаковыми паролями. Этот скрипт поможет вам найти учетные записи с простыми паролями, на которые распространяются специальные политики детальных паролей.
Для пользователей со слабыми паролями вы можете создать надежный случайный пароль и принудительно изменить его в AD через PowerShell.
Вы также можете выполнить автономное сканирование файла базы данных Active Directory (ntds.dit). Вы можете получить копию файла ntds.dit из теневой копии или из резервной копии контроллера домена.
Чтобы проверить хэши пользователей в автономном режиме в файле ntds.dit, используйте следующие команды:
$keyboot= Get-BootKey -SystemHiveFilePath 'C:\ADBackup\registry\SYSTEM'
Get-ADDBAccount -All -DatabasePath 'C:\ADBackup\ntds.dit -BootKey $keyboot | Test-PasswordQuality -WeakPasswordsFile $DictFileВы также можете экспортировать список всех хешей в текстовый файл:
Get-ADDBAccount -All -DBPath 'C:\ADBackup\ntds.dit' -Bootkey $keyboot | Format-Custom -View HashcatNT | Out-File c:\ps\ad_hashes.txt -Encoding ASCIIВстроенных инструментов для установки списка плохих паролей для доменных служб Active Directory нет. Однако с помощью защиты паролей AD Azure вы можете заблокировать определенные пароли (черный список) даже в локальной Active Directory.
Итак, используя этот сценарий, вы можете легко проанализировать качество паролей пользователей AD, их устойчивость к атакам методом перебора, сделать выводы о сложности текущей политики паролей домена и сделать необходимые выводы. Администраторы Active Directory могут (и должны) регулярно проводить этот аудит.


