Active Directory,  Red Team

Enumerating Active Directory

1. Credential Injection(凭据注入)

在跳到AD对象和枚举之前,让我们先谈谈凭据注入方法。从Breaching AD网络中,您会看到凭据通常是在不影响加入域的计算机的情况下找到的。特定的枚举技术可能需要特定的设置才能工作。

Windows vs Linux

“知己知彼,百战不惊。知己不彼,百战必败。”——《孙子兵法》。 你可以在卡利机器上进行AD枚举。尽管如此,如果你真的想做深入的列举甚至剥削,你需要理解和模仿你的敌人。因此,您需要一台Windows机器。这将允许我们使用几个内置方法来进行枚举和利用。在这个网络中,我们将探索其中一个内置工具,称为runas.exe二进制文件。

Runas Explained(Runas解释)

你有没有发现AD凭据,却无处登录?Runas可能是你一直在寻找的答案!在安全评估中,您通常具有网络访问权限,并且刚刚发现AD凭据,但没有创建新的加入域的计算机的手段或权限。因此,我们需要能够在我们控制的Windows机器上使用这些凭据。 如果AD凭据的格式为:,我们可以使用合法的Windows二进制文件Runas将凭据注入内存。通常的Runas命令如下所示:

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

让我们看看参数:

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

运行此命令后,系统将提示您提供密码。请注意,由于我们添加了/netonly参数,域控制器将不会直接验证凭据,因此它将接受任何密码。我们仍然需要确认网络凭据已成功且正确加载。 注意:如果您使用自己的Windows计算机,则应确保以管理员身份运行第一个命令提示符。这将向CMD中注入管理员令牌。如果您从Runas派生的CMD运行需要本地管理权限的工具,则该令牌将已经可用。这不会授予您在网络上的管理权限,但会确保您执行的任何本地命令都将以管理权限执行。

It’s Always 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是否正常工作:

C:\> nslookup za.tryhackme.com

现在应该解析为DC IP,因为这是FQDN所在的位置。现在DNS开始工作了,我们终于可以测试我们的凭据了。我们可以使用以下命令强制SYSVOL目录的基于网络的列表:

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(IP与主机名)

问题:dir\za.tryhackme.com\SYSVOL和dir\<DCIP>\SYSVOL之间有区别吗?为什么对DNS大惊小怪?两者有很大的区别,归根结底是使用的身份验证方法。当我们提供主机名时,网络身份验证将首先尝试执行Kerberos身份验证。由于Kerberos身份验证使用嵌入票证中的主机名,因此如果我们提供IP,则可以强制身份验证类型为NTLM。虽然从表面上看,这对我们来说并不重要,但了解这些细微的差异是件好事,因为它们可以让你在红队评估期间保持更隐秘的状态。在某些情况下,组织将监控OverPass和Pass The Hash攻击。强制NTLM身份验证是一个很好的技巧,可以避免在这些情况下被检测到。

Using Injected Credentials(使用注入的凭据)

现在我们已经将我们的AD证书注入内存,这就是乐趣的开始。使用\/netonly选项,所有网络通信都将使用这些注入的凭据进行身份验证。这包括从该命令提示符窗口执行的应用程序的所有网络通信。 这就是它变得强大的地方。您有没有遇到过MS SQL数据库使用Windows身份验证,而您没有加入域的情况?从该命令提示符启动MS SQL Studio;即使它显示您的本地用户名,单击“登录”,它也会在后台使用AD凭据进行身份验证!我们甚至可以使用它对使用NTLM身份验证的web应用程序进行身份验证。 我们将在下一个任务中使用它来实现我们的第一个AD枚举技术。

2.Enumeration through Microsoft Management Console(通过Microsoft管理控制台进行枚举)

到目前为止,您应该已经完成了AD基础知识室,其中最初引入了不同的AD对象。在本任务中,假设您了解这些对象是什么。使用RDP和任务1中提供的凭据连接到THMJMP1以执行此任务。

Microsoft Management Console

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

  1. Press Start
  2. Search “Apps & Features” and press enter
  3. Click Manage Optional Features
  4. Click Add a feature
  5. Search for “RSAT”
  6. Select “RSAT: Active Directory Domain Services and Lightweight Directory Tools” and click Install

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

MMC failed start due to credentials

这就是上一个任务的Runas窗口的作用所在。在该窗口中,我们可以启动MMC,这将确保所有MMC网络连接都将使用我们注入的AD凭据。 在MMC中,我们现在可以连接AD RSAT管理单元:

  1. Click File -> Add/Remove Snap-in(单击文件->添加/删除管理单元)
  2. Select and Add all three Active Directory Snap-ins(选择并添加所有三个Active Directory管理单元)
  3. Click through any errors and warnings(点击查看任何错误和警告)
  4. Right-click on Active Directory Domains and Trusts and select Change Forest(右键单击Active Directory域和信任并选择更改林)
  5. Enter za.tryhackme.com as the Root domain and Click OK(输入za.tryhackme.com作为根域,然后单击确定)
  6. Right-click on Active Directory Sites and Services and select Change Forest(右键单击Active Directory站点和服务,然后选择更改林)
  7. Enter za.tryhackme.com as the Root domain and Click OK(输入za.tryhackme.com作为根域,然后单击“确定”)
  8. Right-click on Active Directory Users and Computers and select Change Domain(右键单击Active Directory用户和计算机,然后选择更改域)
  9. Enter za.tryhackme.com as the Domain and Click OK(输入za.tryhackme.com作为域,然后单击“确定”)
  10. Right-click on Active Directory Users and Computers in the left-hand pane(右键单击左侧窗格中的Active Directory用户和计算机)
  11. Click on View -> Advanced Features(单击查看->高级功能)

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

MMC AD Snap-in

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

用户和计算机

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

MMC AD Snap-in

让我们看看“人物”目录。在这里,我们可以看到用户是根据部门OU进行划分的。单击每个OU将显示属于该部门的用户。

MMC AD Snap-in

点击这些用户中的任何一个,我们都可以查看他们的所有属性。我们还可以看到他们是哪些团体的成员:

MMC AD Snap-in

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

MMC AD Snap-in

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

Benefits

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

Drawbacks

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

3.Enumeration through Command Prompt(通过命令提示符枚举)

命令提示符

有时,您只需要执行快速而肮脏的AD查找,命令提示符就可以支持您。当您可能没有对系统的RDP访问权限,防御者正在监视PowerShell的使用,并且您需要通过远程访问特洛伊木马(RAT)执行AD枚举时,可靠的CMD非常方便。在网络钓鱼负载中嵌入几个简单的AD枚举命令甚至会很有帮助,以帮助您获得可以帮助您进行最终攻击的重要信息。 CMD有一个内置的命令,我们可以使用它来枚举有关AD的信息,即net。net命令是一个方便的工具,可以列举有关本地系统和AD的信息。我们将从这个位置列举一些有趣的东西,但这不是一个详尽的列表。 注意:对于此任务,您必须使用THMJMP1,并且不能使用您自己的Windows虚拟机。这将在缺点中进行解释。

Users

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

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用户,并有助于确定域的大小以进行进一步的攻击。我们还可以使用此子选项来枚举有关单个用户帐户的更详细信息:

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组的一部分,则此命令将能够向我们显示组成员身份。但是,通常情况下,在超过十个组成员身份之后,命令将无法列出所有成员。

Groups

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

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.

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

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.

Password Policy(密码策略)

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

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命令相关的全部选项。使用这些net命令来收集有关特定用户和组的信息。

Benefits

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

Drawbacks

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

4.Enumeration through PowerShell(通过PowerShell枚举)

PowerShell

PowerShell是命令提示符的升级。微软在2006年首次发布了它。虽然PowerShell具有命令提示符提供的所有标准功能,但它还提供对cmdlet(发音为Command lets)的访问,cmdlet是执行特定功能的.NET类。虽然我们可以像PowerView的创建者一样编写自己的cmdlet,但我们已经可以使用内置的cmdlet了。 由于我们在任务3中安装了AD-RSAT工具,它自动为我们安装了相关的cmdlet。已经安装了50多个cmdlet。我们将研究其中的一些,但有关cmdlet的完整列表,请参阅此列表。 使用SSH终端,我们可以使用以下命令将其升级为PowerShell终端:PowerShell

Users

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

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来整齐地显示结果,如以下所示:

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

Groups

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

查看某个组是何时创建的:

Get-ADGroup -Identity 'Tier 2 Admins' -Server za.tryhackme.com -Properties *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枚举组成员身份:

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 Objects

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

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的帐户,以避免攻击中的这些帐户:

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

只有当网络中的一个用户输入了几次错误的密码时,才会显示结果。

Domains

我们可以使用Get-ADDomain来检索有关特定域的其他信息:

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

Altering AD Objects(正在更改AD对象)

AD-RSAT cmdlet的伟大之处在于,有些cmdlet甚至允许您创建新的或更改现有的AD对象。然而,我们对这个网络的关注点是枚举。创建新对象或更改现有对象将被视为AD利用,稍后将在AD模块中介绍。 但是,我们将通过使用Set-ADAccountPassword cmdlet强制更改AD用户的密码来显示一个示例:

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

请记住更改任务1中分发服务器网页上为您提供的用于枚举的帐户的标识值和密码。

Benefits

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

Drawbacks

  • PowerShell通常比命令提示符更受蓝色团队的监控。
  • 我们必须安装AD-RSAT工具或使用其他可能检测到的PowerShell枚举脚本。

5.Enumeration through Bloodhound(通过Bloodhound进行枚举)

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

Bloodhound History

在相当长的一段时间里,红队队员(不幸的是,还有进攻队员)占据了上风。以至于微软在其高级威胁保护解决方案中集成了他们自己版本的Bloodhound。这一切都归结为以下短语:“防御者在列表中思考,攻击者在图表中思考。”-未知猎犬允许攻击者(现在也是防御者)以具有互连节点的图表格式可视化AD环境。每个连接都是一条可能的路径,可以利用它来实现目标。相比之下,防御者使用了列表,比如域管理员列表或环境中所有主机的列表。

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

Sharphound

你经常会听到用户交替地提到Sharpwound和Bloodhound。然而,它们并不相同。Sharphound是Bloodhound的枚举工具。它用于枚举AD信息,然后可以在Bloodhound中直观显示。Bloodhound是用于显示AD攻击图的实际GUI。因此,在使用Bloodhound直观地查看结果之前,我们首先需要学习如何使用Sharpwound枚举AD。 有三种不同的Sharpwound收藏者:

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

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

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

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

解释的参数:

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

你可以在这里找到各种各样的Sharpwound参数。最好概述一下其他参数,因为根据您的红队评估情况可能需要这些参数。 使用上一任务中的SSH PowerShell会话,将Sharphond二进制文件复制到AD用户的Documents目录中:

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

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

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!

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

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

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

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——没有沙箱。这将向您显示身份验证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上以导入到Bloodhund中。它将显示它正在提取文件并启动导入。

Bloodhound

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

Attack Paths

Bloodhound可以显示几种攻击路径。按下“Search for a node”(搜索节点)旁边的三条条纹将显示选项。第一个选项卡显示了有关我们当前入口的信息。

Bloodhound

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

Bloodhound

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

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

如果您想在这些类别中获得更多信息,可以按信息查询旁边的数字。例如,让我们看看与我们的帐户相关联的组成员资格。按下“第一学位组成员”旁边的数字,我们可以看到我们的帐户是两个组的成员。

Bloodhound

接下来,我们将查看Analysis查询。这些是Bloodhound的创建者自己写的查询,以列举有用的信息。

Bloodhound

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

Bloodhound

图标称为节点,线条称为边。让我们更深入地了解Bloodhound向我们展示的内容。有一个用户名为T0_TINUS.GREEN的AD用户帐户,它是Tier 0 ADMIN组的成员。但是,该组是DOMAIN ADMIN组中的嵌套组,这意味着属于Tier 0 ADMIN组的所有用户实际上都是DA。 此外,还有一个用户名为ADMINISTRATOR的附加AD帐户,它是DOMAIN ADMIN组的一部分。因此,如果我们想获得DA权利,我们可能会尝试在我们的攻击面上妥协两个账户。由于ADMINISTRATOR帐户是一个内置帐户,因此我们可能会转而关注用户帐户。

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

Bloodhound

随着新的攻击向量的发现,这些也在不断更新。我们将着眼于在未来的网络中利用这些不同的优势。然而,让我们来看看只使用默认边和一些特殊边的最基本的攻击路径。我们将在Bloodhound中进行搜索,以列举攻击路径。按下路径图标可进行路径搜索。

Bloodhound

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

Bloodhound

如果使用所选边缘过滤器没有可用的攻击路径,则猎犬将显示\“未找到结果\”。注意,这也可能是由于猎犬/鲨鱼不匹配,意味着结果没有正确摄取。请使用猎犬v4.1.0。然而,在我们的例子中,猎犬显示了一条攻击路径。它显示T1管理员之一Account使用他们的凭据向THMJMP1(一台工作站)进行身份验证,从而破坏了分层模型。它还表明,属于域用户组的任何用户,包括我们的AD帐户,都有能力通过RDP访问此主机。 我们可以做如下操作来利用这条路径:

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

这是一个简单的例子。在正常情况下,攻击路径可能相对复杂,需要采取若干行动才能达到最终目标。如果您对与每个边缘相关的漏洞利用感兴趣,下面的Bloodhound文档提供了一个很好的指南。Bloodhound是一款功能强大的AD枚举工具,可以深入了解攻击表面的AD结构。玩它并学习它的各种特性是值得的。

Session Data Only(仅会话数据)

在大型组织中,AD的结构不会经常发生变化。可能会有几个新员工,但OU、组、用户和权限的总体结构将保持不变。 然而,有一件事会不断变化,那就是活动会话和登录事件。由于Sharphond创建了AD结构的时间点快照,因此活动会话数据并不总是准确的,因为一些用户可能已经注销了他们的会话,或者新用户可能已经建立了新的会话。这是一件需要注意的重要事情,也是我们希望定期执行Sharpwound的原因。

一个好的方法是在评估开始时使用“全部”收集方法执行Sharphond,然后使用“会话”收集方法每天至少执行两次Sharphond。这将为您提供新的会话数据,并确保这些运行速度更快,因为它们不会再次枚举整个AD结构。执行这些会话运行的最佳时间是在10:00左右,当用户喝了第一杯咖啡并开始工作时,以及在14:00左右,当他们午休回来但还没回家时。 在从这些新的Sharphond运行导入数据之前,您可以在数据库信息选项卡上单击“清除会话信息”来清除Bloodhound中停滞的会话数据。

Benefits

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

Drawbacks

需要执行 Sharphound,该程序噪音较大,通常可以被 AV 或 EDR 解决方案检测到。

6.Additional Enumeration Techniques(附加枚举技术)

在此网络中,我们介绍了几种可用于枚举 AD 的技术。这绝不是一份详尽的清单。以下是也值得一提的枚举技术列表:

  • LDAP 枚举 – 任何有效的 AD 凭据对都应该能够绑定到域控制器的 LDAP 接口。这将允许您编写 LDAP 搜索查询来枚举有关域中 AD 对象的信息。
  • PowerView -PowerView 是 PowerSploit 项目的侦察脚本部分。尽管该项目不再获得支持,但诸如 PowerView 之类的脚本对于在紧要关头执行 AD 对象的半手动枚举非常有用。
  • Windows Management Instrumentation (WMI) – WMI 可用于枚举来自 Windows 主机的信息。它有一个名为“root\directory\ldap”的提供程序,可用于与 AD 交互。我们可以使用此提供程序和 PowerShell 中的 WMI 来执行 AD 枚举。

我们还应该注意到,这个房间的重点是枚举整个 AD 域的结构,而不是只专注于识别错误配置和弱点。重点在于识别弱点的枚举,例如不安全的共享或分层模型中的中断,将在未来的房间中讨论。

Mitigations(缓和)

AD 枚举非常难以防御。其中许多技术模仿常规网络流量和行为,使得很难区分恶意流量和正常流量。但是,我们可以采取一些措施来检测潜在的恶意行为:

  • 强大的 AD 枚举技术(例如 Sharphound)在枚举会话信息时会生成大量登录事件。由于它从单个 AD 帐户执行,因此这些登录事件将与该单个帐户关联。我们可以编写检测规则来检测用户帐户中发生的此类行为。
  • 我们可以为特定 AD 枚举技术必须安装的工具编写签名检测规则,例如 SharpHound 二进制文件和 AD-RSAT 工具。
  • 除非我们组织的员工使用,否则我们可以监控组织中命令提示符和 Powershell 的使用情况,以检测来自未经授权来源的潜在枚举尝试。

顺便说一句,蓝队本身也可以定期使用这些枚举技术来识别 AD 域结构中的差距和错误配置。如果我们能够解决这些错误配置,即使攻击者枚举了我们的 AD,他们也无法找到可用于权限提升或横向移动的错误配置。 现在我们已经枚举了 AD,下一步是执行权限提升和跨域横向移动,以进入合适的位置来发动攻击。这将在下一个房间中介绍。