Pentesting Kubernetes Services

Unterstützen Sie HackTricks

Kubernetes verwendet mehrere spezifische Netzwerkdienste, die möglicherweise im Internet freigelegt sind oder in einem internen Netzwerk, sobald Sie einen Pod kompromittiert haben.

Auffinden von freigelegten 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:

Exposing 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, der zuhört

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:

Kubernetes 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

Tiller ist ein Server, der auf dem Kubernetes-Cluster läuft und die Helm-Client-Anfragen entgegennimmt. Es ist wichtig zu beachten, dass Tiller standardmäßig mit administrativen Berechtigungen konfiguriert ist, was potenzielle Sicherheitsrisiken darstellt. Daher ist es ratsam, die Sicherheit von Tiller während des Pentestings zu überprüfen.

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

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

cAdvisor

Dienst nützlich zum Sammeln von Metriken.

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 befindet sich 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

Anonymer Zugriff auf Kube-apiserver

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 Werkzeug verwenden. Der folgende Befehl ruft alle gespeicherten Schlüssel ab:

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 erlaubt 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 von system:anonymous und einen Gruppennamen von system:unauthenticated

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

Kubelet 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 ihren Endpunkten zu interagieren.

/pods

Dieser Endpunkt listet Pods und ihre 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 werden und der Dienst sollte auf Netzwerkebene segregiert werden.

Überprüfung der Offenlegung von Kubelet (Nur-Lese-Port) Informationen

Wenn ein kubelet Nur-Lese-Port freigelegt ist, wird es möglich, dass Informationen von Unbefugten aus der API abgerufen werden 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 bestimmte URL zugreift. Indem er zu http://<external-IP>:10255/pods navigiert, kann der Angreifer potenziell sensible Informationen vom kubelet abrufen:

https://www.cyberark.com/wp-content/uploads/2019/09/KUbe-Pen-2-fig-6.png

Referenzen

Unterstützen Sie HackTricks

Last updated