Why AD Enumeration

该网络是 Breaching AD 网络的延续。 请确保先完成此网络,然后再继续此操作。 另请注意,我们将广泛讨论 AD 对象。 如果您需要复习一下,请快速浏览一下这个房间。 现在我们有了第一组有效的 Active Directory (AD) 凭据,我们将探索可用于枚举 AD 的不同方法。

AD枚举

一旦我们拥有第一组 AD 凭据以及在网络上使用它们进行身份验证的方法,一个全新的可能性世界就会打开! 我们可以开始枚举有关经过身份验证的访问(甚至是超低权限访问)的 AD 设置和结构的各种详细信息。

在红队参与期间,这通常会导致我们能够执行某种形式的权限升级或横向移动以获得额外的访问权限,直到我们有足够的权限来执行和实现我们的目标。 在大多数情况下,枚举和利用紧密地交织在一起。 一旦利用了枚举阶段显示的攻击路径,就会从这个新的特权位置再次执行枚举,如下图所示。

学习目标
在此网络中,我们将介绍几种可用于枚举 AD 的方法。 这绝不是一个完整的列表,因为可用的方法通常是高度情境化的,并且依赖于所获得的违规行为。 但是,我们将介绍以下枚举 AD 的技术:

  • Microsoft 管理控制台的 AD 管理单元。
  • 命令提示符的网络命令。
  • PowerShell 的 AD-RSAT cmdlet。
  • Bloodhound。

Credential Injection

在讨论 AD 对象和枚举之前,我们首先讨论凭据注入方法。 从破坏 AD 网络中,您会发现凭据通常可以在不损害加入域的计算机的情况下找到。 特定的枚举技术可能需要特定的设置才能工作。

Windows 与 Linux

“知敌知己,则不惧百战;知己不知敌,百胜必败。”——《孙子兵法》 。

在 Kali 机器上进行 AD 枚举可以取得令人难以置信的成果。 尽管如此,如果你真的想进行深入的枚举甚至利用,你需要了解和模仿你的敌人。 因此,您需要一台 Windows 计算机。 这将使我们能够使用几种内置方法来进行枚举和利用。 在此网络中,我们将探索这些内置工具之一,称为“runas.exe”二进制文件。

鲁纳斯解释

您是否曾经发现过 AD 凭据但无处可登录? Runas 可能就是您一直在寻找的答案!

在安全评估中,您通常可以访问网络并刚刚发现 AD 凭据,但没有方法或权限来创建新的加入域的计算机。 因此,我们需要能够在我们控制的 Windows 计算机上使用这些凭据。

如果我们有 : 格式的 AD 凭据,我们可以使用 Runas(一个合法的 Windows 二进制文件)将凭据注入到内存中。 通常的 Runas 命令看起来像这样:

runas.exe /netonly /user:<domain>\<username> cmd.exe

我们看一下参数:

  • /netonly - 由于我们没有加入域,因此我们希望加载网络身份验证的凭据,但不针对域控制器进行身份验证。 因此,在计算机上本地执行的命令将在标准 Windows 帐户的上下文中运行,但任何网络连接都将使用此处指定的帐户进行。
  • /user - 在这里,我们提供域和用户名的详细信息。 使用完全限定域名 (FQDN) 而不仅仅是域的 NetBIOS 名称始终是一个安全的选择,因为这将有助于解决问题。
  • cmd.exe - 这是我们在注入凭据后要执行的程序。 这可以更改为任何内容,但最安全的选择是 cmd.exe,因为您可以使用它来启动您想要的任何内容,并注入凭据。

运行此命令后,系统将提示您提供密码。 请注意,由于我们添加了 /netonly 参数,因此域控制器不会直接验证凭据,因此它将接受任何密码。 我们仍然需要确认网络凭据是否已成功且正确加载。

注意: 如果您使用自己的 Windows 计算机,则应确保以管理员身份运行第一个命令提示符。 这会将管理员令牌注入到 CMD 中。 如果您运行需要 Runas 生成的 CMD 本地管理权限的工具,则令牌将已经可用。 这不会为您提供网络管理权限,但会确保您执行的任何本地命令都将以管理权限执行。

始终是 DNS

注意: 仅当您使用自己的 Windows 计算机进行练习时才需要执行这些后续步骤。 然而,学习如何表演是很好的知识,因为它可能对红队练习有帮助。

提供密码后,将打开一个新的命令提示符窗口。 现在我们仍然需要验证我们的凭据是否有效。 最可靠的方法是列出 SYSVOL。 任何 AD 帐户,无论权限有多低,都可以读取 SYSVOL 目录的内容。

SYSVOL 是所有域控制器上都存在的文件夹。 它是一个共享文件夹,存储组策略对象 (GPO) 和信息以及任何其他域相关的脚本。 它是 Active Directory 的重要组件,因为它将这些 GPO 传递到域中的所有计算机。 然后,加入域的计算机可以读取这些 GPO 并应用适用的 GPO,从而从中央位置进行域范围的配置更改。

在列出 SYSVOL 之前,我们需要配置 DNS。 有时您很幸运,内部 DNS 会通过 DHCP 或 VPN 连接自动为您配置,但并非总是如此(例如此 TryHackMe 网络)。 最好了解如何手动执行此操作。 对于 DNS 服务器来说,最安全的选择通常是域控制器。 使用域控制器的IP,我们可以在PowerShell窗口中执行以下命令:

$dnsip = "<DC IP>"
$index = Get-NetAdapter -Name 'Ethernet' | Select-Object -ExpandProperty 'ifIndex'
Set-DnsClientServerAddress -InterfaceIndex $index -ServerAddresses $dnsip

当然,“以太网”将是连接到 TryHackMe 网络的任何接口。 我们可以通过运行以下命令来验证 DNS 是否正常工作:

​ Command Prompt

C:\> nslookup za.tryhackme.com

现在应该解析为 DC IP,因为这是托管 FQDN 的位置。 现在 DNS 正在运行,我们终于可以测试我们的凭据了。 我们可以使用以下命令强制基于网络列出 SYSVOL 目录:

​ Command Prompt

         C:\Tools>dir \\za.tryhackme.com\SYSVOL\
Volume in drive \\za.tryhackme.com\SYSVOL is Windows
Volume Serial Number is 1634-22A9

Directory of \\za.tryhackme.com\SYSVOL

02/24/2022 09:57 PM <DIR> .
02/24/2022 09:57 PM <DIR> ..
02/24/2022 09:57 PM <JUNCTION> za.tryhackme.com [C:\Windows\SYSVOL\domain]
0 File(s) 0 bytes
3 Dir(s) 51,835,408,384 bytes free

我们现在不会太深入地了解 SYSVOL 的内容,但请注意,枚举其内容也很好,因为那里可能潜伏着一些额外的 AD 凭据。

IP vs Hostnames

问题: dir \\za.tryhackme.com\SYSVOLdir \\<DC IP>\SYSVOL 之间有区别吗 为什么 DNS 这么大惊小怪?

有很大的区别,这可以归结为所使用的身份验证方法。 当我们提供主机名时,网络身份验证将首先尝试执行 Kerberos 身份验证。 由于 Kerberos 身份验证使用嵌入在票证中的主机名,因此如果我们提供 IP,则可以强制身份验证类型为 NTLM。 虽然从表面上看,这对我们来说并不重要,但了解这些细微的差异是有好处的,因为它们可以让您在红队评估期间保持更加隐秘。 在某些情况下,组织将监控 OverPass 和 Pass-The-Hash 攻击。 强制进行 NTLM 身份验证是本书中介绍的一个很好的技巧,可以避免在这些情况下被检测到。

使用注入的凭据

现在我们已经将 AD 凭据注入到内存中,这就是乐趣的开始。 使用 /netonly 选项,所有网络通信都将使用这些注入的凭据进行身份验证。 这包括从该命令提示符窗口执行的应用程序的所有网络通信。

这就是它变得强大的地方。 您是否曾经遇到过 MS SQL 数据库使用 Windows 身份验证,而您未加入域的情况? 从该命令提示符启动 MS SQL Studio; 即使它显示您的本地用户名,单击“登录”,它将在后台使用 AD 凭据进行身份验证! 我们甚至可以使用它来对使用 NTLM 身份验证的 Web 应用程序进行身份验证

我们将在下一个任务中使用它来实现我们的第一个 AD 枚举技术。

Enumeration through Microsoft Management Console

您现在应该已经完成了 AD 基础知识室,其中最初介绍了不同的 AD 对象。 在此任务中,假设您了解这些对象是什么。 使用 RDP 和您在任务 1 中配置的凭据连接到 THMJMP1 以执行此任务。

微软管理控制台

在此任务中,我们将探索第一个枚举方法,这是直到最后一个任务为止唯一使用 GUI 的方法。 我们将使用 Microsoft 管理控制台 (MMC) 和远程服务器管理工具 (RSAT ) AD 管理单元。 如果您使用提供的 Windows VM (THMJMP1),则它已为您安装。 但是,如果您使用自己的 Windows 计算机,则可以执行以下步骤来安装管理单元:

  1. 开始
  2. 搜索“应用程序和功能”并按 Enter
  3. 单击“管理可选功能
  4. 单击“添加功能
  5. 搜索 “RSAT”
  6. 选择“RSAT:Active Directory 域服务和轻量级目录工具”,然后单击“安装

您可以通过使用 Windows“开始”按钮、搜索“运行”并键入 MMC 来启动 MMC。 如果我们只是正常运行 MMC,它将无法工作,因为我们的计算机未加入域,并且我们的本地帐户无法用于对域进行身份验证。

MMC failed start due to credentials

这就是上一个任务中的 Runas 窗口发挥作用的地方。 在该窗口中,我们可以启动 MMC,这将确保所有 MMC 网络连接都将使用我们注入的 AD 凭据。

在 MMC 中,我们现在可以附加 AD RSAT 管理单元:

  1. 单击 文件 -> 添加/删除管理单元
  2. 选择并添加所有三个 Active Directory 管理单元
  3. 单击所有错误和警告
  4. 右键单击 Active Directory 域和信任,然后选择 更改林
  5. 输入 za.tryhackme.com 作为 根域,然后单击 确定
  6. 右键单击 Active Directory 站点和服务,然后选择 更改林
  7. 输入 za.tryhackme.com 作为 根域,然后单击“确定”
  8. 右键单击 Active Directory 用户和计算机,然后选择 更改域
  9. 输入 za.tryhackme.com 作为 域名,然后单击 确定
  10. 右键单击左侧窗格中的 Active Directory 用户和计算机
  11. 单击 查看 -> 高级功能

如果到目前为止一切正常,您的 MMC 现在应该指向目标域并对其进行身份验证:

MMC AD Snap-in

我们现在可以开始在这里枚举有关 AD 结构的信息。

用户和计算机

让我们看一下Active Directory 的结构。 对于此任务,我们将重点关注 AD 用户和计算机。 展开该管理单元并展开 za 域以查看初始组织单位 (OU) 结构:

MMC AD Snap-in

让我们看一下 People 目录。 这里我们看到用户是按照部门OU来划分的。 单击每个 OU 将显示属于该部门的用户。

MMC AD Snap-in

单击这些用户中的任何一个都将允许我们查看他们的所有属性和属性。 我们还可以查看他们属于哪些组:

MMC AD Snap-in

我们还可以使用 MMC 来查找环境中的主机。 如果我们单击“服务器”或“工作站”,将显示加入域的计算机的列表。

MMC AD Snap-in

如果我们有相关权限,我们还可以使用MMC直接对AD进行更改,例如更改用户的密码或将帐户添加到特定组。 使用 MMC 来更好地理解 AD 域结构。 利用搜索功能来寻找对象。

好处

  • GUI 提供了一种获得 AD 环境整体视图的绝佳方法。
  • 可以快速搜索不同的AD对象。
  • 提供直接查看AD对象具体更新的方法。
  • 如果我们有足够的权限,我们可以直接更新现有的AD对象或添加新的。

缺点

  • GUI 需要 RDP 访问执行它的计算机。
  • 尽管搜索对象速度很快,但无法执行收集 AD 范围内的特性或属性。

Enumeration through Command Prompt

命令提示符

有时,您只需要执行快速而肮脏的 AD 查找,命令提示符可以为您提供帮助。 当您可能无法通过 RDP 访问系统、防御者正在监视 PowerShell 的使用,并且您需要通过远程访问特洛伊木马 (RAT) 执行 AD 枚举时,优秀可靠的 CMD 会非常方便。 在网络钓鱼负载中嵌入几个简单的 AD 枚举命令甚至会很有帮助,以帮助您获得重要信息,从而帮助您发起最终攻击。

CMD 有一个内置命令,我们可以使用它来枚举有关 AD 的信息,即“net”。 “net”命令是一个方便的工具,用于枚举有关本地系统和 AD 的信息。 我们将看看从这个位置可以列举的一些有趣的事情,但这并不是一个详尽的列表。

注意:对于此任务,您必须使用 THMJMP1,并且无法使用您自己的 Windows VM。 这将在缺点中解释。

用户

我们可以使用“net”命令通过“user”子选项列出AD域中的所有用户:

​ Command Prompt

         C:\>net user /domain
The request will be processed at a domain controller for domain za.tryhackme.com

User accounts for \\THMDC

-------------------------------------------------------------------------------
aaron.conway aaron.hancock aaron.harris
aaron.johnson aaron.lewis aaron.moore
aaron.patel aaron.smith abbie.joyce
abbie.robertson abbie.taylor abbie.walker
abdul.akhtar abdul.bates abdul.holt
abdul.jones abdul.wall abdul.west
abdul.wilson abigail.cox abigail.cox1
abigail.smith abigail.ward abigail.wheeler
[....]
The command completed successfully.

这将为我们返回所有 AD 用户,并有助于确定域的大小以进行进一步的攻击。 我们还可以使用此子选项来枚举有关单个用户帐户的更详细信息:

​ Command Prompt

         C:\>net user zoe.marshall /domain
The request will be processed at a domain controller for domain za.tryhackme.com

User name zoe.marshall
Full Name Zoe Marshall
Comment
User's comment
Country/region code 000 (System Default)
Account active Yes
Account expires Never

Password last set 2/24/2022 10:06:06 PM
Password expires Never
Password changeable 2/24/2022 10:06:06 PM
Password required Yes
User may change password Yes

Workstations allowed All
Logon script
User profile
Home directory
Last logon Never

Logon hours allowed All

Local Group Memberships
Global Group memberships *Domain Users *Internet Access
The command completed successfully.

注意: 如果用户只是少数 AD 组的一部分,此命令将能够向我们显示组成员身份。 但是,通常,在超过十个组成员身份后,该命令将无法列出所有组成员。

团体

我们可以使用“net”命令通过使用“group”子选项来枚举域的组:

​ Command Prompt

         C:\>net group /domain
The request will be processed at a domain controller for domain za.tryhackme.com

Group Accounts for \\THMDC

-------------------------------------------------------------------------------
*Cloneable Domain Controllers
*DnsUpdateProxy
*Domain Admins
*Domain Computers
*Domain Controllers
*Domain Guests
*Domain Users
[...]
*Schema Admins
*Server Admins
*Tier 0 Admins
*Tier 1 Admins
*Tier 2 Admins
The command completed successfully.

这些信息可以帮助我们找到目标执行的特定群体。 我们还可以通过在同一命令中指定组来枚举更多详细信息,例如组的成员身份:

​ Command Prompt

         C:\>net group "Tier 1 Admins" /domain
The request will be processed at a domain controller for domain za.tryhackme.com

Group name Tier 1 Admins
Comment

Members

-------------------------------------------------------------------------------
t1_arthur.tyler t1_gary.moss t1_henry.miller
t1_jill.wallis t1_joel.stephenson t1_marian.yates
t1_rosie.bryant
The command completed successfully.

密码政策

我们可以使用“net”命令通过“accounts”子选项枚举域的密码策略:

​ Command Prompt

         C:\>net accounts /domain
The request will be processed at a domain controller for domain za.tryhackme.com

Force user logoff how long after time expires?: Never
Minimum password age (days): 0
Maximum password age (days): Unlimited
Minimum password length: 0
Length of password history maintained: None
Lockout threshold: Never
Lockout duration (minutes): 30
Lockout observation window (minutes): 30
Computer role: PRIMARY
The command completed successfully.

这将为我们提供有用的信息,例如:

  • 保留密码历史记录的长度。 这意味着用户必须提供多少个唯一密码才能重新使用旧密码。
  • 错误密码尝试的锁定阈值以及帐户将被锁定的时间。
  • 密码的最小长度。
  • 允许密码达到的最长期限,指示密码是否必须定期轮换。

如果我们想对我们现在列举的其他用户帐户进行额外的密码喷射攻击,那么这些信息可以使我们受益。 它可以帮助我们更好地猜测在攻击中应该使用哪些单一密码,以及在冒锁定帐户的风险之前可以运行多少次攻击。 但是,应该注意的是,如果我们执行盲目密码喷射攻击,我们可能会锁定帐户,因为我们没有检查以确定特定帐户在被锁定之前还剩多少次尝试。

您可以在此处找到与 net 命令相关的全部选项。 使用这些网络命令来收集有关特定用户和组的信息。

好处

  • 不需要额外或外部工具,并且蓝队通常不会监控这些简单的命令。
  • 我们不需要 GUI 来执行此枚举。
  • VBScript 和其他常用于网络钓鱼有效负载的宏语言本身支持这些命令,因此它们可用于在制作更具体的有效负载之前枚举有关 AD 域的初始信息。

缺点

  • “net”命令必须从加入域的计算机执行。 如果计算机未加入域,则它将默认为 WORKGROUP 域。
  • net 命令可能不会显示所有信息。 例如,如果用户是十多个组的成员,则并非所有这些组都会显示在输出中。

Enumeration through PowerShell

电源外壳

PowerShell 是命令提示符的升级版。 Microsoft 于 2006 年首次发布它。虽然 PowerShell 具有命令提示符提供的所有标准功能,但它还提供对 cmdlet(发音为 command-let)的访问,这些 cmdlet 是用于执行特定功能的 .NET 类。 虽然我们可以编写自己的 cmdlet,就像 PowerView 的创建者所做的那样,但我们已经可以使用内置的 cmdlet 取得很大的进展。

由于我们在任务 3 中安装了 AD-RSAT 工具,它会自动为我们安装关联的 cmdlet。 安装了 50 多个 cmdlet。 我们将研究其中的一些,但请参阅[此列表以获取完整的 cmdlet 列表。

使用我们的 SSH 终端,我们可以使用以下命令将其升级到 PowerShell 终端:powershell

用户

我们可以使用“Get-ADUser”cmdlet 来枚举 AD 用户:

​ SSH PowerShell

         PS C:\> Get-ADUser -Identity gordon.stevens -Server za.tryhackme.com -Properties *

AccountExpirationDate :
accountExpires : 9223372036854775807
AccountLockoutTime :
[...]
Deleted :
Department : Consulting
Description :
DisplayName : Gordon Stevens
DistinguishedName : CN=gordon.stevens,OU=Consulting,OU=People,DC=za,DC=tryhackme,DC=com
[...]

这些参数用于以下用途:

  • -Identity 我们正在枚举的帐户名称
  • -Properties 将显示与帐户关联的哪些属性,* 将显示所有属性
  • -Server 由于我们没有加入域,因此我们必须使用此参数将其指向我们的域控制器

对于大多数这些 cmdlet,我们还可以使用“-Filter”参数来对枚举进行更多控制,并使用“Format-Table”cmdlet 来整齐地显示结果,如下所示:

​ SSH PowerShell

         PS C:\> Get-ADUser -Filter 'Name -like "*stevens"' -Server za.tryhackme.com | Format-Table Name,SamAccountName -A

Name SamAccountName
---- --------------
chloe.stevens chloe.stevens
samantha.stevens samantha.stevens
[...]
janice.stevens janice.stevens
gordon.stevens gordon.stevens

团体

我们可以使用“Get-ADGroup”cmdlet 来枚举 AD 组:

​ SSH PowerShell

         PS C:\> Get-ADGroup -Identity Administrators -Server za.tryhackme.com


DistinguishedName : CN=Administrators,CN=Builtin,DC=za,DC=tryhackme,DC=com
GroupCategory : Security
GroupScope : DomainLocal
Name : Administrators
ObjectClass : group
ObjectGUID : f4d1cbcd-4a6f-4531-8550-0394c3273c4f
SamAccountName : Administrators
SID : S-1-5-32-544

我们还可以使用 Get-ADGroupMember cmdlet 枚举组成员身份:

​ SSH PowerShell

         PS C:\> Get-ADGroupMember -Identity Administrators -Server za.tryhackme.com


distinguishedName : CN=Domain Admins,CN=Users,DC=za,DC=tryhackme,DC=com

name : Domain Admins
objectClass : group
objectGUID : 8a6186e5-e20f-4f13-b1b0-067f3326f67c
SamAccountName : Domain Admins
SID : S-1-5-21-3330634377-1326264276-632209373-512

[...]

distinguishedName : CN=Administrator,CN=Users,DC=za,DC=tryhackme,DC=com name : Administrator
objectClass : user
objectGUID : b10fe384-bcce-450b-85c8-218e3c79b30fSamAccountName : Administrator
SID : S-1-5-21-3330634377-1326264276-632209373-500

AD对象

可以使用“Get-ADObject” cmdlet 对任何 AD 对象执行更通用的搜索。 例如,如果我们正在查找在特定日期之后更改的所有 AD 对象:

​ SSH PowerShell

         PS C:\> $ChangeDate = New-Object DateTime(2022, 02, 28, 12, 00, 00)
PS C:\> Get-ADObject -Filter 'whenChanged -gt $ChangeDate' -includeDeletedObjects -Server za.tryhackme.com

Deleted :
DistinguishedName : DC=za,DC=tryhackme,DC=com
Name : za
ObjectClass : domainDNS
ObjectGUID : 518ee1e7-f427-4e91-a081-bb75e655ce7a

Deleted :
DistinguishedName : CN=Administrator,CN=Users,DC=za,DC=tryhackme,DC=com
Name : Administrator
ObjectClass : user
ObjectGUID : b10fe384-bcce-450b-85c8-218e3c79b30f

例如,如果我们想在不锁定帐户的情况下执行密码喷射攻击,我们可以使用它来枚举 badPwdCount 大于 0 的帐户,以避免这些帐户参与我们的攻击:

​ SSH PowerShell

         PS C:\> Get-ADObject -Filter 'badPwdCount -gt 0' -Server za.tryhackme.com
PS C:\>

仅当网络中的用户之一多次错误输入密码时,才会显示结果。

域名

我们可以使用“Get-ADDomain”来检索有关特定域的附加信息:

​ SSH PowerShell

         PS C:\> Get-ADDomain -Server za.tryhackme.com

AllowedDNSSuffixes : {}
ChildDomains : {}
ComputersContainer : CN=Computers,DC=za,DC=tryhackme,DC=com
DeletedObjectsContainer : CN=Deleted Objects,DC=za,DC=tryhackme,DC=com
DistinguishedName : DC=za,DC=tryhackme,DC=com
DNSRoot : za.tryhackme.com
DomainControllersContainer : OU=Domain Controllers,DC=za,DC=tryhackme,DC=com
[...]
UsersContainer : CN=Users,DC=za,DC=tryhackme,DC=com

更改 AD 对象

AD-RSAT cmdlet 的优点在于,有些 cmdlet 甚至允许您创建新的或更改现有的 AD 对象。 然而,我们对该网络的关注点是枚举。 创建新对象或更改现有对象将被视为 AD 开发,稍后将在 AD 模块中介绍。

但是,我们将通过使用“Set-ADAccountPassword” cmdlet 强制更改 AD 用户的密码来展示此示例:

​ SSH PowerShell

PS C:\> Set-ADAccountPassword -Identity gordon.stevens -Server za.tryhackme.com -OldPassword (ConvertTo-SecureString -AsPlaintext "old" -force) -NewPassword (ConvertTo-SecureString -AsPlainText "new" -Force)

请记住更改您在任务 1 中的经销商网页上提供的用于枚举的帐户的身份值和密码。

好处

  • PowerShell cmdlet 可以枚举比命令提示符中的 net 命令更多的信息。
  • 我们可以指定服务器和域来使用未加入域的计算机上的 runas 执行这些命令。
  • 我们可以创建自己的 cmdlet 来枚举特定信息。
  • 我们可以使用 AD-RSAT cmdlet 直接更改 AD 对象,例如重置密码或将用户添加到特定组。

缺点

  • 与命令提示符相比,蓝队通常更多地监控 PowerShell。
  • 我们必须安装 AD-RSAT 工具或使用其他可能可检测的脚本进行 PowerShell 枚举。

Enumeration through Bloodhound

最后,我们将研究使用 Bloodhound 执行 AD 枚举。 Bloodhound 是迄今为止最强大的 AD 枚举工具,当它于 2016 年发布时,它永远改变了 AD 枚举格局。

Bloodhound History

在相当长的一段时间内,红队队员(不幸的是,攻击者)占据了上风。 以至于微软在其高级威胁防护解决方案中集成了他们自己版本的 Bloodhound。 这一切都归结为以下这句话:

“防御者用列表思考,攻击者用图表思考。” - 未知

Bloodhound 允许攻击者(现在也包括防御者)通过互连节点以图形格式可视化 AD 环境。 每个连接都是一条可能的路径,可用于实现目标。 相比之下,防御者使用列表,例如域管理员列表或环境中所有主机的列表。

这种基于图的思维为攻击者打开了一个世界。 它允许进行两阶段攻击。 在第一阶段,攻击者会进行网络钓鱼攻击以获得枚举AD信息的初始条目。 这个初始有效负载通常非常嘈杂,并且会在攻击者执行除泄露枚举数据之外的任何操作之前被蓝队检测到并包含在内。 然而,攻击者现在可以离线使用这些数据以图形格式创建攻击路径,准确显示所需的步骤和跳跃。 在第二次网络钓鱼活动中利用这些信息,攻击者通常可以在突破后几分钟内达到他们的目标。 它通常比蓝队收到第一个警报的速度还要快。 这就是图表思维的力量,这就是为什么这么多蓝队也开始使用这些类型的工具来更好地了解他们的安全态势。

猎犬

您经常会听到用户将 Sharphound 和 Bloodhound 互换使用。 然而,它们并不相同。 Sharphound是Bloodhound的枚举工具。 它用于枚举 AD 信息,然后可以在 Bloodhound 中直观地显示这些信息。 Bloodhound 是用于显示 AD 攻击图的实际 GUI。 因此,我们首先需要学习如何使用Sharphound来枚举AD,然后才能使用Bloodhound直观地看到结果。

共有三种不同的 Sharphound 收藏家:

  • Sharphound.ps1 - 用于运行 Sharphound 的 PowerShell 脚本。 不过,最新版本的 Sharphound 已经停止发布 Powershell 脚本版本。 该版本非常适合与 RAT 一起使用,因为脚本可以直接加载到内存中,从而逃避磁盘上的 AV 扫描。
  • Sharphound.exe - 用于运行 Sharphound 的 Windows 可执行版本。
  • AzureHound.ps1 - 用于运行 Sharphound for Azure(Microsoft 云计算服务)实例的 PowerShell 脚本。 Bloodhound 可以提取从 Azure 枚举的数据,以查找与 Azure 身份和访问管理配置相关的攻击路径。

注意:您的 Bloodhound 和 Sharphound 版本必须匹配才能获得最佳结果。 通常会对 Bloodhound 进行更新,这意味着旧的 Sharphound 结果无法被摄取。 该网络是使用 Bloodhound v4.1.0 创建的。 请确保将此版本与 Sharphound 结果一起使用。

在评估中使用这些收集器脚本时,这些文件很可能被检测为恶意软件并向蓝队发出警报。 这又是我们未加入域的 Windows 计算机可以提供帮助的地方。 我们可以使用“runas”命令注入 AD 凭据并将 Sharphound 指向域控制器。 由于我们控制这台 Windows 计算机,因此我们可以禁用 AV 或为特定文件或文件夹创建例外,这已在 THMJMP1 计算机上为您执行。 您可以在该主机上的“C:\Tools\”目录中找到 Sharphound 二进制文件。 我们将使用 SharpHound.exe 版本进行枚举,但也可以随意使用其他两个版本。 我们将执行 Sharphound,如下所示:

Sharphound.exe --CollectionMethods <Methods>  --Domain za.tryhackme.com --ExcludeDCs

参数解释:

  • CollectionMethods - 确定 Sharphound 将收集什么类型的数据。 最常见的选项是“默认”或“全部”。 另外,由于 Sharphound 会缓存信息,因此一旦第一次运行完成,您只能使用 Session 收集方法来检索新的用户会话以加快该过程。
  • 域 - 在这里,我们指定要枚举的域。 在某些情况下,您可能想要枚举与您的现有域信任的父域或其他域。 您可以通过更改此参数来告诉 Sharphound 应枚举哪个域。
  • ExcludeDCs - 这将指示 Sharphound 不要接触域控制器,从而降低 Sharphound 运行引发警报的可能性。

您可以在此处找到所有各种 Sharphound 参数。 最好概述一下其他参数,因为根据您的红队评估情况,可能需要这些参数。

使用上一个任务中的 SSH PowerShell 会话,将 Sharphound 二进制文件复制到 AD 用户的文档目录:

​ SSH PowerShell

         PS C:\> copy C:\Tools\Sharphound.exe ~\Documents\
PS C:\> cd ~\Documents\
PS C:\Users\gordon.stevens\Documents>

我们将使用 All 和 Session 收集方法运行 Sharphound:

​ SSH PowerShell

         PS C:\Users\gordon.stevens\Documents\>SharpHound.exe --CollectionMethods All --Domain za.tryhackme.com --ExcludeDCs
2022-03-16T19:11:41.2898508+00:00|INFORMATION|Resolved Collection Methods: Group, LocalAdmin, GPOLocalGroup, Session, LoggedOn, Trusts, ACL, Container, RDP, ObjectProps, DCOM, SPNTargets, PSRemote
2022-03-16T19:11:41.3056683+00:00|INFORMATION|Initializing SharpHound at 7:11 PM on 3/16/2022
2022-03-16T19:11:41.6648113+00:00|INFORMATION|Flags: Group, LocalAdmin, GPOLocalGroup, Session, LoggedOn, Trusts, ACL, Container, RDP, ObjectProps, DCOM, SPNTargets, PSRemote
2022-03-16T19:11:41.8211318+00:00|INFORMATION|Beginning LDAP search for za.tryhackme.com
[....]
2022-03-16T19:12:31.6981568+00:00|INFORMATION|Output channel closed, waiting for output task to complete
Closing writers
2022-03-16T19:12:32.2605943+00:00|INFORMATION|Status: 2163 objects finished (+2163 43.26)/s -- Using 85 MB RAM
2022-03-16T19:12:32.2605943+00:00|INFORMATION|Enumeration finished in 00:00:50.4369344
2022-03-16T19:12:32.5418517+00:00|INFORMATION|SharpHound Enumeration Completed at 7:12 PM on 3/16/2022! Happy Graphing!

Sharphound 执行枚举大约需要 1 分钟。 在较大的组织中,第一次执行可能需要更长的时间,甚至几个小时。 完成后,您将在执行 Sharphound 的同一文件夹中获得一个带时间戳的 ZIP 文件。

​ SSH PowerShell

         PS C:\Users\gordon.stevens\Documents> dir

Directory: C:\Users\gordon.stevens\Documents

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/16/2022 7:12 PM 121027 20220316191229_BloodHound.zip
-a---- 3/16/2022 5:19 PM 906752 SharpHound.exe
-a---- 3/16/2022 7:12 PM 360355 YzE4MDdkYjAtYjc2MC00OTYyLTk1YTEtYjI0NjhiZmRiOWY1.bin

我们现在可以使用 Bloodhound 提取此 ZIP,以直观地向我们展示攻击路径。

寻血猎犬

如前所述,Bloodhound 是一个 GUI,允许我们导入 Sharphound 捕获的数据并将其可视化到攻击路径中。 Bloodhound 使用 Neo4j 作为其后端数据库和图形系统。 Neo4j 是一个图形数据库管理系统。 如果您使用 AttackBox,则可以使用 Dock 中的红色 Bloodhound 图标来启动它。 在所有其他情况下,请确保您的攻击计算机上安装并配置了 Bloodhound 和 neo4j。 无论哪种方式,了解后台发生的事情都是有好处的。 在启动 Bloodhound 之前,我们需要加载 Neo4j:

​ Command Prompt

         thm@thm:~# neo4j console start
Active database: graph.db
Directories in use:
home: /var/lib/neo4j
config: /etc/neo4j
logs: /var/log/neo4j
plugins: /var/lib/neo4j/plugins
import: /var/lib/neo4j/import
data: /var/lib/neo4j/data
certificates: /var/lib/neo4j/certificates
run: /var/run/neo4j
Starting Neo4j.
[....]
2022-03-13 19:59:18.014+0000 INFO Bolt enabled on 127.0.0.1:7687.

在另一个终端选项卡中,运行“bloodhound –no-sandbox”。 这将向您显示身份验证 GUI:

Bloodhound

neo4j 数据库的默认凭据为“neo4j:neo4j”。 使用它在 Bloodhound 中进行身份验证。 要导入我们的结果,您需要从 Windows 主机恢复 ZIP 文件。 最简单的方法是在 AttackBox 上使用 SCP 命令:

scp <AD Username>@THMJMP1.za.tryhackme.com:C:/Users/<AD Username>/Documents/<Sharphound ZIP> .

一旦您提供密码,这会将结果复制到您当前的工作目录。 将 ZIP 文件拖放到 Bloodhound GUI 上以导入 Bloodhound。 它将显示正在提取文件并启动导入。

Bloodhound

导入所有 JSON 文件后,我们可以开始使用 Bloodhound 枚举该特定域的攻击路径。

攻击路径

Bloodhound 可以显示多种攻击路径。 按“搜索节点”旁边的三个条纹将显示选项。 第一个选项卡向我们显示有关当前进口的信息。

Bloodhound

请注意,如果您导入新运行的 Sharphound,这些计数会累积增加。 首先,我们将查看节点信息。 让我们在 Bloodhound 中搜索我们的 AD 帐户。 您必须单击该节点才能刷新视图。 另请注意,您可以通过按 LeftCtrl 更改标签方案。

Bloodhound

我们可以看到返回了大量有关我们使用情况的信息。 每个类别都提供以下信息:

  • 概述 - 提供摘要信息,例如帐户拥有的活动会话数以及是否可以达到高价值目标。
  • 节点属性 - 显示有关 AD 帐户的信息,例如显示名称和标题。
  • 额外属性 - 提供更详细的 AD 信息,例如可分辨名称和创建帐户的时间。
  • 组成员资格 - 显示有关帐户所属组的信息。
  • 本地管理员权限 - 提供有关帐户具有管理权限的已加入域的主机的信息。
  • 执行权限 - 提供有关特殊权限的信息,例如通过 RDP 访问计算机的能力。
  • 出站控制权限 - 显示有关此帐户有权修改其属性的 AD 对象的信息。
  • 入站控制权限 - 提供有关可以修改此帐户属性的 AD 对象的信息。

如果您想了解每个类别的更多信息,可以按信息查询旁边的数字。 例如,让我们看看与我们的帐户关联的组成员身份。 通过按“First Degree Group Membership”旁边的数字,我们可以看到我们的帐户是两个组的成员。

Bloodhound

接下来,我们将研究分析查询。 这些是 Bloodhound 的创建者自己编写的查询,用于列举有用的信息。

Bloodhound

在“域信息”部分下,我们可以运行“查找所有域管理员”查询。 请注意,您可以按左 Ctrl 更改标签显示设置。

Bloodhound

图标称为节点,线称为边。 让我们更深入地了解 Bloodhound 向我们展示的内容。 有一个用户名为 T0_TINUS.GREEN 的 AD 用户帐户,它是 Tier 0 ADMINS 组的成员。 但是,该组是 DOMAIN ADMINS 组中的嵌套组,这意味着属于 Tier 0 ADMINS 组的所有用户实际上都是 DA。

此外,还有一个用户名为 ADMINISTRATOR 的附加 AD 帐户,它是 DOMAIN ADMINS 组的一部分。 因此,如果我们想获得 DA 权限,我们的攻击面中可能会尝试破坏两个帐户。 由于 ADMINISTRATOR 帐户是内置帐户,因此我们可能会关注用户帐户。

前面的任务中讨论的每个 AD 对象都可以是 Bloodhound 中的一个节点,并且每个对象都有一个不同的图标来描述其对象类型。 如果我们想制定攻击路径,我们需要查看当前位置和我们拥有的特权与我们想要去的地方之间的可用边缘。 Bloodhound 有各种可用的边缘,可以通过过滤器图标访问:

Bloodhound

随着新攻击媒介的发现,这些内容也会不断更新。 我们将考虑在未来的网络中利用这些不同的优势。 但是,让我们看看仅使用默认边和一些特殊边的最基本的攻击路径。 我们将在 Bloodhound 中运行搜索来枚举攻击路径。 按路径图标即可进行路径搜索。

Bloodhound

我们的起始节点将是我们的 AD 用户名,我们的结束节点将是 Tier 1 ADMINS 组,因为该组具有对服务器的管理权限。

Bloodhound

如果使用所选边缘过滤器没有可用的攻击路径,Bloodhound 将显示“未找到结果”。 请注意,这也可能是由于 Bloodhound/Sharphound 不匹配造成的,这意味着结果未正确摄取。 请使用 Bloodhound v4.1.0。 但是,在我们的例子中,Bloodhound 显示了攻击路径。 它显示 **T1 管理员 ACCOUNT 之一通过使用其凭据对工作站 **THMJMP1 进行身份验证,打破了分层模型。 它还表明属于 DOMAIN USERS 组的任何用户(包括我们的 AD 帐户)都能够通过 RDP 连接到该主机。

我们可以执行如下操作来利用这条路径:

  1. 使用我们的 AD 凭据通过 RDP 进入 THMJMP1
  2. 在主机上寻找可为我们提供管理访问权限的权限升级向量。
  3. 通过管理访问,我们可以使用凭证收集技术和工具,例如 Mimikatz。
  4. 由于 T1 管理员在 THMJMP1 上有一个活动会话,因此我们的凭据收集将为我们提供关联帐户的 NTLM 哈希值。

这是一个简单的例子。 一般情况下,攻击路径可能比较复杂,需要采取多次行动才能达到最终目标。 如果您对与每个边缘相关的漏洞感兴趣,以下 Bloodhound 文档 提供了一个很好的指南。 Bloodhound 是一款极其强大的 AD 枚举工具,可以深入了解攻击面的 AD 结构。 值得花精力去尝试它并了解它的各种功能。

仅会话数据

在大型组织中,AD 的结构不会经常改变。 可能会有一些新员工,但 OU、组、用户和权限的整体结构将保持不变。

然而,不断变化的一件事是活动会话和登录事件。 由于 Sharphound 创建 AD 结构的时间点快照,因此活动会话数据并不总是准确的,因为某些用户可能已经注销了其会话,或者新用户可能已经建立了新会话。 这是需要注意的重要事项,也是我们希望定期执行 Sharphound 的原因。

一个好的方法是在评估开始时使用“全部”收集方法执行 Sharphound,然后使用“会话”收集方法每天至少执行两次 Sharphound。 这将为您提供新的会话数据并确保这些运行速度更快,因为它们不会再次枚举整个 AD 结构。 执行这些会话运行的最佳时间是在 10:00 左右,此时用户喝完第一杯咖啡并开始工作,然后在 14:00 左右,即他们午休回来但回家之前。

在从这些新的 Sharphound 运行中导入数据之前,您可以通过单击“清除会话信息”在“数据库信息”选项卡上清除 Bloodhound 中的停滞会话数据。

好处

  • 提供用于 AD 枚举的 GUI。
  • 能够显示枚举的 AD 信息的攻击路径。
  • 提供对通常需要多次手动查询才能恢复的 AD 对象的更深刻见解。

缺点

  • 需要执行 Sharphound,它的噪音很大,通常可以被 AV 或 EDR 解决方案检测到。