Active Directory ACL可视化工具和资源管理器- 谁是真正的域管理员?
作者:Sec-Labs | 发布时间:
项目地址
https://github.com/lkarlslund/Adalanche
Adalanche 开源
Active Directory ACL 可视化工具和资源管理器
Adalanche 提供即时结果,向您显示用户和组在 Active Directory 中拥有的权限。 它可用于可视化和探索谁可以接管帐户、机器或整个域,并可用于查找和显示错误配置。

我可以拥有域管理员吗?
Active Directory 安全性是出了名的困难。 小型组织通常不知道他们在做什么,而且有太多人只是被添加到域管理员中。 在大型组织中,您有大量具有不同需求的人员,并且他们被授权访问 AD 中不同程度的权力。 在某个时间点,有人犯了错误,这会让你付出沉重的代价。
下载
Adalanche 是一个一体化的二进制文件——它从 Active Directory 或本地 Windows 机器收集信息,并可以分析收集到的数据。 如果您只进行 AD 分析,只需获取您首选平台的二进制文件。 稍后您可以通过 GPO 或其他编排为您的 Windows 成员计算机部署专用收集器 .exe,并获得更多洞察力。
从Releases 下载最新版本或最新提交的构建 。 通常使用最新的提交运行是可以的,但有时可能会出现问题。 发行版被认为是稳定的,适合不太喜欢冒险的人。
自己建造
如果您更喜欢完全控制,您可以在任何受支持的平台(Windows、MacOS、Linux)上推出自己的控制权:
- 先决条件:Go 1.19、PowerShell 7、git
git clone [https://github.com/lkarlslund/Adalanche](https://github.com/lkarlslund/Adalanche) Adalanchecd Adalanche./build.ps1
生成的二进制文件在“二进制文件”子文件夹中可用。
首次运行 - 全自动
如果您在加入 Windows 域的计算机上运行 Adalanche,则应该在 没有任何参数 的情况下工作,因为 Adalanche 会尝试尽可能多地自动检测。 在这种情况下,在给定参数的情况下,您将以收集-分析模式运行(从 Active Directory 收集,然后分析)。
对于更高级的使用(推荐),首先使用适当的选项进行收集。 您所有的数据文件(属于我们),最终将位于数据子文件夹中(或用于 --datapath dir 使用替代文件夹)。
有关其他可能性,请参阅程序选项(帮助或命令 --help)。
收集数据
活动目录
数据的主要来源来自 Active Directory,并使用以下命令启动:
adalanche collect activedirectory [--options ...]
如果您使用的是未加入域的 Windows 计算机或其他操作系统,您至少需要 --domain 参数以及用户名和密码(如果 Adalanche 需要密码但您没有提供,系统会提示您输入密码在命令行上——当心 SysMon 或其他可能捕获您的密码的命令行日志记录工具)。
LDAPS(端口 636 上的 TLS)是默认设置。 如果您在实验室,并且尚未设置 CA,您将收到连接错误,因为计算机不信任 AD 证书。 使用“--ignorecert”开关禁用证书验证,或者使用 --tlsmode NoTLS --port 389 选项将协议更改为 LDAP。
使用 TLS 端口 636,忽略证书并使用 NTLM 身份验证,为来自 Linux pwnage box 的 contoso.local 创建数据文件的示例:
adalanche collect activedirectory --ignorecert --domain contoso.local --authdomain CONTOSO --username joe --password Hunter42
使用当前用户从域加入 Windows 成员:
adalanche collect activedirectory
从域加入 Windows 机器使用其他凭据比登录:
adalanche collect activedirectory --authmode ntlm --username joe --password Hunter42
还有更多选项可用,例如关于要收集哪些 LDAP 上下文、是否收集 GPO 等。请注意,您可以通过在本地安装 sysvol 并将 Adalanche 指向此 GPO 收集路径来从 Linux 收集 GPO - 但您将丢失单个文件的 ACL 分析。
LDAP 结果代码 49
Adalanche 使用的 LDAP 库存在限制,这可能导致此错误:“LDAP 结果代码 49“无效凭证”:8009030C:LdapErr:DSID-0C0906B5,注释:AcceptSecurityContext 错误,数据 52e,v4563”。
这通常是通过 LDAP 启用 SSL 连接的“通道绑定”或“签名”要求,作为 Microsoft 为使 LDAP 更安全而加强努力的一部分。
以下是建议的替代解决方案:
通过明文 LDAP 转储数据
使用此命令:
adalanche collect activedirectory --port 389 --tlsmode NoTLS
使用 SysInternals AD Explorer 转储数据
SysInternals AD Explorer (adexplorer64.exe) 是一个增强的 GUI 应用程序,可让您浏览所有对象并查看所有属性。 它利用 Windows LDAP 库(就像用户和计算机等),它支持 LDAP 传输的“通道绑定”和“签名”。 它还具有方便的“快照”功能,允许您将整个 AD 转储到专有文件中,Adalanche 可以摄取该文件作为直接与 LDAP 对话的替代方案。
使用AD Explorer作为数据源的过程是:
- 启动“adexplorer64.exe”
- 连接到您的域,对于简单的设置,您可以将所有字段留空并按连接
- 选择文件 | 创建快照…并将文件保存在某处。 没有进度指示器,所以请耐心等待
- 运行 Adalanche 以收集 Active Directory 对象和 GPO 数据:
adalanche collect activedirectory --adexplorerfile=yoursavedfile.bin
然后,您将在数据路径中拥有压缩的 AD 数据和 GPO 数据,就像正常的收集运行一样。 您现在可以删除 AD Explorer 数据文件,因为它已转换为 Adalanche 原生格式。
收集本地计算机数据 (Windows)
对于作为 Active Directory 域(或独立)成员的 Windows 系统,您可以通过运行收集器模块从本地计算机收集更多信息。 有一个作为 32 位 Windows 可执行文件发布的独立版本,它也可以透明地在 64 位系统上运行。 这个想法是您通过 GPO 或您认为合适的任何方式(psexec、登录脚本等)与计划任务集中编排它。
收集器不需要提升的特权,并且可以在具有特权的本地系统帐户或作为随机用户的情况下正常运行。
adalanche-collector --outputpath \\some\share\where\youcanwrite\butnotread
您也可以从 Adalanche 二进制文件运行本地机器收集器,但这仅包含在 64 位 Windows 构建中:
adalanche collect localmachine [--options ...]
请记住保护您的收藏库 UNC 路径,以便成员机器只能创建/写入/修改文件,但不能从中读取。 只有你——分析师——应该能够这样做。
如果文件是数据路径的一部分(在子文件夹中或只是复制进来——无论对你有用什么),当你运行它时,这些文件将自动导入到 Adalanche 中
这将使您深入了解谁使用什么系统、服务帐户是域用户、自动管理员登录、谁是本地管理员、谁可以 RDP 进入系统以及稍后的更多有趣的东西:-)
分析
这非常简单 - 您收集的所有内容都应该在数据目录中,在主文件夹或子文件夹中。
任何驻留在其中且 Adalanche 理解的内容都会自动加载、关联和使用。 这完全是魔术。
重要提示:如果您正在进行多域分析,请将每个域的所有 AD 对象和 GPO 文件放在它们自己的子文件夹中,这样 Adalanche 就可以确定要合并的内容和不合并的内容。 转储时只需指向一个新 --datapath 的收集运行(例如 adalanche collect activedirectory --datapath=data/domain1 --domain=domain1 :)
这些扩展被识别:
- .localmachine.json - Windows 收集器数据
- .gpodata.json - Active Directory GPO 数据
- .objects.msgp.lz4 - MsgPack 格式的 Active Directory 对象/模式数据(LZ4 压缩)
用于分析和启动浏览器的高级命令行:
adalanche analyze
这里也有一些选项 - 试试 adalanche analyze --help
用户界面

启动后,您会看到一些关于加载到内存中的内容以及检测到对象之间的边数的一些统计信息。 别担心,如果您有足够的 RAM,Adalanche 可以处理数百万个对象和边;)
预加载的查询允许您查看谁可以 pwn“管理员”、“域管理员”和“企业管理员”。 查询目标节点用红色标记。
在查询界面点击“分析”按钮,即可显示结果。 如果你在这上面得到了很多对象,恭喜,你正在经营一家当铺。
根据您对结果是否满意或不满意,您可以进行调整或其他搜索。
预定义搜索
为了简化学习体验,“Adalanche”中内置了许多示例查询。 您可以通过按“示例查询”按钮并选择一个来访问这些查询。 这应该让您了解如何进行查询。
分析选项

模式允许您在以下之间切换:
- 在正常模式下,您选择目标节点,Adalanche 计算出谁可以到达这些目标节点(最常见的搜索)
- 在反向模式下,您选择目标节点,Adalanche 计算出它们有什么影响(“域用户”可以做什么?)
- SrcTgt 模式由两个用逗号分隔的查询组成,它允许您执行从源到目标的路径搜索。 您的目标选择应限制在每个不超过 5 个,因为 S*T 搜索中的查询结果将在引擎中运行。
如果您的查询返回超过 1000 个对象,Adalanche 将拒绝该查询,因为它有可能使您的浏览器崩溃。 使用“强制太多数据”可以覆盖它,并且根据您的浏览器和计算机,您可能会获得更多数据。 在我使用 Firefox 的设置中,2500 个对象是没有问题的,但更多是可能的,但需要很大的耐心才能运行图形 lauout。
请记住,您可能会得到太多结果。 使用 (&(attribute=something)(_limit=10)) 限制目标节点的选择,只获取前 10 个目标节点(参见下面的 LDAP 查询)
修剪岛节点删除结果中未连接的对象。
反向链接还会在您的搜索中显示“更高排名”结果的边缘,并有可能向您显示其他隐藏的有趣边缘。 它确实会导致图表中出现一团毛线,但在某些情况下很有用。
分析深度允许您限制返回目标选择的边数。 将其设置为 0 只会导致查询目标(不要在此处修剪孤岛,否则您将一无所获),将其设置为 1 只会返回相邻边上的结果。 如果您返回的数据太多,这将非常有用。
最大传出限制了一个对象允许的传出边数,并且可以帮助限制具有许多分配的组和对象的结果。
分析方法
按“分析方法”选项卡以允许您进行基于边缘的过滤。

FML 不是通常的缩写,而是代表 First、Middle 和 Last。 禁用“中间”选择器也会阻止结果中出现“最后”,除非由于搜索的方式而将其选为“第一”。
分析对象

这与上面的“分析方法”限制器的工作方式相同。
LDAP 查询弹出窗口
当你点击页面底部的“LDAP查询”选项卡时,你会得到搜索界面:

您输入要搜索的内容的查询。 您还可以选择添加辅助排除查询,用逗号分隔包含和排除查询。 排除查询中匹配的事物 永远不会 添加到结果中。
样品搜索:
(objectClass=person),(name=*group*)
选择所有 objectClass 属性设置为 person 的对象作为目标,但永远不会将名称属性与 glob 模式 组 匹配的任何对象添加到连接的结果对象中。 因为你也可以在边上进行匹配,所以这会变得既复杂又强大 :-)
操作理论
Adalanche 的工作方式与其他工具略有不同,因为它会从 Active Directory 服务器转储所有内容,然后将其保存到高度压缩的二进制缓存文件中以备后用。 这个转储可以由任何非特权用户完成,除非 Active Directory 已经被强化以防止这种情况(很少见)。
如果您收集 GPO,我建议您使用域管理员,因为 GPO 通常仅限于应用于某些计算机,而普通用户无法读取这些文件。 这将限制本可以从 GPO 收集的结果。
分析阶段是在所有缓存文件上完成的,因此您在进行分析时不必连接到系统。 通过这种方式,您可以探索不同的场景,并提出其他方式不容易回答的问题。
分析/可视化
该工具就像浏览器中的交互式地图一样工作,默认为 ldap 搜索查询,向您展示如何成为“域管理员”或“企业管理员”(即所述组的成员或接管直接或这些团体的间接成员。
LDAP 查询
该工具有自己的 LDAP 查询解析器,使用熟悉的搜索语言可以轻松搜索要接管的其他对象。
查询支持:
- 所有属性名称的不区分大小写的匹配
- 使用星号语法检查属性是否存在 (member=*)
- 使用等式 (=) 对字符串值进行不区分大小写的匹配
- 使用 <、<=、> 和 >= 运算符进行整数比较
- 如果搜索值包括 ? 要么 *
- 如果搜索值包含在正斜杠中,则使用相等性区分大小写的正则表达式搜索:(name=/^Sir.*Mix.*lot$/(可以使用 /(?i)pattern/ 标志使大小写不敏感,请参阅 https:// github.com/google/re2/wiki/语法 )
- 可扩展匹配:1.2.840.113556.1.4.803(您也可以使用 :and:) LDAP_MATCHING_RULE_BIT_AND
- 可扩展匹配:1.2.840.113556.1.4.804(您也可以使用 :or:) LDAP_MATCHING_RULE_BIT_OR
- 可扩展匹配:1.2.840.113556.1.4.1941(您也可以使用 :dnchain:) LDAP_MATCHING_RULE_IN_CHAIN
- 自定义可扩展匹配:count - 返回属性值的数量(member:count:>20 给出成员数超过 20 的组)
- 自定义可扩展匹配:长度 - 匹配属性值的长度(名称:长度:> 20 为您提供长名称的对象)
- 自定义可扩展匹配:since - 将属性解析为时间戳并将您的值解析为持续时间 - pwdLastSet:since:<-6Y5M4D3h2m1s(pawLastSet 小于时间 6 年 5 个月 4 天 3 小时 2 分钟 1 秒ago - 或者直接传递一个代表秒的整数)
- 合成属性:_limit (_limit=10) 在前 10 次命中时返回 true,在其余命中时返回 false,最大输出为 10 个项目
- 合成属性:_random100 (_random100<10) 允许您返回随机百分比的结果 (&(objectCategory=Person)(_random100<1)) 给您 1% 的用户
- 合成属性:_canpwn - 允许您根据对象可以 直接 pwn 的内容来选择对象(&(objectCategory=Group)(_canpwn=ResetPassword)) 为您提供所有分配有重置密码权限的组
- 合成属性:_pwnable - 允许您根据对象的 直接 pwned 方式选择对象(&(objectCategory=Person)(_pwnable=ResetPassword)) 为您提供所有可以重置密码的用户
- 全局匹配属性名称 - 搜索 (*name=something) 是可能的 - 也只是 * 搜索所有属性
- 自定义可扩展匹配:timediff - 允许您搜索未使用的帐户或相对于其他属性的密码更改 - 例如 lastLogonTimestamp:timediff(pwdLastSet):>6M 查找 lastLogonTimestamp 为 6 个月或比 pwdLastSet 最近的所有对象
- 自定义可扩展匹配:caseExactMatch - 将文本搜索(精确、全局)切换到区分大小写模式
检测器及其含义
| 探测器 | 解释 |
|---|---|
| ACL 包含拒绝 | 此标志仅表示 ACL 包含拒绝条目,可能使其他检测误报。 您可以使用安全选项卡直接在 AD 上检查有效权限 |
| 添加会员 | 实体可以通过成员属性将成员更改为组 |
| 添加成员组属性 | 该实体可以通过 Member 属性将成员更改为组(该集合还包含 Is-Member-of-DL 属性,但您不能写入该属性) |
| 添加自我成员 | 实体可以在成员列表中添加或删除自己 |
| AdminSDHolderOverwriteACL | 该实体将定期获得它的 ACL 被 AdminADHolder 对象上的 ACL 覆盖 |
| 所有扩展权利 | 实体拥有对象的所有扩展权限 |
| 证书注册 | 该实体被允许注册到该证书模板中。 这并不意味着它发布在您可以注册的 CA 服务器上 |
| 受 GPO 影响的计算机 | 计算机对象可能受此 GPO 影响。 如果正在使用过滤,则会出现误报 |
| 创建任何对象 | ACL 中的权限允许实体在容器中创建任何类型的对象 |
| 创建计算机 | ACL 中的权限允许实体在容器中创建计算机对象 |
| 创建组 | ACL 中的权限允许实体在容器中创建组对象 |
| 创建用户 | ACL 中的权限允许实体在容器中创建用户对象 |
| DCReplicationGetChanges | 您可以从 DC 同步非机密数据 |
| DDC复制同步 | 您可以触发 DC 之间的同步 |
| 直流同步 | 如果 Changes 和 ChangesAll 都设置了,你可以 DCsync - 所以这个标志是一个 AND 或其他两个 |
| 删除子目标 | ACL 中的权限允许实体通过父级的 DELETE_CHILD 权限删除所有子级 |
| 删除对象 | ACL 中的权限允许实体删除容器中的任何种类对象 |
| DSReplicationGetChangesAll | 您可以同步来自 DC 的机密数据(散列!)。 需要 DCReplicationGetChanges! |
| 通用所有 | 实体对对象具有GenericAll权限,这意味着或多或少与“拥有”相同 |
| GPOMachineConfigPartOfGPO | 实验性的 |
| GPOUserConfigPartOfGPO | 实验性的 |
| HasAutoAdminLogonCredentials | 该对象设置为使用以纯文本形式存储在注册表中以供任何用户阅读的实体凭据自动登录 |
| 有MSA | |
| HasServiceAccountCredentials | 该对象使用本地安装服务的实体凭据,如果您 pwn 机器,则可以将其提取 |
| 有SPN | 该实体有一个 SPN,并且可以由任何经过身份验证的用户进行 kerberoast |
| 有SPNNoPreauth | 该实体有一个 SPN,并且可以由未经身份验证的用户进行 kerberoast |
| 继承安全 | 此标志仅表示该对象从父对象继承其安全 ACL。 如果它被移动,许可将改变为它的新父母所规定的 |
| 本地管理员权限 | 该实体对该对象具有本地管理权限。 这是通过 GPO 或收集器模块检测到的 |
| 本地 DCOM 权限 | 实体有权对对象使用 DCOM。 这是通过 GPO 或收集器模块检测到的 |
| 本地 RDP 权利 | 实体有权对对象进行 RDP。 这是通过 GPO 或收集器模块检测到的。 这并不意味着你 pwn 机器,但你可以获得一个会话并尝试执行 PrivEsc |
| LocalSession最后一天 | 该实体在过去一天内至少进行了一次会话 |
| LocalSession上个月 | 该实体在上个月内至少进行过一次会话 |
| 本地会话上周 | 该实体在上周至少进行了一次会话 |
| 本地短信管理员 | 实体有权对对象使用 SCCM 配置管理器。 这是通过收集器模块检测到的。 这并不意味着每个人都是 SCCM 管理员,但有些人是 |
| 机器脚本 | 与上面相同,就像启动或关闭脚本一样。 通过 GPO 检测 |
| 组员 | 该实体是该组的成员 |
| 拥有 | 实体拥有该对象,并且可以对它做任何它想做的事情 |
| 读取LAPS密码 | 允许实体读取 mS-MCS-AdmPwd 属性中的明文 LAPS 密码 |
| 读取MSA密码 | 允许实体读取对象中的明文密码 |
| 重设密码 | ACL 允许实体在不知道当前密码的情况下强行重置用户帐户密码。 这是嘈杂的,并且至少会提醒用户,然后用户将无法再登录。 |
| ScheduledTaskOnUNCPath 任务 | 该对象包含位于 UNC 路径上的计划任务。 如果可以控制 UNC 路径,则可以控制执行的内容 |
| SID历史平等 | objects SID-History 属性指向这个实体,从权限的角度来看使它们相等 |
| 取得所有权 | 该实体可以使自己成为所有者 |
| 全写 | 该实体允许所有写操作 |
| 允许写操作 | 允许实体写入对象的 ms-DS-Allowed-To-Act-On-Behalf-Of-Other-Identity 属性,因此我们可以让它接受模拟,否则将无法正常工作 |
| WriteAltSecurityIdentities | 该实体被允许写入 Alt-Security-Identities 属性,因此您可以将自己的证书放在那里,然后使用该证书作为该用户(通过 PKinit 或类似方式)进行身份验证 |
| 写属性安全GUID | 实体可以写入 AttributeSecurityGUID。 我不确定这是否可行,但它有可能允许您将一个重要的属性添加到一个不太重要的属性集中 |
| 写入DACL | 实体可以写入 DACL,在授予它们后有效地赋予它所有权限 |
| 写扩展全部 | 允许实体执行所有扩展写操作 |
| WriteKeyCredentialLink | 实体可以写入 msDK-KeyCredentialLink 属性 |
| 写入配置文件路径 | 实体可以写入用户的用户配置文件路径 |
| 写属性全部 | 实体可以写入任何属性(同上,ACL 只是有点不同) |
| 写脚本路径 | 该实体可以写入用户的脚本路径,让他们在用户登录时立即远程执行 |
| 写入SPN | 实体可以使用 SETSPN.EXE 或类似工具自由写入 Service-Principal-Name 属性。 然后你可以kerberoast帐户 |
| 写入已验证的 SPN | 该实体可以使用 SETSPN.EXE 或类似工具对 Service-Principal-Name 属性进行经过验证的写入。 然后你可以kerberoast帐户 |
在 GUI 中绘制路径
对象上有一个右键单击菜单,因此您可以在显示的图形中进行搜索。 首先右击一个目标:

然后找到要跟踪的来源:

如果存在从源到目标的连接,您将获得如下所示的整个攻击路径:

您还可以选择图表上的任何对象,并从中进行正常或反向搜索。
当前限制
- 包含 500.000 个对象的大型 AD 生成的文件大小约为 250MB
- Adalanche 需要合理数量的内存 - 加载和分析上述 AD 将使用大约 2.5GB RAM - 但 RAM 很便宜,而 pwned 则不然。
- 可能有错误、误报和我忽略的东西。 欢迎反馈!
- 需要多个 ACL 才能通过的服务存在未解决的挑战(例如,证书服务器仅允许“可以注册的用户”组的成员使用注册,而证书模板允许“域用户”注册 - 这看起来像“域用户”可以注册到 Adalanche)。 文件共享也会出现同样的问题,所以这个分析还没有完成。
常见问题:这与 BloodHound 相比如何?
由于这是一个常见的问题,这里有一个简短的列表,列出了我所知道的不同之处。 我已经有很长一段时间没有看过 BloodHound 了,在做 Adalanche 的时候也没有用过它——我想尝试自己解决问题,而不是因为别人的设计而固执己见。
| 特征 | Adalanche | BloodHound |
|---|---|---|
| 操作系统兼容性 | 赢/OSX/Linux | 赢/OSX/Linux |
| 先决条件 | 没有任何 | Python、Neo4J、.Net(SharpHound) |
| 初始设置 | 没有任何 | 看上面 |
| 图形用户界面 | 基于浏览器 | 基于电子的应用程序 |
| 数据限制 | 内存限制 | 没有任何 |
| 查询 | 扩展的 LDAP 语法 + 选项 | Neo4J 密码 |
| 预定义查询 | 是的 | 是的 |
| 从那以后帮助世界 | 2020 | 2016年 |
| 检测为恶意软件 | 不* | 是的(误报!) |
*迄今为止