Bericht zum externen Penetrationstest
XYZ-Unternehmen
1. Zusammenfassung
XYZ-Unternehmen hat REDWULF Security Consulting mit der Durchführung eines externen Penetrationstests der öffentlich zugänglichen Infrastruktur beauftragt. Die Prüfung wurde über 4 Tage aus einer Black-Box-Perspektive durchgeführt — ohne Zugangsdaten, Dokumentation oder privilegierten Zugriff.
Wesentliche Erkenntnisse
Die Prüfung identifizierte 7 Schwachstellen in der externen Angriffsfläche. Besonders besorgniserregend ist ein kritischer Fund, der die Offenlegung von Bootstrap-Infrastruktur des Clusters betrifft — dieser enthielt Anmeldeinformationen, die Root-Zugriff auf alle Knoten des Produktions-Kubernetes-Clusters gewähren.
| Schweregrad | Anzahl | Fund-IDs |
|---|---|---|
| KRITISCH | 1 | RPT-05 |
| HOCH | 3 | RPT-01, RPT-06, RPT-07 |
| MITTEL | 1 | RPT-03 |
| NIEDRIG / INFO | 2 | RPT-02, RPT-04 |
2. Umfang & Methodik
Testumfang
xyz-unternehmen.deund alle entdeckten Subdomains- Alle TCP/UDP-Ports auf den primären öffentlichen IP-Adressen
- Auf der identifizierten Infrastruktur gehostete Webanwendungen
- APIs und unterstützende, aus dem Internet erreichbare Dienste
Methodik
Die Tests folgten den technischen Richtlinien des Penetration Testing Execution Standard (PTES), mit Schweregradbewertung nach CVSS v3.1.
- Aufklärung — DNS-Enumeration, Port-Scanning, Service-Fingerprinting, Identifikation des Technologie-Stacks
- Schwachstellenidentifikation — Automatisierte Scans kombiniert mit gezielten manuellen Tests
- Exploitation & Validierung — Sichere Ausnutzung zur Bestätigung der Auswirkungen ohne Betriebsstörungen, Datenverlust oder Ausfallzeiten
- Post-Exploitation-Analyse — Bewertung von Lateral Movement und Folgenabschätzung
- Berichterstattung — Funde dokumentiert mit Nachweisen, Risikobewertungen, Angriffspfaden und Behebungsanleitungen
3. Detaillierte Funde
Machine Config Server des Clusters offengelegt — Vollständige Offenlegung der Cluster-Bootstrap-Geheimnisse
AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N
Zusammenfassung
Der Machine Config Server (MCS) des Clusters wurde auf einem nicht standardmäßigen Port ohne Authentifizierung offen zugänglich vorgefunden. Dieser Endpunkt liefert vollständige Bootstrap-Konfigurationen sowohl für Control-Plane- als auch Worker-Knoten und legt SSH-Schlüssel mit Root-Zugriff auf alle Cluster-Knoten, das Kubernetes-CA-Zertifikat, die interne API-Server-Adresse und die vollständige Cluster-Infrastrukturkonfiguration offen.
Schritte zur Reproduktion
- Die Aufklärung enthüllte einen offengelegten HAProxy-Statistik-Endpunkt auf Port 9000, der alle Backend-Dienste auflistete.
- Die Backend-Liste enthielt einen Dienst namens
platform_machine_config_server_be, der Port 22623 zugeordnet war. - Eine Anfrage an die Bootstrap-Konfiguration des Master-Knotens lieferte eine 914 KB große JSON-Datei zurück — ohne Authentifizierung.
Technische Details
Die Bootstrap-Konfiguration enthielt SSH-Schlüssel mit Root-Zugriff auf alle Control-Plane- und Worker-Knoten (über den Benutzer core mit passwortlosem sudo), das Kubernetes-CA-Zertifikat (Vertrauensanker des gesamten Clusters), die interne API-Server-Adresse und Dienstnetzwerkkonfiguration, Container-Laufzeitkonfiguration inklusive Registry-Anmeldeinformationen sowie statische Pod-Manifeste für Control-Plane-Komponenten.
Proof of Concept
$ curl -sk https://123.456.789.10:22623/config/master | wc -c 914318 $ curl -sk https://123.456.789.10:22623/config/master | grep -o 'ssh-[^"]*' ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFAKEKEYEXAMPLE000000000000 services $ curl -sk https://123.456.789.10:22623/config/master | grep -o 'api-int\.[^'\\']*' api-int.c1.xyz-unternehmen.de
Auswirkungen
Vollständige Cluster-Kompromittierung. Mit dem extrahierten SSH-Schlüssel erhält ein Angreifer Root-Shell-Zugriff auf jeden Knoten im Cluster, vollständige Kontrolle über alle Container und Workloads, Zugriff auf alle persistenten Volumes und deren Daten, Kubernetes-Cluster-Admin-Zugriff durch Extrahieren von Service-Account-Tokens aus Knoten-Dateisystemen.
Behebung
- Sofortige Entfernung des MCS-Backends aus der öffentlichen Load-Balancer-Konfiguration
- Rotation des offengelegten SSH-Schlüssels auf allen Knoten
- Rotation des Kubernetes-CA-Zertifikats und aller Knotenzertifikate
- Firewall für den MCS-Port — nur Zugriff aus dem internen Cluster-Netzwerk
- Prüfung aller authorized_keys-Dateien auf den Knoten auf unbefugte Ergänzungen
Cluster-Webkonsole & OAuth-Server öffentlich zugänglich mit integriertem Admin-Identitätsanbieter
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N
Zusammenfassung
Die Cluster-Webkonsole und der OAuth-Authentifizierungsserver sind öffentlich zugänglich. Die Anmeldeseite zeigt zwei Identitätsanbieter, einschließlich des integrierten Plattform-Administratorkontos. Das Anmeldeformular ist voll funktionsfähig und akzeptiert Anmeldeversuche, was Brute-Force-Angriffe gegen das höchstprivilegierte Cluster-Konto ermöglicht.
Schritte zur Reproduktion
- Die Webkonsole wurde durch Backend-Enumeration aus den offengelegten HAProxy-Statistiken entdeckt.
- Die Konsole leitete auf den OAuth-Server weiter, der eine Anmeldeseite mit dem integrierten Admin-Identitätsanbieter anzeigte.
- Das Anmeldeformular akzeptierte Anmeldeinformationen und unterschied sichtbar zwischen gültigen und ungültigen Anmeldedaten.
Technische Details
Der OAuth-Login-Endpunkt akzeptiert POST-Anfragen mit Benutzername/Passwort-Feldern und einem CSRF-Token. Fehlgeschlagene Versuche werden mit reason=authentication_error umgeleitet, was die Validierung von Anmeldeinformationen bestätigt. Es wurde kein Rate Limiting festgestellt.
Proof of Concept
$ curl -sk -o /dev/null -w "%{http_code}" \
https://console-openshift-console.apps.c1.xyz-unternehmen.de/
200
$ curl -sk -X POST "https://oauth-openshift.apps.c1.xyz-unternehmen.de/login" \
-d "username=kubeadmin&password=test123&csrf=..."
→ 302 → /login?reason=authentication_error
(Anmeldeinformationen abgelehnt — Endpunkt funktionsfähig)
Auswirkungen
Brute-Force-Angriffsfläche gegen das höchstprivilegierte Cluster-Konto; vollständige Cluster-Admin-Kompromittierung bei Erraten der Anmeldedaten; Offenlegung der GitHub-OAuth-Client-ID ermöglicht Phishing-Angriffe; in Kombination mit RPT-05 und RPT-06 entsteht eine vollständige Angriffskette.
Behebung
- Einschränkung der Webkonsole und OAuth-Endpunkte auf interne/VPN-IPs
- Implementierung von Rate Limiting am OAuth /login-Endpunkt
- Deaktivierung oder Rotation des integrierten Admin-Kontos (nur SSO/OIDC verwenden)
- Aktivierung von Audit-Logging für alle Authentifizierungsversuche
- Erwägung eines OIDC-Anbieters mit MFA anstelle statischer Anmeldeinformationen
Infrastruktur-Monitoring-Schnittstelle ohne Authentifizierung offengelegt
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
Zusammenfassung
Die HAProxy-Statistik-Schnittstelle war auf Port 9000 ohne Authentifizierung zugänglich. Dieser Endpunkt enthüllt die vollständige Backend-Infrastruktur-Topologie, einschließlich aller internen Dienst-Hostnamen, Ports, Gesundheitsstatus, Verkehrsmetriken und Sitzungsraten.
Schritte zur Reproduktion
- Port-Scanning des öffentlichen IP-Bereichs enthüllte einen offenen HTTP-Dienst auf Port 9000.
- Eine Anfrage an den Root-Pfad lieferte den vollständigen HAProxy-Statistikbericht im HTML-Format zurück.
- Der Bericht listete jede Backend-Servergruppe mit Servernamen, Adressen, Ports und Betriebsstatus auf.
Technische Details
Die Statistikseite enthüllte Backend-Namen wie platform_machine_config_server_be, platform_k8s_api_be, platform_https_ingress_traffic_be, platform_oauth_be und webmail_be. Jeder Eintrag enthielt Backend-Server-Adresse, aktuelle Sitzungsanzahl, Bytes in/out, Health-Check-Status und Fehlerraten.
Proof of Concept
$ curl -s http://123.456.789.10:9000/ | grep -o 'platform_[a-z_]*_be' platform_machine_config_server_be platform_k8s_api_be platform_https_ingress_traffic_be platform_oauth_be $ curl -s http://123.456.789.10:9000/ | grep -E '^[a-z]+.*(UP|DOWN)' webmail_be 123.456.789.10 UP 0 128 45678 98765 [Vollständige Backend-Tabelle mit Sitzungen, Transfer und Status]
Auswirkungen
Vollständige Offenlegung der Infrastruktur-Topologie. Ein Angreifer erhält eine umfassende Karte aller internen Dienste, ihrer Adressen und Rollen — die Aufklärungsphase entfällt vollständig.
Behebung
- Entfernung des HAProxy-Statistik-Endpunkts aus der öffentlichen Frontend-Konfiguration
- Bindung des Statistik-Sockets nur an localhost oder Anforderung von HTTP Basic Authentication
- Falls Fernzugriff auf die Überwachung erforderlich ist, diesen über VPN oder SSH-Tunnel bereitstellen
Kubernetes-API-Server direkt im Internet offengelegt
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
Zusammenfassung
Der Kubernetes-API-Server ist direkt aus dem öffentlichen Internet auf Port 6443 erreichbar. Während der anonyme Zugriff auf API-Ressourcen ordnungsgemäß eingeschränkt ist (HTTP 403), gibt der API-Server Versionsinformationen, Gesundheitsstatus und OAuth-Discovery-Metadaten ohne Authentifizierung preis.
Schritte zur Reproduktion
- Zugriff auf Port 6443 auf beiden öffentlichen IPs — beide antworteten mit dem TLS-Handshake des Kubernetes-API-Servers.
- Der
/version-Endpunkt gab die genaue Kubernetes-Version, Go-Compiler-Version und Build-Datum zurück. - Die
/healthz,/readyzund/livez-Endpunkte antworteten ohne Authentifizierung.
Technische Details
Der API-Server gab Kubernetes v1.34.7, kompiliert mit Go 1.24.13 (Red Hat Build), preis. Der OAuth-Discovery-Endpunkt gab Issuer-URL, Autorisierungs-Endpunkt, Token-Endpunkt und unterstützte Scopes zurück.
Proof of Concept
$ curl -sk https://123.456.789.10:6443/version
{"major":"1","minor":"34","gitVersion":"v1.34.7",
"goVersion":"go1.24.13","platform":"linux/amd64"}
$ curl -sk https://123.456.789.10:6443/healthz
ok
$ curl -sk https://123.456.789.11:6443/version
{"major":"1","minor":"34",...}
[Auf beiden öffentlichen IPs erreichbar]
Auswirkungen
Direkte Angriffsfläche für Kubernetes-API-CVEs ohne VPN- oder Bastion-Zugang. Die Versionsoffenlegung ermöglicht gezielte Schwachstellenforschung. In Kombination mit dem extrahierten CA-Zertifikat und den offengelegten OAuth-Endpunkten entsteht eine vollständige Angriffskette.
Behebung
- Firewall für Port 6443 — Zugriff nur aus dem internen Cluster-Netzwerk und vertrauenswürdigen Management-IPs
- Überprüfung, dass das Load-Balancer-Frontend nur an interne Schnittstellen gebunden ist
- Einrichtung eines VPN für administrativen Kubernetes-API-Zugriff
- Aktivierung von API-Server-Audit-Logging
Session-Token in URL-Query-String offengelegt
AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:N
Zusammenfassung
Das authentifizierte Session-Token wird als URL-Query-Parameter bei einer Weiterleitung von der Hauptanwendung zur Builder-Subdomain übergeben. Dies legt das Session-Token über den Referer-Header gegenüber Drittanbieterdiensten offen, speichert es im Browser-Verlauf und hinterlässt es in Server- und Proxy-Protokollen.
Schritte zur Reproduktion
- Anmeldung bei der Hauptanwendung als normaler Benutzer.
- Navigation zur Kampagnenerstellungsseite löste eine Weiterleitung zur Builder-Subdomain aus.
- Der HTTP-302-Weiterleitungs-Location-Header enthielt das vollständige Session-Token als
session_id-Query-Parameter. - Der session_id-Wert war identisch mit dem bestehenden Session-Cookie.
Technische Details
Das Weiterleitungs-URL-Muster war https://builder.xyz-unternehmen.de/?type=popup&session_id=<token>&lang=de. Der session_id-Parameterwert stimmte exakt mit dem xyz_sessionid-Cookie überein. Die Builder-Seite lädt Ressourcen von 4 externen Domains.
Proof of Concept
$ curl -sI "https://app.xyz-unternehmen.de/on-site/create/popup/" \ -H 'Cookie: xyz_sessionid=sm38ntmftuj2q6adf3f5lv4kd2tpb5o9' HTTP/2 302 Location: https://builder.xyz-unternehmen.de/?type=popup\ &session_id=sm38ntmftuj2q6adf3f5lv4kd2tpb5o9&lang=de&referrer=xyz # session_id == xyz_sessionid (identisch) # 4 externe Domains erhalten Token im Referer
Auswirkungen
Session-Token werden über mehrere Kanäle offengelegt: Referer-Header an mindestens 4 externe Domains, Browser-Verlauf im Klartext, Server-Zugriffsprotokolle auf der Builder-Subdomain und zwischengeschaltete Proxy-Protokolle.
Behebung
- Übermittlung des Session-Tokens nur über das bestehende sichere HttpOnly-Cookie — nicht in URL-Parametern duplizieren
- Die Builder-Subdomain sollte die Session aus dem Cookie lesen, nicht aus der URL
- Alternativ: Verwendung eines kurzlebigen Einmal-Tokens, das nach der ersten Verwendung abläuft
Virtualisierungs-Management-Schnittstelle offengelegt
Zusammenfassung
Die Proxmox Virtual Environment Management-Schnittstelle ist auf Port 8006 ohne IP-Einschränkung offengelegt. Obwohl die Schnittstelle eine Authentifizierung erfordert, gibt sie über API-Antworten den Authentifizierungsbereich preis und vergrößert die Angriffsfläche für Credential-Angriffe und CVE-Exploitation.
Schritte zur Reproduktion
- Port-Scanning enthüllte einen HTTPS-Dienst auf Port 8006 mit Proxmox VE.
- Die Proxmox-VE-API gab Realm-Informationen ohne Authentifizierung zurück.
- Die Anmeldeseite war vollständig zugänglich und akzeptierte Anmeldeversuche.
Technische Details
Die Proxmox-VE-API unter /api2/json/access/domains gab konfigurierte Authentifizierungs-Realms preis. Die Versionsinformationen der Management-Schnittstelle ermöglichen gezielte CVE-Recherche.
Proof of Concept
$ curl -sk https://123.456.789.10:8006/api2/json/access/domains
{"data":[{"realm":"pam"},{"realm":"pve"}]}
$ curl -sk https://123.456.789.10:8006/ | grep -o 'Proxmox.*<'
Proxmox Virtual Environment
Auswirkungen
Vergrößerte Angriffsfläche für Infrastrukturkompromittierung. Proxmox VE bietet vollständige Kontrolle über alle virtuellen Maschinen, einschließlich der Kubernetes-Cluster-Knoten.
Behebung
- Zugriff auf die Management-Schnittstelle über VPN oder IP-Allowlisting einschränken
- Rate Limiting und Fail2ban für Anmeldeversuche implementieren
- Management-Schnittstellen in ein dediziertes Management-Netzwerk verlagern
Offengelegte Webmail- & Groupware-Schnittstelle
Zusammenfassung
Eine Webmail-Schnittstelle und Groupware-Installation sind ohne IP-Einschränkung offengelegt. Obwohl die Anmeldeseite selbst keine Daten preisgibt, vergrößert die Offenlegung die Angriffsfläche für Brute-Force-Angriffe, Phishing und CVE-Exploitation.
Schritte zur Reproduktion
- Der Webmail-Hostname wurde durch HAProxy-Statistik-Enumeration entdeckt.
- Es wurde bestätigt, dass die Webmail- und Groupware-Anmeldeseiten ohne Einschränkung zugänglich sind.
- API-Status-Endpunkte waren erreichbar (Umleitung zur Anmeldung für nicht authentifizierte Anfragen).
Technische Details
Die Webmail-Installation wurde durch HTML-Quellcode-Analyse bestätigt. Die Groupware-Schnittstelle war unter einem vorhersagbaren Pfad zugänglich. Interne API-Endpunkte für den Container-Status waren erreichbar (HTTP 200).
Proof of Concept
$ curl -s https://mail.xyz-unternehmen.de/ | grep -o 'mailcow'
mailcow (Installation bestätigt)
$ curl -s -o /dev/null -w "%{http_code}" https://mail.xyz-unternehmen.de/SOGo/
200
Auswirkungen
Vergrößerte Angriffsfläche für E-Mail-Konto-Kompromittierung, Brute-Force von Anmeldeinformationen, CVE-Exploitation und Phishing.
Behebung
- Zugriff auf die Webmail-Schnittstelle über VPN oder IP-Allowlisting einschränken
- Rate Limiting für Anmeldeversuche implementieren
- Fail2ban für wiederholte Authentifizierungsfehler einsetzen
4. Risikomatrix
In diesem Bericht verwendete qualitative CVSS v3.1-Zuordnung:
| Bewertung | CVSS-Wert | Definition |
|---|---|---|
| CRITICAL | 9.0 – 10.0 | Sofortige Kompromittierung kritischer Systeme; vollständige Datenexfiltration oder Systemübernahme ohne Benutzerinteraktion möglich |
| HIGH | 7.0 – 8.9 | Erhebliche Auswirkungen auf Vertraulichkeit, Integrität oder Verfügbarkeit; kann Lateral Movement oder Privilegienerweiterung ermöglichen |
| MEDIUM | 4.0 – 6.9 | Begrenzte Auswirkungen; erfordert Benutzerinteraktion, bestimmte Bedingungen oder Kombination mit anderen Schwächen |
| LOW | 0.1 – 3.9 | Minimale direkte Auswirkungen; Offenlegung von Informationen zur Unterstützung der Aufklärung; Defense-in-Depth-Bedenken |
5. Fazit & Empfohlene nächste Schritte
Der Penetrationstest identifizierte 7 Funde in der externen Angriffsfläche, darunter eine kritische Infrastrukturoffenlegung, die sofortige Aufmerksamkeit erfordert.
Sofortige Prioritäten (innerhalb von 48 Stunden)
- Entfernen des Cluster-Bootstrap-Konfigurationsendpunkts aus dem öffentlichen Zugriff (RPT-05) — diese einzelne Änderung beseitigt den schwerwiegendsten Fund
- Rotation aller offengelegten Anmeldeinformationen: SSH-Schlüssel, Kubernetes-CA-Zertifikate und Knotenzertifikate (RPT-05)
- Einschränkung der Cluster-Webkonsole und OAuth-Endpunkte auf nur per VPN erreichbare IPs (RPT-07)
Kurzfristig (innerhalb von 2 Wochen)
- Firewall für Kubernetes-API-Server (RPT-06) und HAProxy-Statistik-Schnittstelle (RPT-01) einrichten
- Offenlegung des Session-Tokens in URL-Parametern beheben (RPT-03)
- Webmail- und Virtualisierungs-Management-Schnittstellen einschränken (RPT-02, RPT-04)
Laufend
- Regelmäßigen Scan-Zeitplan für den externen Perimeter einführen
- Internen Penetrationstest zur Bewertung von Lateral-Movement-Risiken durchführen
- Retest nach Behebung zur Überprüfung der Schließung aller Funde einplanen
Möchten Sie einen solchen Bericht für Ihre Anwendung?