
识别破坏AD分层结构的BloodHound攻击路径
ImproHound 是一个带有图形界面的 dotnet 独立 Windows x64 可执行文件。 要使用 ImproHound,您必须运行 SharpHound 从 AD 收集必要的数据。然后将数据上传到您的 BloodHound 安装实例。ImproHound 会连接到 BloodHound 底层的 Neo4j 数据库。在 ImproHound 中,您将通过 OU 结构将 AD 对象分为不同的层级,ImproHound 将识别出允许 AD 对象危及更高(更接近零)层级对象的 AD 关系,并将层级违规保存到 CSV 文件中。
ImproHound DEF CON Adversary Village 演讲
1. 设置您的 BloodHound 数据库
在您的 AD 中使用 SharpHound 收集 BloodHound 数据
注意:这会在您的防病毒软件、SIEM 等中产生噪音。
示例:从 cmd 运行 SharpHound.exe,收集所有数据(注意,GPOLocalGroup 不包含在 All 中):
SharpHound.exe --CollectionMethods All,GPOLocalGroup
提示 1:使用
Domain参数收集林中其他域的数据。
提示 2:要获取更多数据,请使用 会话循环收集方法
在 BloodHound GUI 中上传您的 BloodHound 数据
BloodHound 存在一个 bug,有时在上传 BloodHound 数据 zip 文件时会跳过域 json 文件。上传数据后,检查 BloodHound 中的数据库统计信息,确保域对象存在。
2. 安装 APOC Neo4j 插件 (启用我们需要的出色图形操作)
下载与您的 Neo4j 版本匹配的 APOC 版本(apoc-x.x.x.x-all.jar)。
在 版本兼容性矩阵 中找到与您的 Neo4j 版本匹配的 APOC 版本。
尝试记住您安装 Neo4j 的位置,并将 APOC jar 文件放在:$NEO4J_HOME/plugins/
/var/lib/neo4j/在您喜欢的文本编辑器中编辑 neo4j.conf,通过将以下行:
#dbms.security.procedures.unrestricted=my.extensions.example,my.procedures.*
替换为
dbms.security.procedures.unrestricted=apoc.*
来允许不受限制的 APOC 访问。
/etc/neo4j/neo4j.conf$NEO4J_HOME/conf/neo4j.conf如果您希望在一台主机上运行 ImproHound,而在另一台主机上运行 BloodHound,则必须允许远程连接到 BloodHound 主机上的 Neo4j 数据库。为此,请在
neo4j.conf中移除#dbms.default_listen_address=0.0.0.0行的 # 号。
重启 Neo4j
systemctl restart neo4jnet stop neo4j && net start neo4j (PowerShell: net stop neo4j; net start neo4j)3. 在 Windows (x64) 中下载并运行最新版本的 ImproHound.exe
确认您能够使用与 BloodHound GUI 相同的凭据登录到 BloodHound 数据库。

输入数据库凭据并建立连接。这与您在 BloodHound GUI 中使用的凭据相同。

ImproHound 会在 BloodHound 数据库中的节点上创建 'TierX' 标签。如果您之前在此 BloodHound 数据库中使用过 ImproHound,系统会询问您是继续使用已创建的分层还是重新开始。

ImproHound 提供选项:设置 '默认分层'(将 Domain Admins 设为 Tier 0,Domain Users 设为 Tier 2 等),或者将所有对象设为 Tier 2。

这是您将 AD 对象分类到不同层级的页面。窗口显示 OU 结构。每个 AD 对象都有一个层级值,可以通过箭头增减。
将子对象设为指定层级
如果您选择了一个域或 AD 容器,可以点击 '将子对象设为指定层级' 将所有子对象(递归)设置为该域/容器的层级。
将成员设为指定层级
如果您选择了一个组,可以点击 '将成员设为指定层级' 将所有成员(递归)设置为该组的层级。
为 GPO 设置层级
如果您点击 '为 GPO 设置层级',每个 GPO 的层级将被设置为它所链接的 OU 中最高层级(最接近零)的 OU 层级。未链接到 OU 的 GPO 的层级不会改变。
获取分层违规
查找 BloodHound 数据库中所有 AD 对象控制更高层级(更接近零)AD 对象的关系。
将生成两个 CSV 文件作为输出:
adobjects-[时间戳].csv: 所有 AD 对象及其所在层级。
tiering-violations-[时间戳].csv: 分层违规。
违规 CSV 中的记录示例:
| SourceTier | SourceType | SourceName | SourceDistinguishedname | Relation | IsInherited | TargetTier | TargetType | TargetName | TargetDistinguishedname |
|---|---|---|---|---|---|---|---|---|---|
| Tier1 | User | [email protected] | CN=svc-monitor,CN=Users,DC=hot,DC=local | ForceChangePassword | True | Tier0 | User | [email protected] | CN=T0_JBK,CN=Users,DC=hot,DC=local |
| Tier2 | Group | [email protected] | CN=Wrk-Admins,CN=Groups,DC=hot,DC=local | GenericWrite | Tier0 | GPO | [email protected] | CN={6AC1786C-016F-11D2-945F-00C04fB984F9},CN=Policies,CN=System,DC=hot,DC=local |
第一条记录是一个 Tier 1 服务帐户,有权更改 Tier 0 用户帐户的密码。该关系是继承的。不幸的是,并不总是能够从 BloodHound 数据中查看继承自何处,但您可以通过在“用户和计算机”中检查目标 AD 对象的权限来手动验证。第二条记录是一个组,有权编辑 GPO,该 GPO 很可能链接到包含 Tier 0 服务器的 OU,因为它是一个 Tier 0 GPO。
您可以在此处查找所有关系类型及其利用方式。
如果您发现某个对象处于过高的层级(最接近零),您应该在 ImproHound 中将其纠正,然后以该对象为 SOURCE 检查违规。如果某个对象处于过低的层级(最接近无穷大),您应该在 ImproHound 中将其纠正,然后以该对象为 TARGET 检查违规。
删除分层
所有层级标签和 ImproHound 在 BloodHound 数据库中创建的节点都将被删除。
正确地对 AD 对象进行分层非常重要。如果您将 DC 和普通低权限用户都设为 Tier 0 对象,ImproHound 将不会发现该用户对 DC 的管理员访问权限是一种分层违规。同样,如果将其两者都设为 Tier 2,也会出现同样的问题。
计算机根据被攻破后的严重程度进行分层。
用户根据他们可以登录的计算机以及他们控制的 AD 对象进行分层。例如,具有编辑链接到 Tier 1 服务器的 GPO 权限的用户,将使该用户成为 Tier 1 对象。
一个组属于其成员中最低的层级(最接近无穷大),除非该组包含不良成员,例如普通用户是 Domain Admins 的成员。
示例:Domain Users 是一个 Tier 2 组,即使您的 Tier 0 用户是该组的成员,因为赋予用户权限的并不是 Domain Users 的成员身份。另一方面,Domain Admins 组是一个 Tier 0 组,因为该组的成员身份使用户拥有很高的权限。据我所知,Cloneable Domain Controllers 组没有任何 AD 权限,但它应该只包含 Tier 0 对象,即 DC,因此它是一个 Tier 0 组。
一个容器属于其子对象中最高的层级(最接近零),或更高。
示例:您将所有的 Tier 0、Tier 1 和 Tier 2 用户都放在 Users 容器中。一个对 Users 容器拥有完全控制权限的用户将能够危及所有用户,包括 Tier 0 用户(其中一些受保护,但这不影响本例),因此 Users 容器必须是 Tier 0 对象。
GPO 的层级由其链接到的 OU 的层级决定。GPO 属于其链接到的 OU 中最高的层级(最接近零)。 使用 '为 GPO 设置层级' 按钮确保所有 GPO 遵循此原则。
示例:一个有权编辑链接到 Tier 1 OU 的 GPO 的用户,可以通过修改 GPO 来控制 Tier 1 OU 下所有服务器上的 Administrators 成员身份。