AWS - EKS Post Exploitation

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

Andere Möglichkeiten, HackTricks zu unterstützen:

EKS

Für weitere Informationen siehe

pageAWS - EKS Enum

Cluster vom AWS-Console aus aufzählen

Wenn Sie die Berechtigung eks:AccessKubernetesApi haben, können Sie Kubernetes-Objekte anzeigen über die AWS EKS-Konsole (Weitere Informationen).

Verbindung zum AWS Kubernetes-Cluster herstellen

  • Einfacher Weg:

# Generate kubeconfig
aws eks update-kubeconfig --name aws-eks-dev
  • Nicht auf so einfache Weise:

Wenn Sie einen Token erhalten können mit aws eks get-token --name <cluster_name> aber keine Berechtigungen haben, um Cluster-Informationen abzurufen (describeCluster), könnten Sie Ihre eigene ~/.kube/config vorbereiten. Trotzdem, wenn Sie den Token haben, benötigen Sie immer noch die URL-Endpunkt, um eine Verbindung herzustellen (wenn es Ihnen gelungen ist, einen JWT-Token von einem Pod zu erhalten, lesen Sie hier) und den Namen des Clusters.

In meinem Fall habe ich die Informationen nicht in den CloudWatch-Protokollen gefunden, aber ich habe sie in den LaunchTemaplates-Benutzerdaten und auch in den EC2-Maschinen in den Benutzerdaten gefunden. Sie können diese Informationen leicht in den Benutzerdaten sehen, zum Beispiel im folgenden Beispiel (der Clustername war cluster-name):

API_SERVER_URL=https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-east-1.eks.amazonaws.com

/etc/eks/bootstrap.sh cluster-name --kubelet-extra-args '--node-labels=eks.amazonaws.com/sourceLaunchTemplateVersion=1,alpha.eksctl.io/cluster-name=cluster-name,alpha.eksctl.io/nodegroup-name=prd-ondemand-us-west-2b,role=worker,eks.amazonaws.com/nodegroup-image=ami-002539dd2c532d0a5,eks.amazonaws.com/capacityType=ON_DEMAND,eks.amazonaws.com/nodegroup=prd-ondemand-us-west-2b,type=ondemand,eks.amazonaws.com/sourceLaunchTemplateId=lt-0f0f0ba62bef782e5 --max-pods=58' --b64-cluster-ca $B64_CLUSTER_CA --apiserver-endpoint $API_SERVER_URL --dns-cluster-ip $K8S_CLUSTER_DNS_IP --use-max-pods false
Konfiguration von kube

```yaml describe-cache-parametersapiVersion: v1 clusters: - cluster: certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1USXlPREUyTWpjek1Wb1hEVE15TVRJeU5URTJNamN6TVZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTDlXCk9OS0ZqeXZoRUxDZGhMNnFwWkMwa1d0UURSRVF1UzVpRDcwK2pjbjFKWXZ4a3FsV1ZpbmtwOUt5N2x2ME5mUW8KYkNqREFLQWZmMEtlNlFUWVVvOC9jQXJ4K0RzWVlKV3dzcEZGbWlsY1lFWFZHMG5RV1VoMVQ3VWhOanc0MllMRQpkcVpzTGg4OTlzTXRLT1JtVE5sN1V6a05pTlUzSytueTZSRysvVzZmbFNYYnRiT2kwcXJSeFVpcDhMdWl4WGRVCnk4QTg3VjRjbllsMXo2MUt3NllIV3hhSm11eWI5enRtbCtBRHQ5RVhOUXhDMExrdWcxSDBqdTl1MDlkU09YYlkKMHJxY2lINjYvSTh0MjlPZ3JwNkY0dit5eUNJUjZFQURRaktHTFVEWUlVSkZ4WXA0Y1pGcVA1aVJteGJ5Nkh3UwpDSE52TWNJZFZRRUNQMlg5R2c4Q0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQVXFsekhWZmlDd0xqalhPRmJJUUc3L0VxZ1hNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS1o4c0l4aXpsemx0aXRPcGcySgpYV0VUSThoeWxYNWx6cW1mV0dpZkdFVVduUDU3UEVtWW55eWJHbnZ5RlVDbnczTldMRTNrbEVMQVE4d0tLSG8rCnBZdXAzQlNYamdiWFovdWVJc2RhWlNucmVqNU1USlJ3SVFod250ZUtpU0J4MWFRVU01ZGdZc2c4SlpJY3I2WC8KRG5POGlHOGxmMXVxend1dUdHSHM2R1lNR0Mvd1V0czVvcm1GS291SmtSUWhBZElMVkNuaStYNCtmcHUzT21UNwprS3VmR0tyRVlKT09VL1c2YTB3OTRycU9iSS9Mem1GSWxJQnVNcXZWVDBwOGtlcTc1eklpdGNzaUJmYVVidng3Ci9sMGhvS1RqM0IrOGlwbktIWW4wNGZ1R2F2YVJRbEhWcldDVlZ4c3ZyYWpxOUdJNWJUUlJ6TnpTbzFlcTVZNisKRzVBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== server: https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-west-2.eks.amazonaws.com name: arn:aws:eks:us-east-1::cluster/ contexts: - context: cluster: arn:aws:eks:us-east-1::cluster/ user: arn:aws:eks:us-east-1::cluster/ name: arn:aws:eks:us-east-1::cluster/ current-context: arn:aws:eks:us-east-1::cluster/ kind: Config preferences: {} users: - name: arn:aws:eks:us-east-1::cluster/ user: exec: apiVersion: client.authentication.k8s.io/v1beta1 args: - --region - us-west-2 - --profile - - eks - get-token - --cluster-name - command: aws env: null interactiveMode: IfAvailable provideClusterInfo: false ```

Von AWS zu Kubernetes

Der Ersteller des EKS-Clusters wird IMMER Zugriff auf den Kubernetes-Cluster-Teil der Gruppe system:masters (k8s admin) haben. Zum Zeitpunkt dieses Schreibens gibt es keinen direkten Weg, um herauszufinden, wer den Cluster erstellt hat (Sie können CloudTrail überprüfen). Und es gibt keine Möglichkeit, dieses Privileg zu entfernen.

Der Weg, um mehr AWS IAM-Benutzern oder -Rollen Zugriff auf K8s zu gewähren, erfolgt über die Verwendung des Configmaps aws-auth.

Daher wird jeder mit Schreibzugriff auf den Config-Map aws-auth in der Lage sein, den gesamten Cluster zu kompromittieren.

Für weitere Informationen darüber, wie Sie zusätzliche Berechtigungen für IAM-Rollen & -Benutzer im gleichen oder anderen Konto gewähren und wie Sie dies zum privilege escalation überprüfen Sie diese Seite.

Schauen Sie sich auch diesen großartigen Beitrag an, um zu erfahren, wie die Authentifizierung IAM -> Kubernetes funktioniert.

Von Kubernetes zu AWS

Es ist möglich, eine OpenID-Authentifizierung für Kubernetes-Service-Konten zuzulassen, damit sie Rollen in AWS übernehmen können. Erfahren Sie, wie dies auf dieser Seite funktioniert.

Abrufen des API-Server-Endpunkts aus einem JWT-Token

https://<cluster-id>.<two-random-chars><number>.<region>.eks.amazonaws.com

Ich habe keine Dokumentation gefunden, die die Kriterien für die 'zwei Zeichen' und die 'Zahl' erklärt. Aber nach einigen Tests meinerseits sehe ich, dass diese wiederkehren:

  • gr7

  • yl4

Wie auch immer, da es nur 3 Zeichen sind, können wir sie per Bruteforce herausfinden. Verwenden Sie das untenstehende Skript, um die Liste zu generieren.

from itertools import product
from string import ascii_lowercase

letter_combinations = product('abcdefghijklmnopqrstuvwxyz', repeat = 2)
number_combinations = product('0123456789', repeat = 1)

result = [
f'{''.join(comb[0])}{comb[1][0]}'
for comb in product(letter_combinations, number_combinations)
]

with open('out.txt', 'w') as f:
f.write('\n'.join(result))

Dann mit wfuzz

wfuzz -Z -z file,out.txt --hw 0 https://<cluster-id>.FUZZ.<region>.eks.amazonaws.com

Denke daran, & zu ersetzen.

CloudTrail umgehen

Wenn ein Angreifer Anmeldeinformationen eines AWS mit Berechtigungen über ein EKS erhält. Wenn der Angreifer seinen eigenen kubeconfig konfiguriert (ohne update-kubeconfig aufzurufen), wie zuvor erklärt, generiert das get-token keine Logs in Cloudtrail, da es nicht mit der AWS-API interagiert (es erstellt nur das Token lokal).

Wenn der Angreifer also mit dem EKS-Cluster spricht, wird Cloudtrail nichts protokollieren, was mit dem gestohlenen Benutzer und dem Zugriff darauf zusammenhängt.

Beachten Sie, dass der EKS-Cluster möglicherweise aktiviert ist, um diese Zugriffe zu protokollieren (obwohl sie standardmäßig deaktiviert sind).

EKS Lösegeld?

Standardmäßig hat der Benutzer oder die Rolle, die einen Cluster erstellt hat, immer Admin-Berechtigungen über den Cluster. Und das ist der einzige "sichere" Zugriff, den AWS über den Kubernetes-Cluster hat.

Daher könnte ein Angreifer, der einen Cluster über Fargate kompromittiert und alle anderen Admins entfernt und den AWS-Benutzer/die Rolle löscht, die den Cluster erstellt hat, den Cluster erpressen.

Beachten Sie, dass, wenn der Cluster EC2-VMs verwendet, es möglich sein könnte, Admin-Berechtigungen vom Node zu erhalten und den Cluster wiederherzustellen.

Tatsächlich, wenn der Cluster Fargate verwendet, könnten Sie EC2-Nodes verwenden oder alles zu EC2 in den Cluster verschieben und ihn wiederherstellen, indem Sie auf die Tokens im Node zugreifen.

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

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated