AWS - EKS Post Exploitation

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (Ειδικός Red Team του HackTricks στο AWS)!

Άλλοι τρόποι υποστήριξης του HackTricks:

EKS

Για περισσότερες πληροφορίες ελέγξτε

AWS - EKS Enum

Απαριθμήστε το cluster από την κονσόλα του AWS

Αν έχετε την άδεια eks:AccessKubernetesApi μπορείτε να προβάλετε αντικείμενα Kubernetes μέσω της κονσόλας AWS EKS (Μάθετε περισσότερα).

Σύνδεση στο AWS Kubernetes Cluster

  • Εύκολος τρόπος:

# Generate kubeconfig
aws eks update-kubeconfig --name aws-eks-dev
  • Δεν είναι τόσο εύκολο:

Αν μπορείτε να αποκτήσετε ένα τεκμήριο με την εντολή aws eks get-token --name <cluster_name> αλλά δεν έχετε δικαιώματα να λάβετε πληροφορίες για το cluster (describeCluster), μπορείτε να προετοιμάσετε το δικό σας ~/.kube/config. Ωστόσο, έχοντας το τεκμήριο, χρειάζεστε ακόμα το url endpoint για σύνδεση (αν καταφέρατε να λάβετε ένα JWT τεκμήριο από ένα pod διαβάστε εδώ) και το όνομα του cluster.

Στην περίπτωσή μου, δεν βρήκα τις πληροφορίες στα CloudWatch logs, αλλά τις βρήκα στα userData των LaunchTemplates και επίσης στα EC2 μηχανήματα στα userData επίσης. Μπορείτε να δείτε αυτές τις πληροφορίες στο userData εύκολα, για παράδειγμα στο επόμενο παράδειγμα (το όνομα του cluster ήταν 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
Διαμόρφωση 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 ```

Από το AWS στο Kubernetes

Ο δημιουργός του EKS cluster θα έχει πάντα πρόσβαση στο τμήμα του kubernetes cluster της ομάδας system:masters (k8s admin). Προς το παρόν δεν υπάρχει άμεσος τρόπος να βρείτε ποιος δημιούργησε το cluster (μπορείτε να ελέγξετε το CloudTrail). Και δεν υπάρχει τρόπος να αφαιρέσετε αυτό το προνόμιο.

Ο τρόπος για να χορηγήσετε πρόσβαση στο K8s σε περισσότερους χρήστες ή ρόλους AWS IAM είναι μέσω του configmap aws-auth.

Συνεπώς, οποιοσδήποτε με δικαίωμα εγγραφής στο config map aws-auth θα μπορεί να θέσει σε κίνδυνο ολόκληρο το cluster.

Για περισσότερες πληροφορίες σχετικά με το πώς να χορηγήσετε επιπλέον προνόμια σε ρόλους & χρήστες IAM στο ίδιο ή διαφορετικό λογαριασμό και πώς να καταχραστείτε αυτό για έλεγχο προνομίων ελέγξτε αυτήν τη σελίδα.

Ελέγξτε επίσης αυτήν την εκπληκτική ανάρτηση για να μάθετε πώς λειτουργεί η πιστοποίηση IAM -> Kubernetes.

Από το Kubernetes στο AWS

Είναι δυνατόν να επιτραπεί μια ταυτοποίηση OpenID για λογαριασμό υπηρεσίας Kubernetes ώστε να τους επιτραπεί να υιοθετήσουν ρόλους στο AWS. Μάθετε πώς λειτουργεί αυτό σε αυτήν τη σελίδα.

Λήψη του Σημείου Τερματικού Api Server από ένα Διακριτικό JWT

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

Δεν βρέθηκε κάποια τεκμηρίωση που εξηγεί τα κριτήρια για τα 'two chars' και το 'number'. Ωστόσο, κάνοντας μερικές δοκιμές μόνος μου, βλέπω να επαναλαμβάνονται τα παρακάτω:

  • gr7

  • yl4

Πάντως, είναι μόνο 3 χαρακτήρες και μπορούμε να τους αναζητήσουμε με βία. Χρησιμοποιήστε το παρακάτω script για τη δημιουργία της λίστας.

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))

Στη συνέχεια με το wfuzz

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

Να θυμάστε να αντικαταστήσετε τα & .

Παράκαμψη του CloudTrail

Εάν ένας εισβολέας αποκτήσει διαπιστευτήρια ενός AWS με άδειες πάνω σε ένα EKS. Εάν ο εισβολέας διαμορφώσει το δικό του kubeconfig (χωρίς να καλέσει το update-kubeconfig) όπως εξηγήθηκε προηγουμένως, το get-token δεν δημιουργεί καταγραφές στο CloudTrail επειδή δεν αλληλεπιδρά με το AWS API (απλά δημιουργεί το token τοπικά).

Έτσι, όταν ο εισβολέας επικοινωνεί με το EKS cluster, το cloudtrail δεν καταγράφει τίποτα σχετικά με τον χρήστη που έχει κλαπεί και έχει πρόσβαση σε αυτό.

Να σημειωθεί ότι το EKS cluster μπορεί να έχει ενεργοποιημένα logs που θα καταγράφουν αυτήν την πρόσβαση (αν και, από προεπιλογή, είναι απενεργοποιημένα).

EKS Κατάχρηση;

Από προεπιλογή, ο χρήστης ή ρόλος που δημιούργησε ένα cluster θα έχει πάντα δικαιώματα διαχειριστή πάνω στο cluster. Και αυτή είναι η μοναδική "ασφαλής" πρόσβαση που θα έχει το AWS στο Kubernetes cluster.

Έτσι, εάν ένας εισβολέας διακινδυνεύει ένα cluster χρησιμοποιώντας fargate και αφαιρεί όλους τους άλλους διαχειριστές και διαγράφει τον AWS χρήστη/ρόλο που δημιούργησε το Cluster, ο εισβολέας θα μπορούσε να έχει ζητήσει λύτρα για το clusterr.

Να σημειωθεί ότι εάν το cluster χρησιμοποιούσε EC2 VMs, θα μπορούσε να είναι δυνατή η απόκτηση δικαιωμάτων διαχειριστή από τον Node και η ανάκτηση του cluster.

Πράγματι, εάν το cluster χρησιμοποιεί Fargate, θα μπορούσατε να χρησιμοποιήσετε τους κόμβους EC2 ή να μεταφέρετε τα πάντα σε EC2 στο cluster και να το ανακτήσετε έχοντας πρόσβαση στα τοκεν στον κόμβο.

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Last updated