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

Аудит надежности паролей пользователей в 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=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:
WINITPRODefaultAccount
WINITPROGuest
Passwords of these accounts have been found in the dictionary:
WINITPROaivanov
WINITPRObpetrov
WINITPROvsidorov
These groups of accounts have the same passwords:
Group 1:
WINITPROanovak
WINITPROAdministrator
WINITPROgpetrov
WINITPROdkarpov
Group 2:
WINITPRObpetrov
WINITPROvsidorov
WINITPROaivanov
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:
WINITPROAdministrator
WINITPROkrbtgt
Passwords of these accounts will never expire:
WINITPROAdministrator
WINITPRODefaultAccount
WINITPROGuest
WINITPROkrbtgt
WINITPROweb
These accounts are not required to have a password:
These accounts that require smart card authentication have a password:

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

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

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: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 могут (и даже должны) выполнять регулярно.

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