StrongWind1/NTDSWolf

GitHub: StrongWind1/NTDSWolf

纯 Python 实现的离线 NTDS.dit 解析与凭据提取工具,支持从 Active Directory 数据库中提取全部对象属性并解密各类凭据材料。

Stars: 1 | Forks: 0

NTDSWolf

用于 Active Directory 取证、渗透测试和安全审计的离线 NTDS.dit 解析器和凭据提取工具。

CI Python 3.11+ License: Apache 2.0 Docs

指南安装CLI 参考

NTDSWolf 解析 Windows Active Directory NTDS.dit 数据库文件,有两个目标:转储目录持有的**所有内容** —— 每个对象的完整属性集 —— 并正确呈现所有凭据材料。它提取并解密 NT/LM 哈希(及历史记录)、Kerberos 密钥、WDigest、明文密码、信任密钥、LAPS 和 gMSA/dMSA 托管密码,并输出结构化数据(NDJSON/JSON/CSV)以及与 secretsdump 字节完全一致的 hashcat 和 pwdump 破解格式。 ## 为什么选择 NTDSWolf? - **转储所有内容** —— 每个对象都包含一个 `_unmapped` 字段,其中包含所有剩余的已存储和已链接的 LDAP 属性,因此数据库中的任何内容都不会被静默丢弃。 - **正确的凭据** —— NT/LM 哈希及历史记录、Kerberos 密钥(当前、以前和服务密钥)、WDigest、明文、信任密钥、LAPS 和 gMSA/dMSA 托管密码;hashcat 和 pwdump 输出与 secretsdump 字节完全一致。 - **纯 Python** —— 可在 Linux、macOS 和 Windows 上运行,无需依赖 .NET,也无需 impacket。 - **解析现代 NTDS.dit** —— 支持 Windows Server 2008 至 2025,包括 AES PEK 时代。 - **强类型并经过测试** —— 完整的类型提示、严格的 linting,以及覆盖解密和输出路径的测试套件。 ## 示例 将离线 `ntds.dit` + `SYSTEM` 配置单元中的每个凭据提取到与 secretsdump 完全相同的文件中: ``` $ ntdswolf ntds.dit --system SYSTEM --format pwdump [*] wrote hashes.ntds, hashes.ntds.kerberos, hashes.ntds.cleartext $ head -1 hashes.ntds Administrator:500:aad3b435b51404eeaad3b435b51404ee:7facdc498ed1680c4fd1448319a8c04f::: ``` ## 安装 使用 [uv](https://docs.astral.sh/uv/) 安装: ``` uv tool install git+https://github.com/StrongWind1/NTDSWolf ``` ## 快速开始 ``` # 使用自动检测的 SYSTEM hive 进行基本提取 ntdswolf ntds.dit # 显式指定 SYSTEM hive ntdswolf ntds.dit --system SYSTEM # 直接提供 boot key ntdswolf ntds.dit --bootkey aabbccdd11223344aabbccdd11223344 # 仅以 hashcat 格式提取密码 hash ntdswolf ntds.dit --system SYSTEM --format hashcat # 仅以 JSON 格式提取用户和组 ntdswolf ntds.dit --system SYSTEM --format json --extract users,groups # 使用 pwdump 输出进行完整提取 ntdswolf ntds.dit --system SYSTEM --format pwdump -o ./output/ ``` ## CLI 参考 ``` ntdswolf [OPTIONS] Arguments: ntds.dit Path to the NTDS.dit database file (required) Options: --system PATH Path to SYSTEM registry hive for boot key extraction --bootkey HEX Raw 32-character hex boot key (overrides --system) -o, --output PATH Output directory (default: ./ntdswolf-output/) -f, --format FORMAT Output format: ndjson, json, csv, hashcat, pwdump (default: ndjson) -e, --extract CLASSES Comma-separated object classes to extract: users, computers, groups, trusts, domains, all (default: all) -w, --workers N Number of parallel workers (default: 1) --no-history Exclude password history hashes --include-deleted Include deleted (tombstoned) objects (excluded by default) --naming MODE Object naming: dn, sam, cn (default: dn) --hashcat-username FIELD hashcat line username: sam, upn, rid, sid (default: sam) -v, --verbose Verbose logging to stderr -q, --quiet Suppress all non-error output --version Print version and exit ``` ## 输出格式 结构化格式(NDJSON、JSON、CSV)为每个对象类写入一个文件,其中包含精选的、已解码的字段,**外加**一个包含所有剩余已存储和已链接的 LDAP 属性的 `_unmapped` 字段(可打印 ASCII 值原样保留,其他内容则以十六进制编码),因此不会丢弃任何内容。`hashcat` 和 `pwdump` 格式仅输出用于破解的凭据材料。 ### NDJSON(默认) 每行一个 JSON 对象,每个对象类一个文件。兼容 `jq`、SIEM 摄取和流式解析器。 ``` ntdswolf ntds.dit --system SYSTEM --format ndjson # 输出:users.ndjson, computers.ndjson, groups.ndjson, ... ``` ``` {"_object_class": "user", "_dnt": 3802, "sAMAccountName": "Administrator", "objectSid": "S-1-5-21-...-500", "credentials": {"ntHash": "7facdc498ed1680c4fd1448319a8c04f", ...}, "_unmapped": {"primaryGroupID": 513, "codePage": 0, "logonCount": 42, ...}} ``` ### JSON 格式化的 JSON 数组,每个对象类一个文件。 ``` ntdswolf ntds.dit --system SYSTEM --format json # 输出:users.json, computers.json, ... ``` ### CSV 扁平的 CSV,每个对象一行。嵌套字段使用点表示法进行扁平化。 ``` ntdswolf ntds.dit --system SYSTEM --format csv # 输出:users.csv, computers.csv, ... ``` ### hashcat 以 `username:hash` 格式输出 NT 和 LM 哈希行,供 `hashcat --username` 使用,按对象类、哈希类型(NT/LM)和使用时期(当前/历史记录)拆分。默认情况下,用户名是 sAMAccountName;`--hashcat-username` 可将其切换为 `upn`、`rid` 或 `sid`。不输出 Kerberos 密钥(请使用 `pwdump` 获取这些密钥)。 ``` ntdswolf ntds.dit --system SYSTEM --format hashcat # 输出:ntlm__current.txt, ntlm__history.txt, # lm__current.txt, lm__history.txt ``` ``` # ntlm_user_current.txt Administrator:7facdc498ed1680c4fd1448319a8c04f # lm_user_current.txt(两个 8 字节的 LM 部分) Administrator:1122334455667788 Administrator:aabbccddeeff0011 ``` ### pwdump 兼容 secretsdump 的“新版 pwdump”输出 —— 与 `impacket-secretsdump -outputfile` 写入的文件逐字节相同:经典的 `username:rid:lm:nt:::` 行,以及 Kerberos 密钥和明文附属文件。 ``` ntdswolf ntds.dit --system SYSTEM --format pwdump # 输出:hashes.ntds, hashes.ntds.kerberos, hashes.ntds.cleartext ``` ``` # hashes.ntds Administrator:500:aad3b435b51404eeaad3b435b51404ee:7facdc498ed1680c4fd1448319a8c04f::: # hashes.ntds.kerberos Administrator:aes256-cts-hmac-sha1-96:6c2d8...e1 ``` ## 提取的数据 ### 凭据类型 **支持**的类型已被提取,并针对真实的 NTDS 数据库进行了验证。**已接入(未验证)**的解码器可在 pipeline 中运行,但尚未针对真实数据进行确认。 | 类型 | 来源属性 | 状态 | |---|---|---| | NT (NTLM) 哈希 | `unicodePwd` | 支持 | | LM 哈希 | `dBCSPwd` | 支持 | | NT 哈希历史 | `ntPwdHistory` | 支持 | | LM 哈希历史 | `lmPwdHistory` | 支持 | | Kerberos 密钥 (AES256, AES128, RC4, DES) | `supplementalCredentials` | 支持 | | Kerberos WS2025 密钥 (AES256-SHA384, AES128-SHA256) | `supplementalCredentials` | 支持 | | WDigest 哈希 | `supplementalCredentials` | 支持 | | 明文密码 | `supplementalCredentials` | 支持 | | NTLM-Strong-NTOWF | `supplementalCredentials` | 支持 | | Kerberos 先前密码 / 服务密钥 | `supplementalCredentials` | 支持 | | 信任密钥 (RC4 + AES,双向) | `trustAuthIncoming/Outgoing` | 支持 | | LAPS v1 密码 | `ms-Mcs-AdmPwd` | 支持 | | LAPS v2 明文 / 加密密码 | `msLAPS-Password` / `msLAPS-EncryptedPassword` | 支持 | | gMSA / dMSA 托管密码 | `msDS-ManagedPasswordId` | 支持 | | 密钥凭据 (WHfB/FIDO2) | `msDS-KeyCredentialLink` | 支持 | | DPAPI 备份密钥 (PVK + PEM) | `secret` 对象 | 已接入(未验证) | | BitLocker 恢复密钥 | `msFVE-RecoveryInformation` | 已接入(未验证) | 在结构化格式中,Kerberos 密钥显示为当前集合 (`kerberos`) 以及先前密码和服务集合(`kerberosOld` / `kerberosOlder` / `kerberosService`),并且完全解码的 `supplementalCredentials` blob 会原样保存在 `supplementalCredentialsRaw` 下。 ### 对象类型 pipeline 会解码每个对象的通用属性,并为以下类别添加特定于类的字段。**每个**对象 —— 无论其属于什么类 —— 都还包含一个 `_unmapped` 字段,其中包含所有剩余的已存储和已链接的 LDAP 属性,因此不会丢弃任何数据。 | 对象类 | 提取的特定类字段 | |---|---| | `user` | NT/LM 哈希 + 历史记录、sAMAccountName、UPN、userAccountControl(已解码标志)、sAMAccountType、账户时间戳、adminCount、组成员身份 | | `computer` | 与 user 相同,外加 dNSHostName 和操作系统信息 | | `group` | sAMAccountName、groupType、adminCount、成员(通过链接解析) | | `trustedDomain` | trustPartner、flatName、securityIdentifier、trustType / trustDirection / trustAttributes、已解密的信任密钥(RC4 + AES,双向) | | `msDS-*ManagedServiceAccount` | NT 哈希 + Kerberos 密钥;gMSA/dMSA 还可获取离线派生的 `managedPassword`(已针对 NT 哈希进行自我验证) | | `domainDNS` | 功能级别、密码和锁定策略字段 | | 所有其他 | 通用属性(DN、objectGUID、objectSid、名称、时间戳、isDeleted),以及在 `_unmapped` 下的所有剩余属性 | ## Windows Server 兼容性 | 服务器版本 | NTDS.dit 解析 | PEK 解密 | 哈希提取 | |---|---|---|---| | Server 2008 / 2008 R2 | 支持 | RC4 | 支持 | | Server 2012 / 2012 R2 | 支持 | RC4 | 支持 | | Server 2016 | 支持 | AES | 支持 | | Server 2019 | 支持 | AES | 支持 | | Server 2022 | 支持 | AES | 支持 | | Server 2025 | 支持 | AES | 支持 | ## 架构 NTDSWolf 使用三阶段处理 pipeline: 1. **打开** —— 通过 `dissect.database` 打开 ESE 数据库并加载 AD schema 2. **解密** —— 从 SYSTEM 配置单元(或原始十六进制)解析 boot key,并解锁 Password Encryption Keys 3. **提取** —— 遍历所有对象,将每个对象分发给其解码器,通过 dissect 原生解析链接,解密凭据,并写入输出 对象解码通过基于类的解码器注册表(`decoders/`)进行分发。当 `--workers` 大于 1 时,阶段 3 会在多个 worker 进程中运行,其产生的输出与单线程路径完全相同。 ``` ntdswolf/ cli/ Command-line interface (typer) core/ Pipeline orchestration, database wrapper, caches, worker pool crypto/ Boot key, PEK, and NT/LM hash decryption; trust/DPAPI/LAPS/key-credential parsers decoders/ Per-class object decoders and the decoder registry output/ Format writers (NDJSON, JSON, CSV, hashcat, pwdump) models/ Enums and flag definitions constants.py Spec-derived constants and well-known values ``` ## 依赖项 | 包 | 用途 | |---|---| | `dissect.database` | ESE 数据库解析、NTDS 对象模型、schema | | `dissect.regf` | 解析 SYSTEM 注册表配置单元以获取 boot key | | `dpapi-ng` | 用于 LAPS v2 的离线 MS-GKDI / DPAPI-NG 解密 | | `pycryptodome` | AES、DES、RC4、MD4、HMAC、PBKDF2 | | `typing-extensions` | 用于 Python 3.11 的 `@override` 向后兼容 | | `typer` | CLI 框架 | | `rich` | 进度条和彩色输出 | ## 退出代码 | 代码 | 含义 | |---|---| | 0 | 成功 | | 1 | 一般错误(I/O、无效参数) | | 2 | 无效或不可读的 NTDS.dit 文件 | | 3 | Boot key 验证失败(SYSTEM 配置单元错误) | | 4 | 部分提取(某些对象出现错误) | ## 相关工具 此集合中的其他项目: - [AD-SecretGen](https://github.com/StrongWind1/AD-SecretGen) —— 根据密码派生 AD 密码哈希和 Kerberos 密钥 - [CredWolf](https://github.com/StrongWind1/CredWolf) —— Active Directory 凭据验证 - [KerbWolf](https://github.com/StrongWind1/KerbWolf) —— Kerberos 烘焙和哈希提取工具包 - [Kerberos](https://github.com/StrongWind1/Kerberos) —— Active Directory 中的 Kerberos:协议、安全和攻击 ## 免责声明 NTDSWolf 仅供授权的数字取证、渗透测试和安全审计使用。您必须拥有明确的书面授权,才能访问和分析您使用它处理的任何 NTDS.dit 数据库。未经授权访问计算机系统和数据是违法的。作者对因使用此工具而造成的任何误用或损坏概不负责。 ## 许可证 [Apache License 2.0](LICENSE)
标签:Active Directory, Plaso, Python, 凭证提取, 数字取证, 无后门, 模拟器, 自动化脚本