自4月14日起,NuID 将不再托管此代码所通信的 NebulousAD API。作为一个小型开发团队,我们发现无法同时有效支持、监控和开发 NebulousAD 门户以及我们的认证 开发者门户。
检查 Active Directory 密码是否属于公开泄露凭据集的代码将继续保留在此仓库中。我们将在未来几个月内,将大家通过 NebAD 体验中给予的宝贵反馈整合到我们的认证 API 中,以提供无缝的密码黑名单服务。敬请期待!
感谢大家过去参与和反馈,期待未来继续交流。如有任何关于 NebAD、NuID 或数字身份相关的问题,欢迎随时联系我们。
再见! -NuID 团队
NebulousAD 是一个用于审计 Active Directory 用户密码是否存在于数据泄露中已泄露密码数据库的工具。该工具旨在帮助 Windows 系统管理员发现并(可选)修复使用已泄露密码的问题。此方法符合 NIST 800-63B 的建议,有助于防范凭据喷洒和凭据填充攻击。
Nebulous 数据库目前包含超过 25 亿个泄露密码的唯一哈希值。
NebulousAD 默认使用 k-匿名模型来保护向 API 检查的密码的隐私和安全。仅发送 SHA-2 哈希的前五个字符到 API。您可以在 此处 了解更多关于 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 指向文件。这对于审计旧快照很有用。
这需要来自 https://nebulous.nuid.io/#/register 的 API 密钥。获得密钥并使用 -init-key 安装后,您可以对照 NuID API 检查哈希。
如果您指定了 -history,它还将检查每个帐户的密码历史记录,以查看用户以前使用过的密码是否已被泄露。
添加输出,指示帐户在 Active Directory 中是启用还是禁用。
添加输出,指示帐户密码最后设置的日期。 这在检测违反安全策略的帐户(例如未按照 GPO 定义自动重置的服务帐户)时非常有用。
同时审计或转储帐户存储的密码历史记录。
在擦除快照时使用 DoD 7 次覆写。这需要将 sdelete.exe 放在您的路径中。您可以在此处获取: https://docs.microsoft.com/en-us/sysinternals/downloads/sdelete
只需下载并将其放在您的 %SYSTEMDRIVE\Windows\System32\ 目录中,或设置环境变量。
当将此应用程序设置为与任务计划程序一起运行时,清理备份非常有用。在较大的域中,SYSTEM 配置单元和 .dit 文件可能相当大,占用大量磁盘空间。
如果您使用任务计划程序进行每日审计,可以这样使用此选项:-clean-old-snaps 7 以仅存储 1 周的快照。
如果我们检测到旧的快照,默认情况下会将其备份到 %SYSTEMDRIVE%\Program Files\NuID\snapshot-backups。
这是因为 ntdsutil.exe 需要空目录。
如果要禁用此备份并直接覆盖当前快照,请使用此参数。
提供了一个 RESTful Web API,允许用户使用生成的 NuID API 令牌构建自己的自定义客户端。本节概述了 Web API 的正确功能、有效请求、错误类型等。
每个响应的基本结构都是相同的。无例外,响应必须包含以下三个字段:success、data 和 error。收到响应后,首先要确定 success 的值。这将决定您应该继续处理 data 对象,还是处理 error 对象。以下示例显示了成功和失败情况下来自服务器的通用响应:
{
success: True, // 表示请求成功完成
data: {
/* 值取决于查询的端点 */
},
error: {} // 空
}
{
success: False, // 表示请求未成功完成
data: { }, // 空
error: {
"ErrorName": "关于请求期间发生错误的帮助性描述"
}
}
每个错误都提供了请求过程中出错的线索,使用户能够进行必要的更改。
| 错误名称 | 描述 | 状态码 |
|---|---|---|
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 |
目前仅支持一种 hash_type。这些值(不区分大小写)可用于替代 hash_type。同时提供了 hash_value 的十六进制字符串表示的大小。hash_prefix 不能超过此大小:
| 哈希 | 长度 |
|---|---|
| NTLMSHA2 | 64 |
所有 API 端点请求必须提供以下 HTTP 头,否则将返回错误:
X-NUID-API-KEY: <您的 NuID API 密钥>
每个端点以以下 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": "<哈希前缀>"
}
描述: 使用哈希的匿名化版本查询哈希数据库。可以提供完整哈希,也可以使用至少 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] 联系我们。