tielestudio/Active-Directory-Audit-Tool

GitHub: tielestudio/Active-Directory-Audit-Tool

面向 Active Directory 环境的单文件安全审计工具,将 LDAP 枚举、DNS 验证和 BloodHound JSON 关联分析整合为一份统一的 JSON 报告。

Stars: 1 | Forks: 1

**用于 AD 安全审计的快速 LDAP · DNS · BloodHound JSON 关联分析** [![Python](https://img.shields.io/badge/Python-3.9%2B-0d1117?style=flat-square&logo=python&logoColor=4af626)](https://python.org) [![LDAP](https://img.shields.io/badge/LDAP-NTLM_Auth-0d1117?style=flat-square&logoColor=4af626)](.) [![DNS](https://img.shields.io/badge/DNS-Resolution_Checks-0d1117?style=flat-square&logoColor=4af626)](.) [![BloodHound](https://img.shields.io/badge/BloodHound-JSON_Correlation-0d1117?style=flat-square&logoColor=red)](.) [![License](https://img.shields.io/badge/License-MIT-0d1117?style=flat-square)](.)
## `>_ 概述` `ad-audit.py` 是一个**单文件 Python 工具**,用于对 Active Directory 环境执行安全审计并生成统一的 JSON 报告。它通过 LDAP 和 DNS 收集数据,可选地使用 BloodHound JSON 来丰富发现结果,并将所有内容关联为结构化的输出。 ``` LDAP collection └──▶ DNS validation └──▶ BloodHound JSON (existing or live) └──▶ ad_audit_report.json ``` ## `>_ 功能` | 能力 | 描述 | |---|---| | **LDAP 收集** | 域信息、RootDSE、用户、组、计算机、UAC 标志、委派、SPN | | **DNS 验证** | 根据配置的 DNS 解析计算机对象 | | **BloodHound JSON (已有)** | 从磁盘读取先前收集的 BH JSON 文件 | | **BloodHound JSON (实时)** | 将 `bloodhound-python` 作为子进程运行 | | **发现关联** | 将 LDAP/DNS 发现结果与 BloodHound 上下文结合 | | **ACL 分析** | DCSync 权限、危险 ACEs、GPO 写入权限、shadow credentials | | **JSON 报告** | 统一的单一输出文件 | ## `>_ 安装` **最低要求** ``` pip install ldap3 dnspython pycryptodome ``` **支持实时 BloodHound 收集** ``` pip install ldap3 dnspython pycryptodome bloodhound-python ``` **推荐方式(虚拟环境)** ``` python3 -m venv .venv source .venv/bin/activate pip install ldap3 dnspython pycryptodome bloodhound-python ``` ### 依赖 | 包 | 用途 | |---|---| | `ldap3` | LDAP 查询和 NTLM 绑定 | | `dnspython` | DNS 解析检查 | | `pycryptodome` | 用于 LDAP 绑定的 NTLM/MD4 支持 | | `bloodhound-python` | *(可选)* 实时 BloodHound 收集 | ## `>_ 快速开始` ``` git clone https://github.com/tielestudio/Active-Directory-Audit-Tool cd Active-Directory-Audit-Tool python3 -m venv .venv && source .venv/bin/activate pip install ldap3 dnspython pycryptodome bloodhound-python python3 tools/ad-audit.py \ --server dc01.corp.local \ --domain corp.local \ --user 'CORP\jane.doe' \ --password 'StrongPassword!' \ --dns-server 10.0.0.10 \ --output ./ad_audit_report.json ``` **预期输出:** ``` [+] Report written to: tools/ad_audit_report.json [+] Users: 42 | Groups: 18 | Computers: 27 [+] Total findings: 6 (LDAP/DNS: 4, BH correlation: 2) [+] BloodHound JSON files embedded into report and deleted from disk (2 files) ``` ## `>_ 操作模式` ### 模式 1 — 仅 LDAP + DNS 运行 LDAP 收集和 DNS 解析检查。不包含 BloodHound。 ``` python3 tools/ad-audit.py \ --server 10.0.0.10 \ --domain corp.local \ --user 'CORP\jane.doe' \ --password 'StrongPassword!' \ --dns-server 10.0.0.10 \ --output tools/ad_audit_report.json ``` ### 模式 2 — LDAP + DNS + 已有 BloodHound JSON 从目录中读取先前收集的 BH JSON 文件,并将它们与 LDAP/DNS 发现结果进行关联。 ``` python3 tools/ad-audit.py \ --server dc01.corp.local \ --domain corp.local \ --user 'CORP\jane.doe' \ --password 'StrongPassword!' \ --bloodhound-dir ./bh-output \ --keep-bh-files ``` 脚本会查找匹配以下模式的文件:`*_users.json`、`*_computers.json`、`*_groups.json`、`*_domains.json`、`*_gpos.json`、`*_containers.json` —— 并自动选择最新的兼容数据集。 ### 模式 3 — LDAP + DNS + 实时 BloodHound 收集 运行 `bloodhound-python`,读取生成的 JSON 文件,将它们嵌入到报告中,并用于关联分析。 ``` python3 tools/ad-audit.py \ --server dc01.corp.local \ --domain corp.local \ --user 'CORP\jane.doe' \ --password 'StrongPassword!' \ --run-bloodhound \ --bh-dc dc01.corp.local \ --bh-ns 10.0.0.10 \ --bloodhound-dir ./bh-output \ --output ./ad_audit_report.json ``` ## `>_ 发现参考` ### AD 发现 (LDAP/DNS) | ID | 发现 | |---|---| | `AD-001` | 特权组成员暴露 | | `AD-002` | 可进行 Kerberoast 攻击的用户 | | `AD-003` | 可进行 AS-REP Roast 攻击的用户 | | `AD-004` | 过期/闲置用户 | | `AD-005` | 过期/闲置计算机 | | `AD-006` | 无法通过 DNS 解析的计算机 | | `AD-007` | Machine Account Quota | | `AD-008` | 密码永不过期 | | `AD-009` | AdminCount 用户 | | `AD-010` | AdminCount 组 | | `AD-011` | 非约束委派 —— 用户 | | `AD-012` | 非约束委派 —— 计算机 | | `AD-013` | 从未登录过的用户 | | `AD-014` | 从未登录过的计算机 | | `AD-015` | 旧版操作系统 | | `AD-016` | krbtgt 密码使用期限 | | `AD-017` | 弱密码 / 账户锁定策略 | | `AD-018` | 设置了密码永不过期的特权用户 | | `AD-019` | PASSWD_NOTREQD 用户 | | `AD-020` | 拥有 SPN 的特权用户 | | `AD-021` | LAPS 状态 | ### BloodHound 关联发现 | ID | 发现 | |---|---| | `BH-001` | 收集期间未解析的主机 | | `BH-002` | 设置了密码永不过期的高价值对象 | | `BH-003` | 拥有 SPN 的高价值用户 | | `BH-004` | 高价值 / 关键系统上的非约束委派 | | `BH-005` | 关键系统上缺失 LAPS | ### ACL 发现 | ID | 发现 | |---|---| | `ACL-001` | 危险 ACEs | | `ACL-002` | DCSync 权限 | | `ACL-003` | Shadow Credentials / AddKeyCredentialLink | | `ACL-004` | GPO 写入权限 | | `ACL-005` | DnsAdmins 成员身份 | | `ACL-006` | Domain Controller 本地管理员偏差 | ## `>_ 命令行参考` ### 必填项 | 参数 | 描述 | |---|---| | `--server` | LDAP / DC 地址 | | `--domain` | 域名 (例如 `corp.local`) | | `--user` | NTLM 用户名 (例如 `CORP\jane.doe`) | | `--password` | 用户密码 | ### LDAP / DNS 选项 | 参数 | 默认值 | 描述 | |---|---|---| | `--dns-server` | — | 覆盖 DNS 名称服务器 | | `--days-user-stale` | `90` | 闲置用户阈值 (天) | | `--days-computer-stale` | `90` | 闲置计算机阈值 (天) | | `--min-never-used-age-days` | `30` | 从未使用账户的最小存在时间 | | `--krbtgt-warn-days` | `180` | krbtgt 密码使用期限告警阈值 | | `--output` | `ad_audit_report.json` | 输出路径 | | `--debug` | `false` | 启用 debug 输出 | ### BloodHound 选项 | 参数 | 默认值 | 描述 | |---|---|---| | `--run-bloodhound` | `false` | 将 `bloodhound-python` 作为子进程运行 | | `--bloodhound-binary` | `bloodhound-python` | BH 二进制文件名或路径 | | `--bloodhound-dir` | `.` | 用于读/写 BH JSON 文件的目录 | | `--bh-user` | — | 覆盖 BH 收集的用户名 | | `--bh-password` | — | 覆盖 BH 收集的密码 | | `--bh-dc` | — | 用于 BH 收集的 DC | | `--bh-ns` | — | 用于 BH 收集的名称服务器 | | `--bh-dns-tcp` | `false` | 对 BH DNS 查询使用 TCP | | `--bh-disable-autogc` | `false` | 禁用 BH 自动-GC | | `--bh-gc` | — | 覆盖 Global Catalog | | `--keep-bh-files` | `false` | 加载后将 BH JSON 文件保留在磁盘上 | ## `>_ 架构` ### 数据流 ``` ┌─────────────────────────────────────────────────────────┐ │ │ │ ┌──────────┐ ┌──────────┐ ┌────────────────────┐ │ │ │ LDAP │──▶│ DNS │──▶│ BloodHound JSON │ │ │ └──────────┘ └──────────┘ └────────────────────┘ │ │ │ │ │ │ │ └───────────────┴──────────────────┘ │ │ │ │ │ ▼ │ │ ┌───────────────────────┐ │ │ │ ad_audit_report.json │ │ │ └───────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────┘ ``` ### 内部组件 ``` ad-audit.py ├── LDAP Layer │ ├── ldap_connect / ldap_search │ ├── get_domain_info / get_root_dse │ ├── get_users / get_groups / get_computers │ └── get_laps_attributes │ ├── DNS Layer │ ├── build_resolver │ └── resolve_host │ ├── BloodHound Layer │ ├── build_bloodhound_command │ ├── run_bloodhound_collection │ ├── parse_bloodhound_log │ ├── discover_bloodhound_prefix │ └── load_bloodhound_json_bundle │ ├── Correlation Layer │ ├── correlate_bloodhound_unresolved_with_ldap │ ├── correlate_high_value_password_never_expires │ ├── correlate_high_value_spn_users │ ├── correlate_unconstrained_delegation_high_value_computers │ └── correlate_laps_missing_on_critical_computers │ └── ACL Analysis Layer ├── analyze_acl_dangerous_permissions ├── analyze_acl_dcsync_rights ├── analyze_acl_shadow_credentials ├── analyze_acl_gpo_write_permissions ├── analyze_dnsadmins_membership └── analyze_dc_local_admins ``` ## `>_ 报告结构` 默认输出:`ad_audit_report.json` ``` { "assessment_name": "...", "generated_at": "2024-01-01T00:00:00Z", "target": { "domain": "corp.local", "server": "dc01.corp.local" }, "summary": { "users": 42, "groups": 18, "computers": 27, "severity_summary": { "critical": 1, "high": 3, "medium": 2 } }, "metadata": { "rootdse": {}, "bloodhound": {} }, "bloodhound_collection": {}, "findings": [ { "id": "AD-002", "title": "Kerberoastable users", "severity": "high", "objects": [] } ] } ``` | 字段 | 描述 | |---|---| | `assessment_name` | 评估名称 | | `generated_at` | 报告生成时间戳 | | `target` | 域和服务器信息 | | `summary` | 计数、域 DN、MAQ、严重性摘要 | | `metadata` | RootDSE 和 BloodHound 元数据 | | `bloodhound_collection` | 已加载的 BH JSON 文件的原始内容 | | `findings` | 所有 `AD-*`、`BH-*` 和 `ACL-*` 发现 | ## `>_ 仓库结构` ``` . ├── tools/ │ └── ad-audit.py ├── examples/ │ └── ad_audit_report.json ├── README.md └── requirements.txt ``` **`requirements.txt`** ``` ldap3 dnspython pycryptodome bloodhound-python ``` ## `>_ 注意事项` - 该工具**不会**查询 Neo4j 或 BloodHound 图数据库 - BloodHound 数据直接从 JSON 收集文件中读取 - 无需使用 `--run-bloodhound` 即可使用 BloodHound 数据 —— 如果在 `--bloodhound-dir` 下找到已有的 JSON 文件,它们将被自动加载 - 默认情况下,加载后的 BloodHound JSON 文件在嵌入到报告中后将从磁盘删除 - 如果 LDAP 绑定失败,脚本会向标准输出写入 JSON 错误并以代码 `2` 退出 ## `>_ 法律声明`
`ad-audit.py` · MIT 许可证 · LDAP · DNS · BloodHound JSON · ACL 分析
标签:ACL分析, Active Directory, AD审计, BloodHound, Checkov, DCSync, DNS, JSON关联, LDAP, Plaso, Python, SPN, UAC, 域渗透, 委派攻击, 攻击面评估, 数据融合, 无后门, 电子数据取证, 虚拟环境, 逆向工具