sabkari-mohamed/ADRecon-X
GitHub: sabkari-mohamed/ADRecon-X
ADRecon-X 是一套 Active Directory 全频谱渗透测试自动化工具,通过六阶段流水线整合枚举、攻击与报告,解决 AD 安全评估中多工具手动编排的效率瓶颈。
Stars: 0 | Forks: 0
# ADRecon-X



**全频谱 Active Directory 渗透测试自动化套件。**
ADRecon-X 连接到 Active Directory Domain Controller 并在一步运行中自动执行从侦察到攻击面的完整工作流:LDAP 枚举、Kerberoasting 和 AS-REP roasting、非破坏性 DCSync 权限测试、SMB 共享收集、ADCS / ESC 错误配置检测、从收集的数据中生成目标字典、具备**锁定感知**能力并支持**凭证链接**的密码喷射、风险评分,以及专业的终端 / JSON / HTML 报告。
它是安全社区工具之上的一个编排层 —— 主要是 [Impacket](https://github.com/fortra/impacket) 和 [Certipy](https://github.com/ly4k/Certipy)。
## 架构 — 6 阶段流程
```
┌──────────────────────────────────────────────────────────┐
│ ADRecon-X │
└──────────────────────────────────────────────────────────┘
Phase 1 ── LDAP Enumeration ──────────────────────────────────────
users · groups · computers · OUs · password policy · delegation
│ (seeds every later phase)
▼
Phase 2 ── Kerberos Attacks ──────────────────────────────────────
Kerberoast (SPN→TGS) AS-REP roast (no-preauth)
│
▼
Phase 3 ── Attack Surface ────────────────────────────────────────
Impacket ops SMB looting ADCS / ESC1-ESC8
(GetADUsers, (share enum + (Certipy
findDelegation, file loot + find -vulnerable)
DCSync test) secret grep)
│
▼
Phase 4 ── Wordlist Generation ───────────────────────────────────
usernames.txt · passwords.txt · spray_combos.txt
│
▼
Phase 5 ── Lockout-Aware Spraying ────────────────────────────────
Kerberos pre-auth spray ──► valid_credentials.txt
│
▼ Credential Chaining
re-run Kerberoast + SMB looting as each cracked user
│
▼
Phase 6 ── Analysis & Reporting ──────────────────────────────────
risk scoring (0-100) ──► terminal · JSON · HTML report
```
## 功能
- **LDAP 枚举** — 用户、组(特权组标记)、计算机(OS + 委派)、OU、密码/锁定策略以及委派关系。
- **Kerberoasting 与 AS-REP roasting** — 兼容 hashcat 的哈希,支持时间偏差感知。
- **DCSync 权限测试** — 非破坏性;能够干净利落地报告*“账户缺少 DCSync 权限”*而不会崩溃,仅在获得授权时导出密钥。
- **SMB 收集** — 共享访问映射(R/W),递归收集感兴趣的文件(≤5 MB),以及关键字密钥提取(`cpassword`、`connectionstring`…)。
- **ADCS / ESC 检测** — 封装了 Certipy 的 `find -vulnerable`,对 ESC1–ESC8+ 进行分类,包含受影响的注册主体和风险等级。
- **生成目标字典** — 用户名 + 姓名排列组合,以及经过变异、感知域名的密码列表(包含季节、月份、公司、黑客语),并限制在实际可用的体积内。
- **锁定感知密码喷射** — 通过 **Kerberos pre-auth**(静默方式)验证凭证,每轮对所有用户喷射一个密码,绝不超过每个用户在每个窗口期 `lockoutThreshold − 1` 次尝试,并休眠以等待窗口期重置。从 Phase 1 读取真实策略 — 不硬编码任何内容。
- **凭证链接** — 自动使用每个破解出的凭证重新运行 Kerberoast 和 SMB 收集,暴露每个凭证解锁的额外访问权限。
- **ACL / ACE 收集** — 纯 Python 的 Windows Security Descriptor 解析器读取 `nTSecurityDescriptor` DACL 并对滥用权限进行分类(GenericAll、WriteDacl、WriteOwner、GenericWrite、AddMember、ForceChangePassword、AllExtendedRights、GetChanges/GetChangesAll → DCSync)。处理 **DENY ACE**(拒绝优先)和**继承**(跳过 inherit-only,标记 inherited)。
- **Neo4j / Cypher 导出 + BloodHound 摄取验证** — 将攻击图以 Cypher 形式输出到 BloodHound/Neo4j 后端,并通过从导出的 JSON 重新推导 tier-zero 可达性来验证 SharpHound 导出数据的摄取(无需实时 CE;包含用于真实 CE 的 docker-compose + 上传脚本)。
- **攻击路径图** — 一个 BloodHound 风格、无依赖的路径查找器,可计算从已沦陷 / 低权限主体到 tier-zero(Domain Admins、Enterprise Admins、domain)的权限提升路径 — 包括 MemberOf、ACL 滥用、DCSync、ADCS ESC、非约束委派强制、RBCD 边。
- **NetExec 风格主机扫描** — 在多台主机上通过 SMB 认证一个凭证,并对认证、签名状态(中继暴露)、OS 和本地管理员("Pwn3d!")访问权限进行分类筛选。
- **BloodHound 导出** — 输出 SharpHound 风格的 JSON(`users/groups/computers/domains`)作为可摄取的 ZIP,因此发现的结果可以直接导入 BloodHound。
- **MITRE ATT&CK 映射 + 修复建议** — 每个发现结果都标记有 ATT&CK 技术 ID 和具体的修复指导(PingCastle 风格)。
- **报告生成** — 丰富的终端输出、结构化的 JSON、深色主题的 HTML 报告、干净的分页 **PDF**(内置无依赖写入器),以及 **CSV** 和 **SARIF 2.1.0**(用于 GitHub 代码扫描 / CI 集成)。
- **打包与 CI 就绪** — `pyproject.toml` 控制台脚本(`adreconx`、`adreconx-web`),一个 Dockerfile,以及一个 GitHub Actions 测试工作流。
- **Web 控制台** — 一个用于启动扫描(实时日志 + 报告链接)、交互式攻击图视图以及各个独立功能测试器的 Flask UI。
## 枚举能力(Phase 1,深度)
`LDAPEnumerator` 公开了一整套方法,每个方法都返回一个字典列表,并接入分析器和报告。`enumerate_all()` 会运行所有方法(这也是 `--enum-only` 所驱动的内容)。
**域 / 林**
- `get_domain_info()` — domain SID、域和林的功能级别、DC 列表、FSMO 角色所有者
- `get_trusts()` — 具有方向、类型、传递性的信任关系;标记**禁用 SID-filtering**(SID-history 风险)
- `get_sites_subnets()` — AD 站点及其子网
- `get_machine_account_quota()` — `ms-DS-MachineAccountQuota`(标记 `> 0`)
**用户(深度)**
- `get_users()` — 完整属性 + 派生的 `kerberoastable`/`asreproastable`/`disabled` 标记
- `get_privileged_users()` — `adminCount=1`(受保护)账户
- `get_asreproastable()` — `UF_DONT_REQUIRE_PREAUTH`
- `get_kerberoastable()` — 带有 SPN 的账户(排除 `krbtgt`)
- `get_password_not_required()` — `UF_PASSWD_NOTREQD`
- `get_password_never_expires()` — `UF_DONT_EXPIRE_PASSWD`
- `get_disabled_accounts()` / `get_locked_accounts()`
- `get_users_with_sensitive_data()` — 在 description/info/comment 中检索 pass/pwd/cred/secret
**组(深度)**
- `get_nested_group_membership()` — 通过 `LDAP_MATCHING_RULE_IN_CHAIN` 递归解析 tier-zero 组的有效成员;标记每个 tier-zero 组
**计算机(深度)**
- `get_unsupported_os()` — 标记 EOL Windows (XP/7/8/2000/2003/2008/2012)
- `get_unconstrained_delegation()` — `TRUSTED_FOR_DELEGATION` 计算机
- `get_constrained_delegation()` — `msDS-AllowedToDelegateTo`
- `get_rbcd()` — `msDS-AllowedToActOnBehalfOfOtherIdentity`
- `get_laps_readable()` — 当前账户**可读取**其 `ms-Mcs-AdmPwd` / `msLAPS-Password` 的计算机
**策略 / 密钥**
- `get_fine_grained_password_policies()` — PSO(`msDS-PasswordSettings`)
- `check_gpp_cpassword()` — 遍历 SYSVOL 查找 GPP XML,使用公开的静态 AES 密钥(MS14-025)解密 `cpassword`
- `get_gpos()` — GPO 及其链接位置
- `get_adidns_records()` — AD 集成 DNS 记录
**访问 / 认证姿态**
- `check_anonymous_bind()` — 测试 null/匿名 LDAP 绑定
- `check_ldap_signing()` — 启发式方法:接受未签名的简单绑定 ⇒ 未强制执行签名(中继风险)
- `get_gmsa_accounts()` — gMSA + 标记**可读**的 `msDS-ManagedPassword`
在**无攻击**的情况下运行完整清单:
```
python adreconx.py --dc-ip 10.10.10.5 --domain corp.local \
--username pentest --password 'P@ssw0rd!' --enum-only
```
## 安装
```
git clone https://github.com/sabkari-mohamed/ADRecon-X adreconx
cd adreconx
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
```
## 用法
```
# 包含所有报告格式的全扫描(所有阶段)
python adreconx.py --dc-ip 10.10.10.5 --domain corp.local \
--username pentest --password 'P@ssw0rd!' --report all
# 仅枚举
python adreconx.py --dc-ip 10.10.10.5 --domain corp.local \
--username pentest --password 'P@ssw0rd!' --modules enum
# 特定模块
python adreconx.py --dc-ip 10.10.10.5 --domain corp.local \
--username pentest --password 'P@ssw0rd!' --modules enum,kerberos,adcs
# 全扫描 + lockout-aware 密码喷射
python adreconx.py --dc-ip 10.10.10.5 --domain corp.local \
--username pentest --password 'P@ssw0rd!' --spray --spray-delay 1
# Pass-the-hash
python adreconx.py --dc-ip 10.10.10.5 --domain corp.local \
--username pentest --nt-hash --modules impacket,smb,adcs
```
### 关键参数
| 参数 | 描述 |
|------|-------------|
| `--dc-ip` | Domain Controller IP **(必填)** |
| `--domain` | 目标域,例如 `corp.local` **(必填)** |
| `--username` / `--password` | 用于绑定的凭证 **(必须为用户)** |
| `--nt-hash` | 用于 pass-the-hash 认证的 NT hash |
| `--modules` | `enum,kerberos,impacket,smb,adcs,wordlist,spray,all` (默认 `all`) |
| `--report` | `terminal,json,html,pdf,all` (默认 `all`) |
| `--web` | 启动 Web 控制台而不是 CLI 扫描 (`--host`, `--port`) |
| `--enum-only` | 完整的 LDAP/SMB 清单 + 报告,**无攻击** |
| `--spray` | 启用 Phase 5 喷射 |
| `--unsafe-spray` | **危险** — 禁用锁定保护(打印红色警告) |
| `--spray-delay` | 喷射尝试之间的秒数(默认 `0`) |
| `--yes` | 跳过交互式授权提示 |
每个工件(哈希、战利品、字典、有效凭证、报告)都写入 `--output-dir` 下(默认为 `./output`)。
## 实验环境搭建
请**仅**在您被授权攻击的环境中进行练习:
- **TryHackMe — "Attacktive Directory"** — 一个引导式的 AD 靶机,涵盖枚举、AS-REP roasting 和 SMB。
- **HackTheBox — Active Directory 靶机**(例如 *Forest*、*Sauna*、*Active*、*Sizzle*)— 练习 Kerberoast / AS-REP / ADCS 的理想选择。
- **GOAD — Game of Active Directory** (https://github.com/Orange-Cyberdefense/GOAD) — 一个由您自己托管的完整多域 AD 实验室;是体验包括 ADCS 和委派链在内的完整 ADRecon-X 工作流的最佳演练场。
## Web 控制台
一个通过浏览器驱动和测试所有功能的 Flask UI:
```
pip install flask # included in requirements.txt
python adreconx.py --web # -> http://127.0.0.1:5000
# 或者:python -m web.app --host 0.0.0.0 --port 5000
```
页面:
- **扫描** — 填写 DC IP / 域 / 凭证,选择模块和选项,勾选书面授权框,然后启动。任务在后台运行,带有实时控制台日志,并在完成后提供指向 HTML / JSON / **PDF** 报告的链接。
- **任务** — 已启动扫描的历史记录,包含状态、风险评分和报告。
- **攻击图** — 通往 tier-zero 的权限提升路径的交互式 SVG + 一键 BloodHound ZIP 导出。
- **功能测试器** — 每个独立功能,可**离线**运行(无需 DC):
- **字典生成器** — 域 + 用户/备注 → 用户名和密码列表
- **GPP cpassword** — 解密 / 加密(MS14-025 静态密钥)
- **Certipy ESC 解析器** — 粘贴 Certipy JSON → 分类的 ESC 发现
- **AES 自检** — 根据 FIPS-197 验证内置的 AES
- **示例报告** — 从合成数据渲染填充的 HTML + PDF 报告
Web 表单上的授权复选框与 CLI 的 `I AGREE` 提示具有相同的门控作用 — 没有它,扫描将无法启动。
## 报告
`--report all` 将在 `--output-dir` 下写入:
| 文件 | 描述 |
|------|-------------|
| `report.html` | 深色主题、独立的 HTML 报告(ATT&CK、修复、攻击路径) |
| `report.json` | 完整的结构化发现 + 清单 + 攻击路径 |
| `report.pdf` | 干净的分页 PDF(内置纯 Python 写入器) |
| `report.csv` | 扁平化发现(严重程度、ATT&CK、标题、修复) |
| `report.sarif`| 用于 GitHub 代码扫描 / CI 的 SARIF 2.1.0 |
| `bloodhound.zip` | SharpHound 风格的 JSON(包含 ACE),可被 BloodHound 摄取 |
| `attack_graph.cypher` | Neo4j Cypher 脚本(BloodHound 后端)+ 路径查询 |
密码在 HTML/PDF/JSON 中会被掩码处理;完整的明文仅存在于测试人员机器上的 `output/valid_credentials.txt` 中。
### BloodH / Neo4j
ADRecon-X 在您打开 BloodHound 之前就会验证其自身的 BloodHound 导出 — `modules.bloodhound_verify` 会验证 SharpHound schema 并从导出的 JSON 重新推导 tier-zero 攻击路径。要摄取到**实时**的 BloodHound Community Edition 中:
```
docker compose -f docker-compose.bloodhound.yml up -d # CE + Neo4j + PG
python scripts/ingest_bloodhound.py output/bloodhound.zip \
--url http://localhost:8080 --user admin --password
```
脚本首先在本地验证 ZIP,然后通过 CE 文件上传 API 进行上传。`output/attack_graph.cypher` 也可以直接加载到 Neo4j 中(如果存在 `neo4j` 驱动程序,则通过 `modules.neo4j_export.load_to_neo4j` 执行)。
## 测试情况
ADRecon-X 附带了一个**模拟测试套件**(`tests/`),因此每个代码路径 — 包括 LDAP / SMB / Impacket / Certipy 的网络路径 — 都被**离线**执行和断言,不需要实时的 Domain Controller,也无需安装 ldap3 / impacket / certipy。
```
pip install pytest flask # flask only for the web-console tests
python -m pytest -q # 118 tests
```
测试套件涵盖的内容:
- **`tests/conftest.py`** — ldap3 的模拟(`FakeConnection`/`FakeEntry`,由搜索过滤器驱动路由)和 impacket SMB 的模拟(带有共享、目录树、文件和可写共享模拟的 `FakeSMB`)。
- **测试夹具**(`tests/fixtures/`) — `users.json`,**同时**包含字典形态(`certipy_vuln_dict.json`)和列表形态(`certipy_vuln_list.json`)的 Certipy 输出(证明解析器能抵御版本漂移),`smb_shares.json`,以及一个带有真实公开 GPP `cpassword` 的 `groups.xml`。
- **`test_ldap_enum.py`** — 驱动深度枚举器(域信息、信任、LAPS、嵌套的 tier-zero 成员身份、gMSA、SID 解码、`enumerate_all`)。
- **`test_adcs.py`** — 针对字典/列表部分以及字典/列表/字符串漏洞形态的 `parse_certipy_output` — 确定性执行,没有“尽力而为”。
- **`test_gpp.py`** — 根据 **FIPS-197** 向量验证内置的 AES,对公开向量的 GPP 解密 → `GPPstillStandingStrong2k18`,加密/解密往返测试,XML 解析,以及在 SMB 模拟上进行的 SYSVOL 遍历。
- **`test_impacket_ops.py`** — GetADUsers / findDelegation 解析以及 DCSync 访问拒绝与成功的分支(模拟的 CLI 输出)。
- **`test_smb_loot.py`** — 共享 R/W 标记、递归收集、默认共享跳过以及密钥提取。
- **`test_spray.py`** — 外部密码循环顺序、命中即停止、锁定安全窗口休眠、不安全模式不休眠、无策略行为、掩码处理。
- **`test_kerberos.py`** / **`test_wordlist.py`** / **`test_analyzer.py`** / **`test_reporter.py`** — 哈希解析、字典变异/限制、每种发现类型的风险评分,以及包括密码掩码在内的 JSON/HTML 渲染。
- **`test_pdf_report.py`** — 内置的 PDF 写入器(有效的 header/xref/EOF、分页、换行;在安装了 pypdf 时进行反向解析)。
- **`test_intel.py`** — ATT&CK + 修复建议丰富化(标题规则、类别回退、分析器集成)。
- **`test_attack_graph.py`** — 提权路径查找(user→DA、DCSync、ADCS ESC、非约束委派强制;在干净的域中没有错误路径)。
- **`test_bloodhound.py`** — SharpHound JSON 结构、SID 解析、组成员关系链接、ACE 附加,以及有效的可摄取 ZIP。
- **`test_security_descriptor.py`** — SID + SD 编码/解码往返,以及 ACE 权限分类(GenericAll/WriteDacl/AddMember/ForceChangePassword/DCSync),并过滤掉内置主体。
- **`test_netrunner.py`** — SMB 扫描分类筛选(认证、签名、管理员 "Pwn3d!")。
- **`test_security_descriptor.py`** (扩展) — DENY 优先级、继承、跳过 inherit-only、object-deny ACE。
- **`test_neo4j_export.py`** — Cypher 节点/边 MERGE、关系类型清理、字符串转义、可选驱动程序回退。
- **`test_bloodhound_verify.py`** — 导出 schema 验证 + 从导出的 JSON 重新推导的 tier-zero 可达性。
- **`test_web.py`** — 每个 Web 路由 + 功能 API(GPP、Certipy、AES、字典、演示报告、攻击图、BloodHound 导出)以及扫描启动授权门控。
您可以随时通过以下命令渲染一份带有数据的报告(无需 DC):
```
python -m examples.demo_offline
```
## 截图
**Web 控制台仪表板**

**HTML 报告** — 风险评分、ATT&CK 标记的发现、修复、攻击路径

**攻击路径图** — 通往 tier-zero 的提权路径 + BloodHound / Cypher 导出

**扫描任务** — 实时日志 + 可下载的报告

### 输出工件
```
output/
├── report.html / .json / .pdf / .csv / .sarif # multi-format reports
├── bloodhound.zip # SharpHound-style JSON (with ACEs)
├── attack_graph.cypher # Neo4j / BloodHound backend script
├── kerberoast_hashes.txt
├── asreproast_hashes.txt
├── usernames.txt / passwords.txt / valid_credentials.txt
├── adcs_findings.json
├── smb_secrets.txt
└── loot///...
```
## 免责声明
未经授权访问计算机系统是违法行为。此工具仅供授权的安全测试和教育使用,不提供任何担保,对滥用不承担任何责任。使用前请阅读 [DISCLAIMER.md](DISCLAIMER.md)。致谢 Impacket (Fortra)、Certipy (ly4k) 和 BloodHound (SpecterOps)。
## 许可证
MIT.
标签:Active Directory, Kerberos攻击, Plaso, Python, Web报告查看器, 攻击路径分析, 无后门, 模拟器, 网络调试, 自动化, 请求拦截, 逆向工具