
NebulousAD — инструмент автоматизированного аудита учётных данных.
Начиная с 14 апреля NuID больше не будет размещать API NebulousAD, с которым взаимодействует этот код. Будучи небольшой командой разработчиков, мы поняли, что не можем активно поддерживать, отслеживать и разрабатывать одновременно портал NebulousAD и наш Портал разработчика по аутентификации.
Код для проверки паролей Active Directory на предмет утечек из публичных баз скомпрометированных учётных данных продолжит жить в этом репозитории, и в ближайшие месяцы мы учтём все отличные отзывы, полученные во время работы с NebAD, чтобы предоставить бесшовный сервис чёрных списков паролей вместе с нашим API аутентификации. Так что следите за обновлениями!
Мы ценим ваше участие и отзывы в прошлом и ждём от вас обращений в будущем. Если у вас есть вопросы о NebAD, NuID или любой теме, связанной с цифровой идентификацией, не стесняйтесь обращаться к нам.
До скорого! — команда NuID
NebulousAD — это инструмент для аудита паролей пользователей Active Directory на наличие в базе скомпрометированных паролей, найденных в утечках данных. Инструмент создан для помощи системным администраторам Windows в поиске и, при необходимости, устранении использования скомпрометированных паролей. Такой подход рекомендуется стандартом NIST 800-63B и может помочь защититься от атак с перебором учётных данных (credential spraying) и подстановкой учётных данных (credential stuffing).
База данных Nebulous в настоящее время содержит более 2,5 миллиардов уникальных хешей скомпрометированных паролей.
По умолчанию NebulousAD использует модель k-анонимности, чтобы сохранить конфиденциальность и безопасность паролей, проверяемых через API. В API отправляются только первые пять символов хеша SHA-2. Подробнее о k-анонимности можно прочитать здесь.
Инструмент был впервые представлен на BSides Las Vegas 2019. Видео презентации BSides доступно здесь.
Предстоящие функции:
Просто загрузите предварительно скомпилированный релиз (не требует интерпретатора Python) или соберите из исходного кода:
Этот инструмент требует Python2.7 (пока что).
Запустите git clone https://github.com/NuID/nebulousAD.git
Затем установите с помощью python setup.py install
После этого инициализируйте свой ключ. Получить ключ можно, посетив: https://nebulous.nuid.io/#/register После регистрации нажмите кнопку для генерации ключа API и скопируйте его.
Теперь вы можете инициализировать ключ так: nebulousAD -init-key <api_key>
Теперь вы можете запускать инструмент. Если он не может найти ваш ключ API, возможно, потребуется перезапустить сеанс терминала. Ключ API хранится в переменной окружения. Выход и повторный вход также работают.
Вы можете загрузить файл nebulousAD.exe для использования без интерпретатора здесь. Либо скомпилируйте инструмент самостоятельно из исходного кода:
pip install pyinstallergit clone https://github.com/NuID/nebulousAD.gitcd .\nebulousAD\nebulousADpyinstaller --onefile nebulousAD.pyPyinstaller выведет путь к скомпилированному бинарнику:

Пример команды для дампа всех хешей и проверки их через API:
nebulousAD.exe -v -snap --check
NuID Credential Auditing tool.
optional arguments:
-h, --help show this help message and exit
-ntds NTDS NTDS.DIT file to parse
-system SYSTEM SYSTEM registry hive to parse
-csv CSV Output results to CSV file at this PATH.
-json JSON Output results to JSON file at this PATH
-init-key INIT_KEY Install your Nu_I.D. API key to the current users
PATH.
-c, --check Check against Nu_I.D. API for compromised
credentials.
-dk, --disable-k-anon
Disable k-anon hash searches against the API (speeds
up the audit).
-snap Use ntdsutil.exe to snapshot the system registry
hive and ntds.dit file to <systemDrive>:\Program
Files\NuID\
-shred When performing delete operations on files, use a 7
pass overwrite with sdelete.exe. Download here:
https://docs.microsoft.com/en-
us/sysinternals/downloads/sdelete
-no-backup Do not backup the existing snapshots, just overwrite
them instead.
-clean-old-snaps CLEAN_OLD_SNAPS
Clean backups older than N days.
display options:
-user-status Display whether or not the user is disabled
-pwd-last-set Shows pwdLastSet attribute for each account found
within the NTDS.DIT database.
-history Dump NTLM hash history of the users.
-v Enable verbose mode.
Отключает функцию проверки хеша с k-анонимностью. Это полезно для ускорения поиска, но при этом полный хеш SHA-256(NTLM) будет отправлен в API. Мы не логируем и не храним хеши, отправленные в API.
Параметр -snap автоматически создаёт снимок Active Directory (с помощью ntdsutil.exe) и извлекает файл ntds.dit, а также куст реестра SYSTEM, если у вас есть соответствующие привилегии. Вы можете извлечь их вручную любым другим способом или с помощью утилиты ntdsutil.exe.
При ручном извлечении вы можете указать пути к файлам с помощью -system path\to\SYSTEM и -ntds path\to\ntds.dit. Это полезно, если вы хотите проверить старые снимки.
Требуется ключ API с https://nebulous.nuid.io/#/register. После получения ключа и его установки с помощью -init-key вы можете проверять хеши через API NuID.
Если указан -history, будет также проверяться история паролей каждой учётной записи на предмет того, был ли ранее использованный пароль скомпрометирован.
Добавляет вывод, указывающий, включена (Enabled) или отключена (Disabled) учётная запись в Active Directory.
Добавляет вывод с датой последней смены пароля учётной записи. Это может быть полезно для выявления нарушений политики безопасности учётных записей, которые не сбрасываются автоматически в соответствии с GPO, например, сервисных учётных записей.
Также проверяет или выгружает историю паролей учётных записей.
Использует семипроходное перезаписывание DoD при уничтожении снимков. Для этого требуется наличие sdelete.exe в вашем PATH. Скачать можно здесь: https://docs.microsoft.com/en-us/sysinternals/downloads/sdelete
Просто загрузите его и поместите в каталог %SYSTEMDRIVE\Windows\System32\ или настройте переменную окружения.
Полезно для очистки резервных копий при запуске приложения с помощью Планировщика задач. Куст SYSTEM и файл .dit могут быть довольно большими в крупных доменах и занимать много дискового пространства.
Если вы используете Планировщик задач для ежедневного аудита, вы можете использовать этот параметр так: -clean-old-snaps 7, чтобы хранить только недельный архив снимков.
Если обнаружен старый снимок, по умолчанию создаётся его резервная копия в %SYSTEMDRIVE%\Program Files\NuID\snapshot-backups. Это связано с тем, что ntdsutil.exe требует пустого каталога.
Если вы хотите отключить это резервное копирование и просто удалить текущий снимок, используйте этот аргумент.
Предоставляется RESTful веб-API, которое позволит пользователям использовать токен API NuID, после его генерации, для вашего собственного пользовательского клиента. В этом разделе описывается правильная функциональность веб-API, корректные запросы, типы ошибок и т.д.
Базовая структура каждого ответа будет одинаковой. Без исключений ответы должны содержать следующие три поля: success, data и error. Первым делом при получении ответа необходимо проверить значение success. Это определит, следует ли обрабатывать объект data или объект error. Следующие примеры показывают типичные ответы сервера в случае успеха и неудачи:
{
success: True, // Indicates the request completed successfully
data: {
/* value depends on endpoint queried */
},
error: {} // Empty
}
{
success: False, // Indicates the request did not complete successfully
data: { }, // Empty
error: {
"ErrorName": "Helpful description of the error that occurred during the request"
}
}
Каждая ошибка даёт понимание того, что пошло не так во время запроса, позволяя пользователю внести необходимые изменения.
На данный момент поддерживается только один hash_type. Эти значения (без учёта регистра) могут использоваться в качестве hash_type. Также указан размер шестнадцатеричного строкового представления hash_value. hash_prefix не может превышать этот размер:
| Хеш | Длина |
|---|---|
| NTLMSHA2 | 64 |
Следующий HTTP-заголовок должен быть предоставлен во всех запросах к конечным точкам API, иначе будет возвращена ошибка:
X-NUID-API-KEY: <Your NuID API Key>
Каждая конечная точка начинается со следующего URL:
https://nebulous.nuid.io
/api/search/kanon/<hash_type>/<hash_prefix>Метод: GET
Описание: Запрос к базе хешей с использованием анонимизированной версии хеша. Можно указать полный хеш, но также можно использовать частичный хеш в виде префикса длиной не менее 5 символов. Все хеши в базе Nebulous, соответствующие этому префиксу, будут возвращены без раскрытия точного хеша.
Ответ:
Ответ от следующего URL: https://nebulous.nuid.io/api/search/kanon/5f4dcc
{
"success": true,
"data": {
"matches": [
"5f4dcc3010a3b4ffd56ec97b33a0f837",
"5f4dcc3b5aa765d61d8327deb882cf99",
"5f4dcc3b5bef0f9cc4c0f96d758010b8"
]
},
"error": {}
}
/api/search/kanon/<hash_type>Метод: POST Данные POST:
{
"prefix": "<Hash Prefix>"
}
Описание: Запрос к базе хешей с использованием анонимизированной версии хеша. Можно указать полный хеш, но также можно использовать частичный хеш в виде префикса длиной не менее 5 символов. Все хеши в базе Nebulous, соответствующие этому префиксу, будут возвращены без раскрытия точного хеша.
Ответ:
Ответ от следующего URL: https://nebulous.nuid.io/api/search/kanon с данными {"prefix": "5f4dcc"}
{
"success": true,
"data": {
"matches": [
"5f4dcc3010a3b4ffd56ec97b33a0f837",
"5f4dcc3b5aa765d61d8327deb882cf99",
"5f4dcc3b5bef0f9cc4c0f96d758010b8"
]
},
"error": {}
}
Похоже, в impacket есть ошибка, из-за которой не удаётся правильно извлечь nthash.
Пока избегайте использования аргумента -history.
https://github.com/SecureAuthCorp/impacket/issues/395 https://github.com/SecureAuthCorp/impacket/issues/660
Свяжитесь с нами по адресу [email protected]
| Имя ошибки | Описание | Код состояния |
|---|
ActionExpired | Вызванное действие истекло и больше недействительно | 401 |
ActionInvalid | Вызванное действие не существует | 401 |
AuthFailure | Неверная комбинация пользователя/пароля | 401 |
AuthMissingToken | Не предоставлен токен аутентификации | 401 |
FieldMissing | Одно или несколько полей отсутствуют в JSON-запросе | 422 |
HashInvalidLength | Предоставленный хеш не соответствует ожидаемой длине для данного типа хеша | 422 |
HashInvalidValue | Ожидается шестнадцатеричное представление хеша | 422 |
HashInvalidPrefix | Префикс должен иметь минимальную длину 5 символов | 422 |
HashUnsupported | Указанный тип хеша не поддерживается | 422 |
InvalidJWT | Предоставленный JWT недействителен | 401 |
InvalidRequest | Запрос был неправильно сформирован или отсутствует JSON-нагрузка | 422 |
KeyBadUser | Предоставленный ключ API не соответствует ожидаемому пользователю | 401 |
KeyDisabled | Предоставленный ключ API отключён | 403 |
KeyInvalid | Предоставленный ключ API недействителен | 401 |
KeyMissing | Не предоставлен ключ API | 401 |
NotFound | Запрашиваемая конечная точка недействительна | 404 |
PasswordIncorrect | Текущий пароль не совпадает | 401 |
UserDisabled | Учётная запись в настоящее время отключена | 401 |
UserKeyLimit | Достигнуто максимальное количество ключей API | 403 |
UserNotActivated | Учётная запись пользователя ещё не активирована | 403 |
UserNotFound | Учётная запись пользователя не найдена | 401 |