基于 Web 的报告功能:
基于风险的 Active Directory 弱点评级,以及全面的缓解路径。
精心设计的搜索栏和控件,可快速识别最具风险的错误配置。
您还可以观察指标随时间的变化,以帮助衡量缓解效率。
AD Miner 最初由 Forvis Mazars 创建,目前由 Grant Thornton 网络安全审计与咨询团队维护。
要运行 AD Miner,您首先需要一个包含 Active Directory 对象的 neo4j 数据库:
[!CAUTION] 强烈推荐使用 BloodHound Automation,因为它会安装 Graph Data Science Neo4j 插件,该插件:
- 显著提高计算时间和整体性能。
- 启用 Smartest Path 替代内置的 Neo4j shortestPath()(即,更容易利用的路径,而非节点跳数最少的路径)。
要设置您的 BloodHound 环境(包括 GUI 和 Neo4j 数据库),强烈推荐使用 BloodHound Automation,因为它能与 Graph Data Science 插件无缝集成。当然,使用默认的 BloodHound CE 安装也是完全可以的,但请注意,您将错过 GDS 的优势(例如,更智能的寻路、更快的执行速度等)。
默认情况下,BloodHound 会创建一个可在 7687 端口访问的 neo4j 数据库。
最简单的方法是使用 pipx 执行以下命令:
pipx install 'git+https://github.com/AD-Security/AD_Miner.git'
ADMiner 也可在一些 Linux 发行版上获取:
pacman -S ad-minernix-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
[!TIP] Bloodhound CE neo4j 数据库的默认密码是
bloodhoundcommunityedition,如果您使用 BloodHound Automation,则为neo5j。
选项:
-h, --help 显示此帮助信息并退出
-b BOLT, --bolt BOLT Neo4j bolt 连接(默认:bolt://127.0.0.1:7687)
-u USERNAME, --username USERNAME
Neo4j 用户名(默认:neo4j)
-p PASSWORD, --password PASSWORD
Neo4j 密码(默认:bloodhoundcommunityedition)
-e EXTRACT_DATE, --extract_date EXTRACT_DATE
提取日期(例如,20220131)。默认:最后登录日期
-r RENEWAL_PASSWORD, --renewal_password RENEWAL_PASSWORD
密码续订策略(天数)。默认:90
-c, --cache 对 neo4j 数据使用本地文件
-l LEVEL, --level LEVEL
路径查询的递归级别
-cf CACHE_PREFIX, --cache_prefix CACHE_PREFIX
要使用的缓存文件(用于多个公司的缓存文件)
--gpo_low 对 GPO 执行更快但不完整的查询(比常规查询快)
-ch NB_CHUNKS, --nb_chunks NB_CHUNKS
并行 neo4j 请求的块数。默认:20 * CPU 数量
-co NB_CORES, --nb_cores NB_CORES
并行 neo4j 请求的 CPU 核心数。默认:CPU 数量
--rdp 在图中包含 CanRDP 边
--evolution EVOLUTION
随时间演化:JSON 数据文件的位置。例如:'../../tests/'
--cluster CLUSTER 集群节点,用于运行并行 neo4j 查询。例如:host1:port1:nCore1,host2:port2:nCore2,...
在图页面中,您可以右键单击图节点来对它们进行聚类或打开聚类。
如果您有多个 AD-Miner 报告随着时间的推移生成,可以使用 --evolution 参数轻松跟踪演变:每个 AD-Miner 报告都会生成一个 JSON 数据文件,与 index.html 文件一起存放。您只需将这些不同的 JSON 文件收集到一个文件夹中,并在 --evolution 参数后指定该文件夹的路径。
AD-miner -c -cf My_Report -b bolt://server:7687 -u neo4j -p mypassword -r 180 --evolution evolution_folder/
主页上会出现一个“随时间演变”选项卡,为每个类别(权限、密码、Kerberos 和杂项)提供演变图表。
每个控制的详细演变也可用,可以通过每个类别的“显示演变”按钮查看。提供对数刻度以更好地突出时间上的微妙变化。
AD Miner 可以根据路径的实际可利用性来计算路径。事实上,有时最短路径很难利用(这里是因为 ExecuteDCOM 在 HasSession 之前)。
而存在一条更长但更简单的路径(这里使用 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 一起安装)。
目前,有 10 个控制项利用全图覆盖并优化了最聪明路径用于分析。
以下列出了 AD Miner 中已实现的控制:
如何贡献,请查看 这里。
| 类别 | 描述 | 类别 | 描述 |
|---|
| Kerberos | 可 AS-REP Roast 的账户 | 杂项 | 操作系统过时的计算机 | |
| Kerberos | 可 Kerberoast 的账户 | 杂项 | 休眠账户 | |
| Kerberos | Kerberos 约束委派 | 杂项 | 域功能级别 | |
| Kerberos | 针对计算机的 Kerberos 基于资源的约束委派 (RBCD) | 杂项 | 幽灵计算机 | |
| Kerberos | Kerberos 非约束委派 | 杂项 | 无成员的组 | |
| Kerberos | 旧的 KRBTGT 密码 | 杂项 | 无成员的 OU | |
| Kerberos | 特权账户上的 Shadow Credentials | 杂项 | 域控制器上的 Shadow Credentials | |
| Kerberos | 普通账户上的 Shadow Credentials | 杂项 | 意外的 PrimaryGroupID | |
| 密码 | 对 LAPS 密码的访问 | 杂项 | 用户的 FGPP | |
| 密码 | 未启用 LAPS 的计算机 | 权限 | ACL 异常 | |
| 密码 | 可读取管理员 GMSA 密码的对象 | 权限 | 攻击路径瓶颈点 | |
| 密码 | 绕过密码要求 | 权限 | 管理其他计算机的计算机 | |
| 密码 | 具有明文密码的用户 | 权限 | 跨域通往域管理员的路径 | |
| 密码 | 密码过旧的用户 | 权限 | 来宾账户 | |
| 密码 | 密码永不过期的用户 | 权限 | 不充分的 DCSync 权限 | |
| 权限 | 不充分的 AdminCount 设置 | 权限 | 不充分的 GPO 修改权限 | |
| 权限 | 不充分的域管理员数量 | 权限 | 权限不足的机器账户 | |
| 权限 | 权限不足的机器账户 | 权限 | 在 ADCS 上拥有非层级 0 本地管理员权限 | |
| 权限 | 具有 SID 历史记录的对象 | 权限 | 通往 DNS 管理员的路径 | |
| 权限 | 通往域管理员的路径 | 权限 | 通往操作员组的路径 | |
| 权限 | 通往组织单位 (OU) 的路径 | 权限 | 通往服务器的路径 | |
| 权限 | 通往 AdminSDHolder 容器的路径 | 权限 | "Pre-Windows 2000 Compatible Access" 组 | |
| 权限 | 受保护用户组之外的特权账户 | 权限 | RDP 访问(计算机) | |
| 权限 | RDP 访问(用户) | 权限 | 层级 0 违规(会话) | |
| 权限 | 拥有强大跨域权限的用户 | 权限 | 具有本地管理员权限的用户 |
| 类别 | 描述 | 类别 | 描述 |
|---|
| 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 用户通往高价值目标的路径 |