Kubernetes Pivoting to Clouds
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wenn Sie einen k8s-Cluster innerhalb von GCP betreiben, möchten Sie wahrscheinlich, dass eine Anwendung, die innerhalb des Clusters läuft, Zugriff auf GCP hat. Es gibt 2 gängige Möglichkeiten, dies zu tun:
Eine gängige Möglichkeit, Zugriff auf eine Kubernetes-Anwendung zu GCP zu gewähren, ist:
Erstellen Sie ein GCP-Servicekonto
Binden Sie die gewünschten Berechtigungen daran
Laden Sie einen JSON-Schlüssel des erstellten SA herunter
Mounten Sie es als Geheimnis innerhalb des Pods
Setzen Sie die Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS, die auf den Pfad zeigt, wo die JSON-Datei gespeichert ist.
Daher sollten Sie als Angreifer, wenn Sie einen Container innerhalb eines Pods kompromittieren, nach dieser Umgebungsvariable und JSON-Dateien mit GCP-Anmeldeinformationen suchen.
Eine Möglichkeit, einem GSA Zugriff auf einen GKE-Cluster zu gewähren, besteht darin, sie auf folgende Weise zu binden:
Erstellen Sie ein Kubernetes-Servicekonto im selben Namespace wie Ihr GKE-Cluster mit dem folgenden Befehl:
Erstellen Sie ein Kubernetes Secret, das die Anmeldeinformationen des GCP-Dienstkontos enthält, dem Sie Zugriff auf den GKE-Cluster gewähren möchten. Sie können dies mit dem gcloud
-Befehlszeilenwerkzeug tun, wie im folgenden Beispiel gezeigt:
Binden Sie das Kubernetes Secret an das Kubernetes-Dienstkonto mit dem folgenden Befehl:
Im zweiten Schritt wurden die Anmeldeinformationen des GSA als Geheimnis des KSA festgelegt. Wenn Sie dann dieses Geheimnis von innerhalb des GKE-Clusters lesen können, können Sie zu diesem GCP-Dienstkonto eskalieren.
Mit Workload Identity können wir ein Kubernetes-Dienstkonto so konfigurieren, dass es als Google-Dienstkonto fungiert. Pods, die mit dem Kubernetes-Dienstkonto ausgeführt werden, authentifizieren sich automatisch als das Google-Dienstkonto, wenn sie auf Google Cloud APIs zugreifen.
Die erste Reihe von Schritten, um dieses Verhalten zu aktivieren, besteht darin, Workload Identity in GCP zu aktivieren (Schritte) und das GCP SA zu erstellen, das k8s nachahmen soll.
Aktivieren Sie Workload Identity in einem neuen Cluster
Erstellen/Aktualisieren eines neuen Nodepools (Autopilot-Cluster benötigen dies nicht)
Erstellen Sie das GCP-Dienstkonto zur Nachahmung von K8s mit GCP-Berechtigungen:
Verbinden Sie sich mit dem Cluster und erstellen Sie das Dienstkonto, das Sie verwenden möchten
Binden Sie die GSA mit der KSA
Führen Sie ein pod mit der KSA aus und überprüfen Sie den Zugriff auf die GSA:
Überprüfen Sie den folgenden Befehl zur Authentifizierung, falls erforderlich:
Als Angreifer innerhalb von K8s sollten Sie nach SAs suchen, die die iam.gke.io/gcp-service-account
-Annotation haben, da dies darauf hinweist, dass der SA auf etwas in GCP zugreifen kann. Eine weitere Möglichkeit wäre, zu versuchen, jede KSA im Cluster auszunutzen und zu überprüfen, ob sie Zugriff hat.
Es ist immer interessant, die Bindungen von GCP aufzulisten und zu wissen, welchen Zugriff Sie SAs innerhalb von Kubernetes gewähren.
Dies ist ein Skript, um einfach über alle Pod-Definitionen zu iterieren und nach dieser Annotation zu suchen:
Eine (veraltete) Möglichkeit, IAM-Rollen an Pods zu vergeben, besteht darin, einen Kiam oder einen Kube2IAM Server zu verwenden. Grundsätzlich müssen Sie ein Daemonset in Ihrem Cluster mit einer Art von privilegierter IAM-Rolle ausführen. Dieses Daemonset wird den Pods, die es benötigen, Zugriff auf IAM-Rollen gewähren.
Zunächst müssen Sie konfigurieren, welche Rollen im Namespace zugänglich sind, und das tun Sie mit einer Annotation im Namespace-Objekt:
Sobald der Namespace mit den IAM-Rollen konfiguriert ist, die die Pods haben können, können Sie die Rolle, die Sie in jeder Pod-Definition möchten, mit etwas wie:
Als Angreifer, wenn Sie diese Annotationen in Pods oder Namespaces finden oder einen kiam/kube2iam-Server (wahrscheinlich im kube-system) laufen haben, können Sie jede rolle, die bereits von Pods verwendet wird, und mehr nachahmen (wenn Sie Zugriff auf das AWS-Konto haben, listen Sie die Rollen auf).
Die anzugebende IAM-Rolle muss im selben AWS-Konto wie die kiam/kube2iam-Rolle sein, und diese Rolle muss darauf zugreifen können.
Dies ist der empfohlene Weg von AWS.
Zuerst müssen Sie einen OIDC-Anbieter für den Cluster erstellen.
Dann erstellen Sie eine IAM-Rolle mit den Berechtigungen, die das SA benötigt.
Erstellen Sie eine Vertrauensbeziehung zwischen der IAM-Rolle und dem SA Namen (oder den Namespaces, die den Zugriff auf die Rolle für alle SAs des Namespaces gewähren). Die Vertrauensbeziehung überprüft hauptsächlich den OIDC-Anbieternamen, den Namespace-Namen und den SA-Namen.
Schließlich erstellen Sie ein SA mit einer Annotation, die die ARN der Rolle angibt, und die Pods, die mit diesem SA ausgeführt werden, haben Zugriff auf das Token der Rolle. Das Token wird in eine Datei geschrieben und der Pfad wird in AWS_WEB_IDENTITY_TOKEN_FILE
angegeben (Standard: /var/run/secrets/eks.amazonaws.com/serviceaccount/token
)
Um aws mit dem Token von /var/run/secrets/eks.amazonaws.com/serviceaccount/token
zu erhalten, führen Sie aus:
Als Angreifer, wenn Sie einen K8s-Cluster enumerieren können, überprüfen Sie Servicekonten mit dieser Annotation, um sich zu AWS zu eskalieren. Dazu müssen Sie einfach exec/create ein Pod mit einem der IAM privilegierten Servicekonten erstellen und das Token stehlen.
Darüber hinaus, wenn Sie sich in einem Pod befinden, überprüfen Sie Umgebungsvariablen wie AWS_ROLE_ARN und AWS_WEB_IDENTITY_TOKEN.
Manchmal könnte die Trust Policy eines Rollens schlecht konfiguriert sein und anstatt den AssumeRole-Zugriff auf das erwartete Servicekonto zu gewähren, gewährt sie ihn allen Servicekonten. Daher, wenn Sie in der Lage sind, eine Annotation auf einem kontrollierten Servicekonto zu schreiben, können Sie auf die Rolle zugreifen.
Überprüfen Sie die folgende Seite für weitere Informationen:
Dies ist ein Skript, um einfach über alle Pods und SAs-Definitionen zu iterieren und nach dieser Annotation zu suchen:
Der vorherige Abschnitt handelte davon, wie man IAM-Rollen mit Pods stiehlt, aber beachten Sie, dass ein Node des K8s-Clusters eine Instanz in der Cloud sein wird. Das bedeutet, dass der Node höchstwahrscheinlich eine neue IAM-Rolle hat, die Sie stehlen können (beachten Sie, dass normalerweise alle Nodes eines K8s-Clusters die gleiche IAM-Rolle haben, daher könnte es sich nicht lohnen, auf jedem Node nachzusehen).
Es gibt jedoch eine wichtige Voraussetzung, um auf den Metadaten-Endpunkt vom Node zuzugreifen: Sie müssen sich im Node befinden (SSH-Sitzung?) oder zumindest dasselbe Netzwerk haben:
Zuvor haben wir besprochen, wie man IAM-Rollen an Pods anheftet oder sogar wie man zum Knoten entkommt, um die IAM-Rolle zu stehlen, die der Instanz zugeordnet ist.
Sie können das folgende Skript verwenden, um Ihre neu erarbeiteten IAM-Rollenanmeldeinformationen zu stehlen:
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)