Pentesting Kubernetes Services
Kubernetes verwendet mehrere spezifische Netzwerkdienste, die möglicherweise im Internet freigelegt sind oder in einem internen Netzwerk, sobald Sie einen Pod kompromittiert haben.
Auffinden freigelegter Pods mit OSINT
Eine Möglichkeit könnte sein, nach Identity LIKE "k8s.%.com"
in crt.sh zu suchen, um Subdomains im Zusammenhang mit Kubernetes zu finden. Eine andere Möglichkeit könnte sein, nach "k8s.%.com"
in GitHub zu suchen und nach YAML-Dateien zu suchen, die den String enthalten.
Wie Kubernetes Dienste freilegt
Es könnte für Sie nützlich sein zu verstehen, wie Kubernetes Dienste öffentlich freilegen kann, um sie zu finden:
pageExposing Services in KubernetesAuffinden freigelegter Pods über Portscans
Die folgenden Ports könnten in einem Kubernetes-Cluster geöffnet sein:
Port | Prozess | Beschreibung |
---|---|---|
443/TCP | kube-apiserver | Kubernetes-API-Port |
2379/TCP | etcd | |
6666/TCP | etcd | etcd |
4194/TCP | cAdvisor | Container-Metriken |
6443/TCP | kube-apiserver | Kubernetes-API-Port |
8443/TCP | kube-apiserver | Minikube-API-Port |
8080/TCP | kube-apiserver | Unsicherer API-Port |
10250/TCP | kubelet | HTTPS-API, die vollständigen Zugriff ermöglicht |
10255/TCP | kubelet | Nicht authentifizierter schreibgeschützter HTTP-Port: Pods, laufende Pods und Knotenzustand |
10256/TCP | kube-proxy | Kube Proxy Health Check Server |
9099/TCP | calico-felix | Health Check Server für Calico |
6782-4/TCP | weave | Metriken und Endpunkte |
30000-32767/TCP | NodePort | Proxy zu den Diensten |
44134/TCP | Tiller | Helm-Dienst lauscht |
Nmap
Kube-apiserver
Dies ist der API Kubernetes-Dienst, mit dem Administratoren normalerweise mit dem Tool kubectl
kommunizieren.
Gängige Ports: 6443 und 443, aber auch 8443 in Minikube und 8080 als unsicher.
Überprüfen Sie die folgende Seite, um zu erfahren, wie Sie sensible Daten erhalten und sensible Aktionen mit diesem Dienst ausführen können:
pageKubernetes EnumerationKubelet API
Dieser Dienst läuft auf jedem Knoten des Clusters. Es ist der Dienst, der die Pods innerhalb des Knotens steuert. Er kommuniziert mit dem kube-apiserver.
Wenn Sie feststellen, dass dieser Dienst freigelegt ist, haben Sie möglicherweise eine nicht authentifizierte RCE gefunden.
Kubelet API
Wenn die Antwort Unauthorized
lautet, erfordert dies eine Authentifizierung.
Wenn Sie Knoten auflisten können, können Sie eine Liste der Kubelet-Endpunkte mit erhalten:
kubelet (Nur Lesen)
etcd API
Tiller
Du könntest diesen Service missbrauchen, um Privilegien innerhalb von Kubernetes zu eskalieren:
cAdvisor
Dienst, der nützlich ist, um Metriken zu sammeln.
NodePort
Wenn ein Port über einen NodePort auf allen Nodes freigegeben wird, wird derselbe Port auf allen Nodes geöffnet, um den Datenverkehr zum deklarierten Service zu leiten. Standardmäßig liegt dieser Port im Bereich 30000-32767. Daher können neue nicht überprüfte Services über diese Ports erreichbar sein.
Anfällige Fehlkonfigurationen
Kube-apiserver Anonymer Zugriff
Der anonyme Zugriff auf kube-apiserver-API-Endpunkte ist nicht erlaubt. Aber Sie könnten einige Endpunkte überprüfen:
Überprüfung des ETCD-Anonymen Zugriffs
Der ETCD speichert die Clustergeheimnisse, Konfigurationsdateien und weitere sensible Daten. Standardmäßig kann auf den ETCD nicht anonym zugegriffen werden, aber es ist immer gut zu überprüfen.
Wenn auf den ETCD anonym zugegriffen werden kann, müssen Sie möglicherweise das etcdctl Tool verwenden. Mit dem folgenden Befehl werden alle gespeicherten Schlüssel abgerufen:
Kubelet RCE
Die Kubelet-Dokumentation erklärt, dass standardmäßig anonymer Zugriff auf den Dienst zugelassen ist:
Ermöglicht anonyme Anfragen an den Kubelet-Server. Anfragen, die nicht von einer anderen Authentifizierungsmethode abgelehnt werden, werden als anonyme Anfragen behandelt. Anonyme Anfragen haben einen Benutzernamen
system:anonymous
und einen Gruppennamensystem:unauthenticated
.
Um besser zu verstehen, wie die Authentifizierung und Autorisierung der Kuebelet-API funktioniert, schauen Sie sich diese Seite an:
pageKubelet Authentication & AuthorizationDer Kubelet-Service API ist nicht dokumentiert, aber der Quellcode kann hier gefunden werden und das Auffinden der freigegebenen Endpunkte ist so einfach wie das Ausführen:
Du kannst das Kubeletctl Tool verwenden, um mit Kubelets und deren Endpunkten zu interagieren.
/pods
Dieser Endpunkt listet Pods und deren Container auf:
/exec
Dieser Endpunkt ermöglicht es, Code sehr einfach innerhalb eines beliebigen Containers auszuführen:
Um diesen Angriff zu vermeiden, sollte der kubelet-Dienst mit --anonymous-auth false
ausgeführt und der Dienst auf Netzwerkebene segregiert werden.
Überprüfung der Offenlegung von Informationen des Kubelet (Nur-Lese-Port)
Wenn ein kubelet Nur-Lese-Port freigelegt ist, wird es möglich, dass unbefugte Parteien Informationen über die API abrufen können. Die Offenlegung dieses Ports kann zur Offenlegung verschiedener Cluster-Konfigurationselemente führen. Obwohl die Informationen, einschließlich Pod-Namen, Speicherorte interner Dateien und anderer Konfigurationen, nicht kritisch sein mögen, stellt ihre Offenlegung dennoch ein Sicherheitsrisiko dar und sollte vermieden werden.
Ein Beispiel, wie diese Schwachstelle ausgenutzt werden kann, beinhaltet einen entfernten Angreifer, der auf eine spezifische URL zugreift. Indem er zu http://<external-IP>:10255/pods
navigiert, kann der Angreifer potenziell sensible Informationen vom kubelet abrufen:
Referenzen
Last updated