Pentesting Kubernetes Services

Erlernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

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 Kubernetes

Auffinden freigelegter Pods über Portscans

Die folgenden Ports könnten in einem Kubernetes-Cluster geöffnet sein:

PortProzessBeschreibung

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

nmap -n -T4 -p 443,2379,6666,4194,6443,8443,8080,10250,10255,10256,9099,6782-6784,30000-32767,44134 <pod_ipaddress>/16

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.

curl -k https://<IP Address>:(8|6)443/swaggerapi
curl -k https://<IP Address>:(8|6)443/healthz
curl -k https://<IP Address>:(8|6)443/api/v1

Ü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 Enumeration

Kubelet 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

curl -k https://<IP address>:10250/metrics
curl -k https://<IP address>:10250/pods

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:

kubectl get nodes -o custom-columns='IP:.status.addresses[0].address,KUBELET_PORT:.status.daemonEndpoints.kubeletEndpoint.Port' | grep -v KUBELET_PORT | while IFS='' read -r node; do
ip=$(echo $node | awk '{print $1}')
port=$(echo $node | awk '{print $2}')
echo "curl -k --max-time 30 https://$ip:$port/pods"
echo "curl -k --max-time 30 https://$ip:2379/version" #Check  also for etcd
done

kubelet (Nur Lesen)

curl -k https://<IP Address>:10255
http://<external-IP>:10255/pods

etcd API

curl -k https://<IP address>:2379
curl -k https://<IP address>:2379/version
etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only

Tiller

helm --host tiller-deploy.kube-system:44134 version

Du könntest diesen Service missbrauchen, um Privilegien innerhalb von Kubernetes zu eskalieren:

cAdvisor

Dienst, der nützlich ist, um Metriken zu sammeln.

curl -k https://<IP Address>:4194

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.

sudo nmap -sS -p 30000-32767 <IP>

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:

etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only

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 Gruppennamen system:unauthenticated.

Um besser zu verstehen, wie die Authentifizierung und Autorisierung der Kuebelet-API funktioniert, schauen Sie sich diese Seite an:

pageKubelet Authentication & Authorization

Der 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:

curl -s https://raw.githubusercontent.com/kubernetes/kubernetes/master/pkg/kubelet/server/server.go | grep 'Path("/'

Path("/pods").
Path("/run")
Path("/exec")
Path("/attach")
Path("/portForward")
Path("/containerLogs")
Path("/runningpods/").

Du kannst das Kubeletctl Tool verwenden, um mit Kubelets und deren Endpunkten zu interagieren.

/pods

Dieser Endpunkt listet Pods und deren Container auf:

kubeletctl pods

/exec

Dieser Endpunkt ermöglicht es, Code sehr einfach innerhalb eines beliebigen Containers auszuführen:

kubeletctl exec [command]

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

Erlernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated