Kubernetes Enumeration
Kubernetes Tokens
Wenn du kompromittierten Zugriff auf eine Maschine hast, könnte der Benutzer Zugriff auf eine Kubernetes-Plattform haben. Das Token befindet sich normalerweise in einer Datei, die durch die Umgebungsvariable KUBECONFIG
oder innerhalb von ~/.kube
angegeben wird.
In diesem Ordner findest du möglicherweise Konfigurationsdateien mit Tokens und Konfigurationen zur Verbindung mit dem API-Server. In diesem Ordner kannst du auch einen Cache-Ordner mit zuvor abgerufenen Informationen finden.
Wenn du ein Pod innerhalb einer Kubernetes-Umgebung kompromittiert hast, gibt es andere Orte, an denen du Tokens und Informationen über die aktuelle K8-Umgebung finden kannst:
Service Account Tokens
Bevor du fortfährst, wenn du nicht weißt, was ein Service in Kubernetes ist, empfehle ich dir, diesem Link zu folgen und mindestens die Informationen über die Kubernetes-Architektur zu lesen.
Entnommen aus der Kubernetes Dokumentation:
„Wenn du ein Pod erstellst und kein Service-Konto angibst, wird ihm automatisch das Standard-Service-Konto im selben Namespace zugewiesen.”
ServiceAccount ist ein von Kubernetes verwaltetes Objekt, das verwendet wird, um eine Identität für Prozesse bereitzustellen, die in einem Pod ausgeführt werden. Jedes Service-Konto hat ein geheimes Token, das damit verbunden ist, und dieses Geheimnis enthält ein Träger-Token. Dies ist ein JSON Web Token (JWT), eine Methode zur sicheren Darstellung von Ansprüchen zwischen zwei Parteien.
In der Regel enthält einer der Verzeichnisse:
/run/secrets/kubernetes.io/serviceaccount
/var/run/secrets/kubernetes.io/serviceaccount
/secrets/kubernetes.io/serviceaccount
die Dateien:
ca.crt: Es ist das CA-Zertifikat zur Überprüfung der Kubernetes-Kommunikation
namespace: Es zeigt den aktuellen Namespace an
token: Es enthält das Service-Token des aktuellen Pods.
Jetzt, da du das Token hast, kannst du den API-Server innerhalb der Umgebungsvariable KUBECONFIG
finden. Für weitere Informationen führe (env | set) | grep -i "kuber|kube
"
aus.
Das Service-Konto-Token wird mit dem Schlüssel signiert, der sich in der Datei sa.key befindet, und durch sa.pub validiert.
Standardstandort auf Kubernetes:
/etc/kubernetes/pki
Standardstandort auf Minikube:
/var/lib/localkube/certs
Hot Pods
Hot Pods sind Pods, die ein privilegiertes Service-Konto-Token enthalten. Ein privilegiertes Service-Konto-Token ist ein Token, das die Berechtigung hat, privilegierte Aufgaben wie das Auflisten von Geheimnissen, das Erstellen von Pods usw. auszuführen.
RBAC
Wenn du nicht weißt, was RBAC ist, lies diesen Abschnitt.
GUI-Anwendungen
k9s: Eine GUI, die einen Kubernetes-Cluster vom Terminal aus auflistet. Überprüfe die Befehle in https://k9scli.io/topics/commands/. Schreibe
:namespace
und wähle alle aus, um dann Ressourcen in allen Namespaces zu suchen.k8slens: Bietet einige kostenlose Testtage an: https://k8slens.dev/
Enumeration CheatSheet
Um eine K8s-Umgebung zu enumerieren, benötigst du ein paar Dinge:
Ein gültiges Authentifizierungstoken. Im vorherigen Abschnitt haben wir gesehen, wo man nach einem Benutzertoken und einem Service-Konto-Token suchen kann.
Die Adresse (https://host:port) des Kubernetes-API. Diese kann normalerweise in den Umgebungsvariablen und/oder in der Kube-Konfigurationsdatei gefunden werden.
Optional: Das ca.crt zur Überprüfung des API-Servers. Dies kann an denselben Orten gefunden werden, an denen das Token gefunden werden kann. Dies ist nützlich, um das Zertifikat des API-Servers zu überprüfen, aber wenn du
--insecure-skip-tls-verify
mitkubectl
oder-k
mitcurl
verwendest, benötigst du dies nicht.
Mit diesen Details kannst du Kubernetes enumerieren. Wenn die API aus irgendeinem Grund über das Internet zugänglich ist, kannst du diese Informationen einfach herunterladen und die Plattform von deinem Host aus enumerieren.
In der Regel befindet sich der API-Server jedoch in einem internen Netzwerk, daher musst du einen Tunnel durch die kompromittierte Maschine erstellen, um von deiner Maschine darauf zuzugreifen, oder du kannst die kubectl Binärdatei hochladen oder curl/wget/anything
verwenden, um rohe HTTP-Anfragen an den API-Server zu senden.
Unterschiede zwischen den Verben list
und get
list
und get
Mit get
Berechtigungen kannst du Informationen über spezifische Assets (describe
Option in kubectl
) API:
Wenn Sie die list
Berechtigung haben, dürfen Sie API-Anfragen ausführen, um eine Art von Asset aufzulisten (get
Option in kubectl
):
Wenn Sie die watch
-Berechtigung haben, dürfen Sie API-Anfragen ausführen, um Ressourcen zu überwachen:
Sie öffnen eine Streaming-Verbindung, die Ihnen das vollständige Manifest eines Deployments zurückgibt, wann immer es sich ändert (oder wenn ein neues erstellt wird).
Die folgenden kubectl
-Befehle zeigen, wie man die Objekte auflistet. Wenn Sie auf die Daten zugreifen möchten, müssen Sie describe
anstelle von get
verwenden.
Verwendung von curl
Von innerhalb eines Pods können Sie mehrere Umgebungsvariablen verwenden:
Standardmäßig kann das Pod auf den kube-api-Server im Domainnamen kubernetes.default.svc
zugreifen, und Sie können das kube-Netzwerk in /etc/resolv.config
sehen, da Sie hier die Adresse des Kubernetes-DNS-Servers finden (die ".1" desselben Bereichs ist der kube-api-Endpunkt).
Verwendung von kubectl
Mit dem Token und der Adresse des API-Servers verwenden Sie kubectl oder curl, um darauf zuzugreifen, wie hier angegeben:
Standardmäßig kommuniziert der APISERVER mit dem https://
-Schema
Wenn kein
https://
in der URL vorhanden ist, kann es zu einem Fehler wie Bad Request kommen.
Sie können ein offizielles kubectl-Spickzettel hier finden. Das Ziel der folgenden Abschnitte ist es, in geordneter Weise verschiedene Optionen zur Enumeration und zum Verständnis des neuen K8s, auf das Sie Zugriff erhalten haben, zu präsentieren.
Um die HTTP-Anfrage zu finden, die kubectl
sendet, können Sie den Parameter -v=8
verwenden.
MitM kubectl - Proxyfying kubectl
Aktuelle Konfiguration
Wenn es Ihnen gelungen ist, einige Benutzeranmeldeinformationen zu stehlen, können Sie sie lokal konfigurieren mit etwas wie:
Unterstützte Ressourcen abrufen
Mit diesen Informationen wissen Sie, welche Dienste Sie auflisten können
Aktuelle Berechtigungen abrufen
Eine weitere Möglichkeit, Ihre Berechtigungen zu überprüfen, ist die Verwendung des Tools: https://github.com/corneliusweig/rakkess****
Sie können mehr über Kubernetes RBAC erfahren in:
Kubernetes Role-Based Access Control(RBAC)Sobald Sie wissen, welche Berechtigungen Sie haben, überprüfen Sie die folgende Seite, um herauszufinden, ob Sie diese ausnutzen können, um Berechtigungen zu eskalieren:
Abusing Roles/ClusterRoles in KubernetesAndere Rollen abrufen
Holen Sie sich Namespaces
Kubernetes unterstützt mehrere virtuelle Cluster, die von demselben physischen Cluster unterstützt werden. Diese virtuellen Cluster werden Namespaces genannt.
Geheimnisse abrufen
Wenn Sie Geheimnisse lesen können, können Sie die folgenden Zeilen verwenden, um die Berechtigungen zu erhalten, die mit jedem Token verbunden sind:
Dienstkonten abrufen
Wie zu Beginn dieser Seite besprochen wird einem Pod normalerweise ein Dienstkonto zugewiesen. Daher kann das Auflisten der Dienstkonten, ihrer Berechtigungen und wo sie ausgeführt werden, einem Benutzer ermöglichen, Privilegien zu eskalieren.
Deployments abrufen
Die Deployments geben die Komponenten an, die ausgeführt werden müssen.
Pods abrufen
Die Pods sind die eigentlichen Container, die ausgeführt werden.
Dienste abrufen
Kubernetes Dienste werden verwendet, um einen Dienst an einem bestimmten Port und einer bestimmten IP bereitzustellen (der als Lastenausgleich für die Pods fungiert, die tatsächlich den Dienst anbieten). Es ist interessant zu wissen, wo Sie andere Dienste finden können, um zu versuchen, anzugreifen.
Knoten abrufen
Holen Sie sich alle Knoten, die im Cluster konfiguriert sind.
DaemonSets abrufen
DaemonSets ermöglichen es, sicherzustellen, dass ein spezifischer Pod auf allen Knoten des Clusters (oder auf den ausgewählten) läuft. Wenn Sie den DaemonSet löschen, werden auch die von ihm verwalteten Pods entfernt.
Cronjob abrufen
Cronjobs ermöglichen es, mit einer crontab-ähnlichen Syntax den Start eines Pods zu planen, der eine bestimmte Aktion ausführt.
Konfigurationsmappe abrufen
configMap enthält immer viele Informationen und Konfigurationsdateien, die an Apps bereitgestellt werden, die in Kubernetes ausgeführt werden. Normalerweise finden Sie viele Passwörter, Geheimnisse und Tokens, die zur Verbindung und Validierung mit anderen internen/externen Diensten verwendet werden.
Netzwerk-Richtlinien abrufen / Cilium Netzwerk-Richtlinien
Alles / Alle
Alle von Helm verwalteten Ressourcen abrufen
Pod-Verbrauch abfragen
Ausbrechen aus dem Pod
Wenn Sie in der Lage sind, neue Pods zu erstellen, könnten Sie in der Lage sein, aus ihnen auf den Knoten zu entkommen. Um dies zu tun, müssen Sie einen neuen Pod mit einer YAML-Datei erstellen, zum erstellten Pod wechseln und dann in das System des Knotens chrooten. Sie können bereits vorhandene Pods als Referenz für die YAML-Datei verwenden, da sie vorhandene Images und Pfade anzeigen.
Wenn Sie ein Pod auf einem bestimmten Knoten erstellen müssen, können Sie den folgenden Befehl verwenden, um die Labels auf dem Knoten abzurufen
k get nodes --show-labels
Häufig sind kubernetes.io/hostname und node-role.kubernetes.io/master gute Labels zur Auswahl.
Dann erstellen Sie Ihre attack.yaml-Datei.
Danach erstellen Sie das Pod
Jetzt können Sie zum erstellten Pod wie folgt wechseln
Und schließlich chrootest du in das System des Knotens.
Information obtained from: Kubernetes Namespace Breakout using Insecure Host Path Volume — Part 1 Attacking and Defending Kubernetes: Bust-A-Kube – Episode 1
References
Last updated