StrongWind1/PassWolf
GitHub: StrongWind1/PassWolf
一款符合规范的 Active Directory 密码更改、重置及策略读取工具,覆盖 impacket 缺失的 AES 路径以兼容 Server 2025 域控。
Stars: 1 | Forks: 0
PassWolf
正确且符合规范的 Active Directory 密码更改、重置及策略读取,通过 SAMR、Netlogon、LSA、Kerberos 和 LDAP 进行 —— 包括 impacket 所缺乏的 AES 路径。
一个控制台命令 `passwolf`,包含三个子命令 —— `passwolf change`、`passwolf reset` 和 `passwolf policy` —— 它们实现了所有已记录和未记录的 Windows 方法,用于通过 SAMR、Netlogon、LSA、Kerberos kpasswd 和 LDAP 更改或重置账户密码或哈希,以及读取有效的密码策略。Windows Server 2025 域控制器强化了旧版 RC4 SAMR 更新操作码,并仅接受 AES SAMR 更新(`SamrUnicodeChangePasswordUser4`,opnum 73)来替代它们;passwolf 支持该 AES 更新,以及更多功能。 ## 为什么分离工具 更改和重置是具有不同安全模型的不同操作,将它们混为一谈是捆绑工具中几个棘手问题的根源。passwolf 有意将它们分开: - `passwolf change` 证明账户当前的机密(密码或 NT hash),并且不需要对目标拥有任何权限。它受完整的域密码策略约束。 - `passwolf reset` 是一种特权覆盖操作,不需要证明旧机密。它绕过了最短密码期限和历史记录限制,并要求调用者具有重置权限。 - `passwolf policy` 读取有效的密码和锁定策略(域策略、任何适用的 PSO 以及配置的 SYSVOL GPO 意图),以便您可以在尝试更改之前查看必须满足的约束条件。 ## 覆盖范围 以下每种方法都映射到其 Microsoft 开放规范章节,并针对运行的域控制器(Server 2022 build 20348 和 Server 2025 build 26100)进行了验证。 ### 更改方法 (`passwolf change`) | 方法 | 协议 / opnum | 备注 | |---|---|---| | `samr-aes` | SAMR 73, `SamrUnicodeChangePasswordUser4` | AES;Server 2025 唯一接受的 SAMR 更改 | | `samr-rc4` | SAMR 55, `SamrUnicodeChangePasswordUser2` | 旧版 RC4;支持 pass-the-hash | | `samr-oem` | SAMR 54, `SamrOemChangePasswordUser2` | OEM/LM RC4;需要存储的 LM hash 且密码 ≤14 个字符 | | `samr-des` | SAMR 38, `SamrChangePasswordUser` | DES OWF 交叉加密;需要用户句柄;可以通过 `--target-new-hash` 使用 NT hash 设置新密码 | | `samr-diag` | SAMR 63, `SamrUnicodeChangePasswordUser3` | 未记录;返回结构化的策略拒绝原因 | | `kpasswd` | Kerberos 464, 版本 `0x0001` | RFC 3244 更改协议 | | `ldap` | LDAP unicodePwd 删除 + 添加 | 默认为密封的 389 端口,无需证书 | | `netlogon-aes` | Netlogon 30, `NetrServerPasswordSet2` | 计算机/信任,通过密封通道的 AES NL_TRUST_PASSWORD | | `netlogon-des` | Netlogon 6, `NetrServerPasswordSet` | 计算机/信任,DES OWF;Server 2025 仍然接受 | | `rap` | RAP 操作码 115,通过 SMB1 的 `NetUserPasswordSet2` | 废弃的明文仅 LM 路径;在现代主机上无法使用 NTLM | | `rap-oem` | RAP 操作码 214,通过 SMB1 的 `SamOEMChangePasswordUser2` | 旧版 OEM/LM RC4;适用于存储 LM hash 的 SMB1 主机 | ### 重置方法 (`passwolf reset`) | 方法 | 协议 / opnum | 备注 | |---|---|---| | `samr-aes` | SAMR 58 + UserInternal7 | AES 明文重置(UserInternal7 信息级别) | | `samr-rc4` | SAMR 58 + UserInternal4InformationNew | 旧版 RC4 + MD5 加盐的明文重置 | | `samr-hash` | SAMR 37 + UserInternal1 | 直接设置 NT OWF(完全绕过策略) | | `kpasswd` | Kerberos 464, 版本 `0xFF80` | RFC 3244 设置协议,带有目标名称和 realm | | `ldap` | LDAP unicodePwd 替换 | 默认为密封的 389 端口 | | `dsrm` (`--dsrm`) | SAMR 66, `SamrSetDSRMPassword` | DC 本地恢复 (RID 500) 密码;使用专用的 `--dsrm` 标志选择 | `auto` 是这两个操作的默认值。对于 `passwolf change`,它优先使用 DC 接受的最强 SAMR 更改(AES),并且仅在 AES 确实不可用时才回退到 RC4,绝不会仅仅为了兼容性而回退。对于 `passwolf reset`,它会遍历一个跨方法的阶梯 —— kpasswd、LDAPS、LDAP,然后是 SAMR 重置(AES、RC4、RC4-unsalted、set-hash)—— 并采用第一个成功的方法。 在 **Windows Server 2025** 上,Kerberos 设置(`kpasswd`)、LDAP `unicodePwd` 替换(`ldap`)和 AES SAMR RPC 重置(`samr-aes`,`SamrSetInformationUser2` opnum 58 + UserInternal7)都可以工作 —— 已针对 Server 2025 域控制器进行了实时确认。2025 的 RC4 强化(CVE-2021-33757 / KB5004605)阻止了旧版 SAMR 的*更改*,而不是重置,因此没有 `passwolf reset` 方法在那里被阻止。 当目标的密码过期或被标记为下次登录时必须更改时,`passwolf change` 会通过空会话重试 SAMR 绑定并完成更改。这涵盖了基于缓冲区的方法(`samr-aes`、`samr-rc4`、`samr-oem`、`samr-diag` 和 `auto`);基于句柄的 `samr-des` 无法使用空会话路径。 ### 身份验证 默认情况下,所有三个子命令都使用 NTLM 进行绑定,或者通过 `-k` / `--kerberos` 使用 Kerberos。在 `-k` 模式下,如果 `KRB5CCNAME` 指定的票据缓存包含可用的 TGT,该工具将使用该缓存,否则它将使用提供的密码或 NT hash 从 `--dc` 获取 TGT;无论哪种方式,都会跳过交互式绑定密码提示。 ## 安装说明 passwolf 使用 [uv](https://docs.astral.sh/uv/) 管理。 ``` uv tool install git+https://github.com/StrongWind1/PassWolf ``` 或者在不安装的情况下从检出的代码中运行它: ``` uv run passwolf change --help uv run passwolf reset --help uv run passwolf policy --help ``` ## 示例 ``` # 在 Server 2025 DC 上的自更改(自动选择 AES opnum 73)。 passwolf change --target-domain SNOW --target-user jdoe --dc dc.snow.lab --target-old-password 'OldPass1!' --target-new-password 'NewPass1!' # Pass-the-hash 更改。 passwolf change --target-domain SNOW --target-user jdoe --dc dc.snow.lab --target-old-hash 47c4cc3a368a4a0fa79a7bf059b7adba --target-new-password 'NewPass1!' # 在更改时通过 NT hash 设置新密码(DES 更改,证明旧 secret,无需 privilege)。 passwolf change --target-domain SNOW --target-user jdoe --dc dc.snow.lab --target-old-password 'OldPass1!' --target-new-hash 47c4cc3a368a4a0fa79a7bf059b7adba # 更改已过期或下次登录时必须更改的密码(通过 null session 重试)。 passwolf change --target-domain SNOW --target-user jdoe --dc dc.snow.lab --target-old-password 'Expired1!' --target-new-password 'NewPass1!' # Privileged 重置,AES cleartext 路径,作为 admin。 passwolf reset --target-domain SNOW --target-user jdoe --dc dc.snow.lab --auth-as-user Administrator --auth-as-password 'Admin1!' --target-new-password 'NewPass1!' # 直接设置 NT hash(不重新生成 Kerberos keys)。 passwolf reset --target-domain SNOW --target-user jdoe --dc dc.snow.lab --auth-as-user Administrator --auth-as-password 'Admin1!' --target-new-hash 47c4cc3a368a4a0fa79a7bf059b7adba # 通过 Netlogon secure channel 轮换计算机账户密码。 passwolf change --target-domain SNOW --target-user 'WS01$' --dc dc.snow.lab --account machine --target-old-password 'curr3nt' --target-new-password 'n3wer' --netbios SNOW # 通过 sealed 389 进行 LDAP 更改(无需 LDAPS certificate 即可工作)。 passwolf change --target-domain SNOW --target-user jdoe --dc dc.snow.lab --method ldap --target-old-password 'OldPass1!' --target-new-password 'NewPass1!' # 使用 KRB5CCNAME 中的 ticket 进行 Kerberos bind(无需 bind 密码)。 passwolf change --target-domain SNOW --target-user jdoe --dc dc.snow.lab -k --target-old-password 'OldPass1!' --target-new-password 'NewPass1!' ``` ## 输出格式 `--format text`(默认)打印一行可供 grep 搜索的状态信息,`--format json` 打印单个 JSON 对象,而 `--format pretty` 渲染一个富文本面板。结果始终会精确解码 NTSTATUS,从而可以区分旧密码错误、策略拒绝和禁用的方法。 ## 独特之处 - AES 更改(opnum 73)和 AES 重置信息级别(UserInternal7)是 Server 2025 DC 所要求的,两者都在此处实现。 - LDAP 路径默认使用带有 SASL 签名和密封绑定的纯 389 端口,因此它无需 LDAPS 证书即可工作,而不需要 `ldaps://`。 - 未记录的 SAMR opnum 63 返回更改被拒绝的结构化原因。 - 精确的 NTSTATUS 解码以及严格的更改与重置分离。 ## 限制和注意事项 - 重置明文信息级别使用 SMB 会话密钥作为其内容加密密钥,因此它们需要 SMB 命名管道传输,而不是直接 TCP。 - OEM 更改和 LDAP 更改需要明文旧密码(LM hash 和 unicodePwd 删除值无法由 NT hash 生成)。 - Netlogon 和 DSRM 重置分别针对计算机/信任和 RID-500 恢复账户,而不是任意用户。 ## 开发 ``` make install-dev # uv sync make check # ruff check + ruff format --check + ty + pytest + docs make format # ruff format + ruff check --fix ``` ## 相关工具 该集合中的其他项目: - [AD-SecretGen](https://github.com/StrongWind1/AD-SecretGen) - 从密码派生 AD 密码哈希和 Kerberos 密钥 - [NTDSWolf](https://github.com/StrongWind1/NTDSWolf) - 离线 NTDS.dit 解析器和凭据提取器 - [CredWolf](https://github.com/StrongWind1/CredWolf) - Active Directory 凭据验证 - [KerbWolf](https://github.com/StrongWind1/KerbWolf) - Kerberos 烘焙和哈希提取工具包 - [Kerberos](https://github.com/StrongWind1/Kerberos) - Active Directory 中的 Kerberos:协议、安全和攻击 ## 免责声明 PassWolf 仅用于授权的渗透测试、红队交战和安全审计。在 Active Directory 环境中更改或重置任何账户机密之前,您必须获得系统所有者的明确书面许可。未经授权访问计算机系统是非法的。作者不对任何滥用或该工具造成的损害负责。 ## 许可证 [Apache License 2.0](LICENSE)标签:Checkov, HTTP, LDAP, SAMR, 协议实现, 密码修改, 活动目录, 逆向工具