Аудит надежности паролей пользователей в Active Directory

Сложность пароля пользователя в домене 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).

Примечание . Пароли пользователей из базы AD, естественно, не получится получить в открытом виде. Однако можно сравнить хеши паролей пользователей AD с хешами слов из словаря и найти слабые пароли.

В PowerShell версии 5 (и выше) вы можете установить модуль DSInternals онлайн из официальной галереи скриптов PowerShell так:

Install-Module DSInternals

Для предыдущих версий PowerShell и на изолированных системах придется скачать zip архив с последней версией модуля с GitHub ( https://github.com/MichaelGrafnetter/DSInternals/releases ). На момент написания статьи последний релиз — DSInternals v4.4.1 . Распакуйте содержимое архива в один из каталогов с модулями PowerShell:

  • C:Windowssystem32WindowsPowerShellv1.0ModulesDSInternals
  • C:Users%username%DocumentsWindowsPowerShellModulesDSInternals

Или можно импортировать модуль DSInternals командой:

Import-Module C:distrPSDSInternalsDSInternals.psd1

Если при импорте модуля появится ошибка “cannot be loaded because running scripts is disabled on this system”, нужно разрешить запуск PowerShell скриптов хотя бы в текущей сессии:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass –Force

Список доступных командлетов модуля можно получить так:

Get-Command -Module DSInternals

powershell модуль DSInternals установка в Windows Server 2016

Поиск слабых паролей в AD с помощью командлета Test-PasswordQuality

Далее необходимо создать словарь паролей. Это будет простой тестовый файл со списком распространениях используемых, слабых и других плохих паролей. Вы можете скачать словарь паролей из Интернета или создать его самостоятельно. Модуль DSInternal позволит сравнить хэши паролей ваших пользователей в Active Directory с хэшами слов из этого файла. Сохраните пароли в текстовый файл PasswordDict.txt .

файл-словарь со списком распространенных паролей

Теперь создайте небольшой PowerShell скрипт. В следующих переменных укажите путь к файлу с паролями, имя домена и контроллера домена.

$DictFile = "C:PSPasswordDict.txt"
$DC = "msk-dc01"
$Domain = "DC=remontka,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_x000D_---------------------------------------_x000D_ Passwords of these accounts are stored using reversible encryption:_x000D_LM hashes of passwords of these accounts are present:_x000D_These accounts have no password set:_x000D_WINITPRODefaultAccount_x000D_WINITPROGuest_x000D_Passwords of these accounts have been found in the dictionary:_x000D_WINITPROaivanov_x000D_WINITPRObpetrov_x000D_WINITPROvsidorov_x000D_These groups of accounts have the same passwords:_x000D_Group 1:_x000D_WINITPROanovak_x000D_WINITPROAdministrator_x000D_WINITPROgpetrov_x000D_WINITPROdkarpov_x000D_Group 2:_x000D_WINITPRObpetrov_x000D_WINITPROvsidorov_x000D_WINITPROaivanov_x000D_These computer accounts have default passwords:_x000D_Kerberos AES keys are missing from these accounts:_x000D_Kerberos pre-authentication is not required for these accounts:_x000D_ Only DES encryption is allowed to be used with these accounts:_x000D_These administrative accounts are allowed to be delegated to a service:_x000D_WINITPROAdministrator_x000D_WINITPROkrbtgt_x000D_Passwords of these accounts will never expire:_x000D_WINITPROAdministrator_x000D_WINITPRODefaultAccount_x000D_WINITPROGuest_x000D_WINITPROkrbtgt_x000D_WINITPROweb_x000D_These accounts are not required to have a password:_x000D_These accounts that require smart card authentication have a password:_x000D_

Test-PasswordQuality поиск простых и повторяющихся паролей в Active Directory

В текущей версии командлета Test-PasswordQuality отсутствует параметр ShowPlainText , который позволял вывести на экран пароль в открытом виде, если его хэш был найден в словаре. Если нужно использовать старую версию модуля DSInternals. установите ее командой:

Install-Module -Name DSInternals -RequiredVersion 2.23

Поиск по хэшам выполняется в том числе по истории паролей пользователей, хранящейся в AD. Как вы видите, были успешно найдены пользователи AD с простыми паролями (пароли совпадают со словарем). Также найдены несколько пользователей с одинаковыми паролями. Этот сценарий поможет вам найти аккаунты с простыми паролями, для которых действуют кастомные парольные политики Fine-Grained Password Policies .

Для найденных пользователей с простыми паролями вы можете сгенерировать случайные пароли и сменить их принудительно через PowerShell.

Также вы можете выполнить офлайн сканирование файла базы данных Active Directory (ntds.dit). Вы можете получить копию файла ntds.dit из теневой копии или резервной копии контроллера домена .

Для офлайн проверки хэшей в файле ntds.dit воспользуйтесь такими командами:

$keyb= Get-BootKey -SystemHiveFilePath 'C:ADBackupregistrySYSTEM'
Get-ADDBAccount -All -DatabasePath 'C:ADBackupntds.dit -BootKey $keyb| Test-PasswordQuality -WeakPasswordsFile $DictFile

Также можно выгрузить список всех хэшей в текстовый файл:

Get-ADDBAccount -All -DBPath 'C:ADBackupntds.dit' -Bootkey $keyb | Format-Custom -View HashcatNT | Out-File c:psadhashes.txt -Encoding ASCII

В ADDS нет встроенных инструментов для ведения списка запрещенных паролей. Однако с помощью Azure AD Password Protection вы можете блокировать определенные пароли (черный список) даже в on-premises Active Directory.

Итак, мы рассмотрели, как выполнить анализ качества паролей пользователей AD, их устойчивости перед брутфорсом по словарю, оценить используемую политику сложности паролей в домене, ну и сделать организационные выводы :). Такой аудит администраторы Active Directory могут (и даже должны) выполнять регулярно.

EnglishRussianUkrainian