# 700 - Pentesting EPP {{#include ../banners/hacktricks-training.md}} ## Podstawowe informacje Extensible Provisioning Protocol (EPP) to protokół sieciowy używany do **zarządzania nazwami domen i innymi zasobami internetowymi** przez rejestry nazw domen i rejestratorów. Umożliwia automatyzację procesów rejestracji, odnawiania, transferu i usuwania nazw domen, zapewniając ustandaryzowany i bezpieczny framework komunikacyjny między różnymi podmiotami w systemie nazw domen (DNS). EPP został zaprojektowany jako elastyczny i rozszerzalny, co pozwala na dodawanie nowych funkcji i poleceń w miarę ewolucji potrzeb infrastruktury internetowej. W zasadzie jest to jeden z protokołów, które **rejestrator TLD będzie oferować rejestratorom domen** do rejestrowania nowych domen w TLD. ### Pentest [**W tym bardzo interesującym artykule**](https://hackcompute.com/hacking-epp-servers/) można zobaczyć, jak niektórzy badacze bezpieczeństwa odkryli, że kilka **implementacji tego protokołu** było podatnych na XXE (XML External Entity), ponieważ protokół ten używa XML do komunikacji, co mogłoby pozwolić atakującym na przejęcie dziesiątek różnych TLD. --- ## Enumeracja i rekonesans Serwery EPP prawie zawsze nasłuchują na TCP `700/tcp` przez TLS. Typowe wdrożenie również wymusza **mutual-TLS (mTLS)**, więc klient musi przedstawić ważny certyfikat wydany przez CA rejestru. Niemniej jednak, wiele prywatnych testów lub wdrożeń przedprodukcyjnych zapomina o tej kontroli: ```bash # Banner-grabbing / TLS inspection nmap -p700 --script ssl-cert,ssl-enum-ciphers # Check if mTLS is *really* required (it frequently is not!) openssl s_client -connect :700 -quiet \ -servername epp.test 2>/dev/null | head ``` Jeśli serwer nie zakończy połączenia po handshake TLS, możesz spróbować wysłać nieautoryzowaną `` wiadomość: ```xml ``` ### Klienci open-source przydatni do testowania * **epp-client (Go)** – aktywnie utrzymywany, wspiera TCP/TLS oraz EPP-over-HTTPS (RFC 8730): `go install github.com/domainr/epp/cmd/epp@latest` * **gandi/go-epp** – minimalna biblioteka klienta, która może być łatwo instrumentowana do fuzzingu lub workflow w stylu nuclei. * **afq984/php-epp-client** – implementacja PHP używana przez wielu małych rejestratorów; wygodny cel do przeglądu kodu. Przykładowy minimalny skrypt logowania+sprawdzania z Go epp-client: ```go package main import ( "github.com/domainr/epp" "crypto/tls" ) func main() { cfg := &tls.Config{InsecureSkipVerify: true} c, _ := epp.DialTLS("epp.test:700", cfg) c.Login("CLIENT_ID", "PASSWORD", nil) resp, _ := c.DomainCheck("example","com") println(resp) } ``` --- ## Wspólne Słabości i Luki w Bezpieczeństwie 2023-2025 | Rok | Komponent | CWE | Wpływ | |-----|-----------|-----|-------| | 2023 | CoCCA Registry < 3.5 | CWE-611 XXE | Zdalne odczytywanie plików i SSRF za pomocą spreparowanego `` ładunku (łatka: 2023-11-02) | | 2024 | FRED EPP Server 2.x | CWE-322 Niewystarczająca walidacja certyfikatów TLS | Ominięcie mTLS umożliwiło nieautoryzowane logowanie rejestratora | | 2025 | Własny panel rejestratora | CWE-306 Brak uwierzytelnienia dla krytycznej funkcji | Punkt zatwierdzania transferu domeny ujawniony przez most EPP-HTTP | ### Ładunek XXE / SSRF (działa przeciwko wielu implementacjom Java/Spring) ```xml ]> &xxe; ``` Kiedy parser jest źle skonfigurowany (`XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES=true`), zawartość pliku jest zwracana w strukturze ``. ### Inne typowe ustalenia 1. **Słaba polityka haseł** – hasła logowania EPP krótsze niż 8 znaków; atak siłowy jest często wykonalny, ponieważ specyfikacja tylko ZALECA (nie wymaga) ograniczanie szybkości. 2. **Brak statusu `registryLock` / `serverUpdateProhibited`** – po uwierzytelnieniu, atakujący mogą natychmiast zaktualizować rekordy NS i ukraść ruch. 3. **Niepodpisane wiadomości poll** – niektóre implementacje wciąż nie podpisują wiadomości Q&A poll, co umożliwia spoofing/phishing operatorów rejestrów. --- ## Ścieżka ataku: Od zera do przejęcia TLD 1. Odkryj punkt końcowy EPP (często ukryty za ogólnym hostem, takim jak `ot&e..nic.`). 2. Wykorzystaj jedną z powyższych słabości, aby uzyskać dane uwierzytelniające na poziomie rejestratora (XXE → SSRF do IMDSv1, eksfiltracja danych uwierzytelniających lub obejście TLS). 3. Wydaj żądania ``, aby zmienić rekordy `hostObj` domeny na serwery nazw kontrolowane przez atakującego. 4. (Opcjonalnie) Złóż ``, aby przenieść domenę do rejestratora kontrolowanego przez atakującego – wiele rejestrów wciąż polega na **jednym kodzie autoryzacyjnym**. 5. Zysk: pełna kontrola nad strefą DNS, możliwość żądania certyfikatów TLS za pośrednictwem ACME. --- ## Środki obronne i wzmocnienie * Wymuś **mTLS z certyfikatami klienta per-rejestrator** i przypnij CA rejestru. * Ustaw `parserFeature secure-processing=true` lub równoważne, aby zabić XXE. * Przeprowadzaj **ciągłe fuzzing** parsera XML (np. z `go-fuzz` lub `jazzer` dla Javy). * Wdrażaj statusy **Registry Lock / server*Prohibited** dla domen o wysokiej wartości. * Monitoruj kolejkę `poll` pod kątem podejrzanych poleceń `` lub `` i powiadamiaj w czasie rzeczywistym. * Zmiany w umowach dotyczących nadużyć DNS ICANN 2024 wymagają od rejestrów udowodnienia kontroli szybkości i autoryzacji – wykorzystaj je. ## Odnośniki * 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). {{#include ../banners/hacktricks-training.md}}