AD-Security/AD_Miner

GitHub: AD-Security/AD_Miner

AD Miner 是一款 Active Directory 安全审计工具,通过分析 BloodHound 图数据库数据自动生成包含风险评级与缓解路径的 Web 报告。

Stars: 1543 | Forks: 163

AD_Miner
Latest AD_Miner version Latest release Latest commit in dev Rawsec's CyberSecurity Inventory badge
Discord
### AD Miner 是一款 Active Directory(本地部署和 Entra ID)审计工具,它的功能包括: - 利用 **Cypher 查询** 来分析来自 [BloodHound](https://github.com/SpecterOps/BloodHound) 图数据库(Neo4j)的数据。 - 通过静态的、基于网页的报告,提供对现有弱点的全面概述。 基于网页报告的功能: - 已识别弱点的**详细列表** - 用于可视化分析的**动态图表** - 用于跟踪随时间变化的**历史关键指标** - 用于对威胁和行动进行优先级排序的**风险评级** ## 报告快速概览 ### Active Directory 风险的综合缓解路径 基于风险评级的 Active Directory 弱点评估,以及综合缓解路径。

Main page

### 动态 Web 界面 经过精心调整的搜索栏和控制项,可帮助识别风险最高的错误配置。

Main page

### 通过不断演进的界面进行进度监控 您还可以观察随时间变化的指标,以帮助衡量缓解措施的效率。

Main page

AD Miner 最初由 Forvis Mazars 创建,目前由 Grant Thornton 网络安全审计与咨询团队负责维护。 ## 前置条件 要运行 AD Miner,您首先需要一个包含 Active Directory 对象的 neo4j 数据库: 1. 要从域中提取数据,您可以使用 [SharpHound](https://github.com/BloodHoundAD/SharpHound)、[RustHound-CE](https://github.com/g0h4n/RustHound-CE) 或 [BloodHound.py](https://github.com/dirkjanm/BloodHound.py) 等工具;如果是 EntraID 环境,则可使用 [AzureHound](https://github.com/BloodHoundAD/AzureHound)。
2. 要搭建您的 BloodHound 环境(包括 GUI 和 Neo4j 数据库),**强烈推荐**使用 [BloodHound Automation](https://github.com/Tanguy-Boisset/bloodhound-automation),**因为它能与 Graph Data Science 插件无缝集成**。虽然使用默认的 [BloodHound CE](https://github.com/SpecterOps/BloodHound) 安装也完全没问题,但请注意,您将错失 GDS 带来的优势(例如:更智能的寻路、提升的执行速度等)。 3. 默认情况下,BloodHound 创建的 neo4j 数据库可以通过 7687 端口访问。 ## 安装和设置 最简单的方法是使用 `pipx` 执行以下命令: ``` pipx install 'git+https://github.com/AD-Security/AD_Miner.git' ``` ADMiner 也可在某些 Linux 发行版上使用: [![打包状态](https://repology.org/badge/vertical-allrepos/ad-miner.svg)](https://repology.org/project/ad-miner/versions) - BlackArch: `pacman -S ad-miner` - NixOS: `nix-env -iA nixos.ad-miner` 我们提供了一个可用于构建的 Docker 镜像。使用以下命令构建镜像: ``` docker build -t ad-miner . ``` 要在 Windows 上使用 BloodHound Community Edition 数据运行此镜像,请使用以下命令: ``` docker run -v ${PWD}:/tmp ad-miner AD-miner -b bolt://host.docker.internal:7687 -u neo4j -p mypassword -cf YOUR_PREFIX ``` 要在 Linux 上使用 BloodHound Community Edition 数据运行此镜像,请使用以下命令: ``` docker run -v ${PWD}:/tmp --network host ad-miner AD-miner -b bolt://localhost:7687 -u neo4j -p mypassword -cf YOUR_PREFIX ``` 请注意,使用 `-v` 挂载数据卷对于获取数据输出至关重要。此处假设 BHCE 服务器正在以默认设置运行在 Docker 宿主机上。 ## 用法 运行该工具: ``` AD-miner [-h] [-b BOLT] [-u USERNAME] [-p PASSWORD] [-e EXTRACT_DATE] [-r RENEWAL_PASSWORD] [-a] [-c] [-l LEVEL] -cf CACHE_PREFIX [-ch NB_CHUNKS] [-co NB_CORES] [--rdp] [--evolution EVOLUTION] [--cluster CLUSTER] ``` 示例: ``` AD-miner -cf My_Report -u neo4j -p mypassword ``` 每次 Neo4j 请求完成时都会生成缓存文件。此功能允许您在处理过程中的任何时刻暂停或停止 AD Miner,而不会丢失之前已计算的结果。要利用缓存,请使用 `-c` 参数。缓存文件存储在您当前代码库的 cache_neo4j 文件夹中。要使用缓存,报告名称必须与缓存文件的名称前缀相匹配: ``` AD-miner -c -cf My_Report -u neo4j -p mypassword ``` 为了更好地处理大型数据集,可以启用多线程,并使用由多个 neo4j 数据库组成的集群,如下例所示(其中 server1 处理 32 个线程,server2 处理 16 个): ``` AD-miner -c -cf My_Report -b bolt://server1:7687 -u neo4j -p mypassword --cluster server1:7687:32,server2:7687:16 ``` 如果已知晓密码续期策略,您可以使用 `-r` 参数进行指定,以确保密码续期检查符合您环境的设置(默认为 90 天)。例如,如果密码策略设置为 180 天,您可以使用以下命令: ``` AD-miner -c -cf My_Report -b bolt://server:7687 -u neo4j -p mypassword -r 180 ``` 选项: ``` -h, --help show this help message and exit -b BOLT, --bolt BOLT Neo4j bolt connection (default: bolt://127.0.0.1:7687) -u USERNAME, --username USERNAME Neo4j username (default : neo4j) -p PASSWORD, --password PASSWORD Neo4j password (default : bloodhoundcommunityedition) -e EXTRACT_DATE, --extract_date EXTRACT_DATE Extract date (e.g., 20220131). Default: last logon date -r RENEWAL_PASSWORD, --renewal_password RENEWAL_PASSWORD Password renewal policy in days. Default: 90 -c, --cache Use local file for neo4j data -l LEVEL, --level LEVEL Recursive level for path queries -cf CACHE_PREFIX, --cache_prefix CACHE_PREFIX Cache file to use (in case of multiple company cache files) --gpo_low Perform a faster but incomplete query for GPO (faster than the regular query) -ch NB_CHUNKS, --nb_chunks NB_CHUNKS Number of chunks for parallel neo4j requests. Default : 20 * number of CPU -co NB_CORES, --nb_cores NB_CORES Number of cores for parallel neo4j requests. Default : number of CPU --rdp Include the CanRDP edge in graphs --evolution EVOLUTION Evolution over time : location of json data files. ex : '../../tests/' --cluster CLUSTER Nodes of the cluster to run parallel neo4j queries. ex : host1:port1:nCore1,host2:port2:nCore2,... ``` 在图表页面中,您可以右键单击图表节点对其进行聚类或打开聚类。

## 演进 如果您有随时间生成的多个 AD-Miner 报告,您可以使用 `--evolution` 参数轻松跟踪其演进:每个 AD-Miner 报告都会在 `index.html` 文件旁边生成一个 JSON 数据文件。您只需将这些不同的 JSON 文件收集到一个文件夹中,并在 `--evolution` 参数后指定该文件夹的路径即可。 ``` AD-miner -c -cf My_Report -b bolt://server:7687 -u neo4j -p mypassword -r 180 --evolution evolution_folder/ ``` 主页上会出现一个“随时间的演进”选项卡,为每个类别(权限、密码、Kerberos 和杂项)提供演进图表。

每个控制项的详细演进情况也是可用的,并且可以通过每个类别的“显示演进”按钮进行访问。提供对数刻度可以更好地突出随时间发生的细微变化。

## 最智能的路径 AD Miner 可以根据实际的利用率来计算路径。事实上,有时候最短的路径很难被利用(此例中是因为在 `HasSession` 之前存在 `ExecuteDCOM`)。

而存在一条更长但更简单的路径(此例中是使用 `MemberOf` 和 `AdminTo` 代替了 `ExecuteDCOM`)。

当您的 neo4j 数据库安装了 Graph Data Science 插件时,AD Miner 会自动切换到最智能路径模式 (https://neo4j.com/docs/graph-data-science/current/)。 安装此插件最简单的方法是在您的 neo4j docker 中定义环境变量:```NEO4J_PLUGINS=["graph-data-science"]```(它在 [BloodHound Automation](https://github.com/Tanguy-Boisset/bloodhound-automation) 中默认已安装)。 目前,有 10 项控制项利用了全图覆盖,并为分析优化了最智能路径。 ## 已实现的控制项 以下提供了 AD Miner 中已经实现的控制项列表: ### 针对本地部署的控制项 | **类别** | **描述** | | **类别** | **描述** | |-----------------|----------------------------------------------------|----------------|-----------------|----------------------------------------------------| | **Kerberos** | AS-REP Roastable 账户 | | **杂项** | 使用过时操作系统的计算机 | | **Kerberos** | Kerberoastable 账户 | | **杂项** | 休眠账户 | | **Kerberos** | Kerberos 约束委派 | | **杂项** | 域的功能级别 | | **Kerberos** | 针对计算机的 Kerberos RBCD | | **杂项** | 幽灵计算机 | | **Kerberos** | Kerberos 非约束委派 | | **杂项** | 没有任何成员的组 | | **Kerberos** | 旧的 KRBTGT 密码 | | **杂项** | 没有任何成员的 OU | | **Kerberos** | 特权账户上的 Shadow Credentials | | **杂项** | 域控上的 Shadow credentials | | **Kerberos** | 常规账户上的 Shadow Credentials | | **杂项** | 异常的 PrimaryGroupID | | **密码** | 对 LAPS 密码的访问权限 | | **权限** | ACL 异常 | | **密码** | 未配置 LAPS 的计算机 | | **权限** | 攻击路径瓶颈点 | | **密码** | 可读取管理员 GMSA 密码的对象 | | **权限** | 属于其他计算机管理员的计算机 | | **密码** | 密码要求绕过 | | **权限** | 跨域通往 Domain Admin 的路径 | | **密码** | 具有明文密码的用户 | | **权限** | Guest 账户 | | **密码** | 密码过旧的用户 | | **权限** | 不当的 DCSync 权限访问 | | **密码** | 未设置密码过期的用户 | | **权限** | 不当的 GPO 修改权限 | | **权限** | 不当的 AdminCount 设置 | | **权限** | 具有不当权限的机器账户 | | **权限** | 域管理员数量不当 | | **权限** | ADCS 上的非 0 层本地管理员权限 | | **权限** | 具有不当权限的机器账户 | | **权限** | 通往 DNS Admins 的路径 | | **权限** | 具有 SID 历史记录的对象 | | **权限** | 通往 Operators Groups 的路径 | | **权限** | 通往 Domain Admins 的路径 | | **权限** | 通往服务器的路径 | | **权限** | 通往组织单位 (OU) 的路径 | | **权限** | "Pre-Windows 2000 Compatible Access" 组 | | **权限** | 通往 AdminSDHolder 容器的路径 | | **权限** | RDP 访问权限(计算机) | | **权限** | 受保护用户组之外的特权账户 | | **权限** | 0 层违规(会话) | | **权限** | RDP 访问权限(用户) | | **权限** | 具有本地管理员权限的用户 | | **权限** | 具有强大跨域权限的用户 | | **权限** | | ### 针对 Entra ID 的控制项 | **类别** | **描述** | | **类别** | **描述** | |-------------------|--------------------------------------------------------|----------------|-------------------|------------------------------------------------------| | **Entra ID 杂项** | Azure 休眠账户 | | **Entra ID MS Graph** | MS Graph 的直接控制者 | | **Entra ID 密码** | Entra ID 密码重置权限 | | **Entra ID MS Graph** | 未在本地同步的 Entra ID 账户 | | **Entra ID 密码** | 不一致的上次密码更改 | | **Entra ID MS Graph** | 已同步但伴生账户被禁用的账户 | | **Entra ID 权限** | 对特权 Entra ID 角色的访问权限 | | **Entra ID 权限** | 本地和 Azure 双重环境上的特权账户 | | **Entra ID 权限** | 跨本地/Entra ID 通往 0 层的路径 | | **Entra ID 权限** | 可能与 AADConnect 相关的用户 | | **Entra ID 权限** | 通往高价值目标的路径的 Entra ID 用户 | | | | ## 贡献 查看[此处](CONTRIBUTING.md)了解如何做出贡献。
标签:代码示例, 可视化报告, 数据分析, 活动目录, 自定义脚本, 请求拦截, 逆向工具