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)
Αν τρέχετε ένα k8s cluster μέσα στο GCP, πιθανότατα θα θέλετε κάποια εφαρμογή που τρέχει μέσα στο cluster να έχει πρόσβαση στο GCP. Υπάρχουν 2 κοινές μέθοδοι για να το κάνετε αυτό:
Μια κοινή μέθοδος για να δώσετε πρόσβαση σε μια εφαρμογή kubernetes στο GCP είναι να:
Δημιουργήσετε έναν GCP Service Account
Δεσμεύσετε τις επιθυμητές άδειες σε αυτόν
Κατεβάσετε ένα json key του δημιουργηθέντος SA
Τοποθετήσετε το ως μυστικό μέσα στο pod
Ορίσετε τη μεταβλητή περιβάλλοντος GOOGLE_APPLICATION_CREDENTIALS που δείχνει στο μονοπάτι όπου βρίσκεται το json.
Επομένως, ως επιτιθέμενος, αν παραβιάσετε ένα κοντέινερ μέσα σε ένα pod, θα πρέπει να ελέγξετε για αυτή τη μεταβλητή env και τα json αρχεία με τα διαπιστευτήρια GCP.
Μια μέθοδος για να δώσετε πρόσβαση σε έναν GSA σε ένα GKE cluster είναι να τους δεσμεύσετε με αυτόν τον τρόπο:
Δημιουργήστε έναν λογαριασμό υπηρεσίας Kubernetes στην ίδια περιοχή με το GKE cluster σας χρησιμοποιώντας την παρακάτω εντολή:
Δημιουργήστε ένα Kubernetes Secret που περιέχει τα διαπιστευτήρια του λογαριασμού υπηρεσίας GCP στον οποίο θέλετε να παραχωρήσετε πρόσβαση στο GKE cluster. Μπορείτε να το κάνετε αυτό χρησιμοποιώντας το εργαλείο γραμμής εντολών gcloud
, όπως φαίνεται στο παρακάτω παράδειγμα:
Δέστε το Kubernetes Secret στον λογαριασμό υπηρεσίας Kubernetes χρησιμοποιώντας την παρακάτω εντολή:
Στο δεύτερο βήμα ορίστηκαν τα διαπιστευτήρια του GSA ως μυστικό του KSA. Έτσι, αν μπορείτε να διαβάσετε αυτό το μυστικό από μέσα στο GKE cluster, μπορείτε να κλιμακώσετε σε αυτόν τον λογαριασμό υπηρεσίας GCP.
Με το Workload Identity, μπορούμε να διαμορφώσουμε έναν Kubernetes service account να λειτουργεί ως Google service account. Τα Pods που εκτελούνται με τον Kubernetes service account θα αυθεντικοποιούνται αυτόματα ως ο Google service account όταν έχουν πρόσβαση σε Google Cloud APIs.
Η πρώτη σειρά βημάτων για να ενεργοποιηθεί αυτή η συμπεριφορά είναι να ενεργοποιήσετε το Workload Identity στο GCP (βήματα) και να δημιουργήσετε τον GCP SA που θέλετε να προσποιείται το k8s.
Ενεργοποιήστε το Workload Identity σε ένα νέο cluster
Δημιουργία/Ενημέρωση ενός νέου nodepool (Τα Autopilot clusters δεν χρειάζονται αυτό)
Δημιουργήστε τον Λογαριασμό Υπηρεσίας GCP για προσποίηση από το K8s με δικαιώματα GCP:
Συνδεθείτε με το cluster και δημιουργήστε τον λογαριασμό υπηρεσίας για χρήση
Σύνδεση του GSA με το KSA
Εκτελέστε ένα pod με το KSA και ελέγξτε την πρόσβαση στο GSA:
Ελέγξτε την παρακάτω εντολή για αυθεντικοποίηση σε περίπτωση που χρειαστεί:
Ως επιτιθέμενος μέσα στο K8s θα πρέπει να αναζητήσετε SAs με την iam.gke.io/gcp-service-account
annotation καθώς αυτό υποδηλώνει ότι ο SA μπορεί να έχει πρόσβαση σε κάτι στο GCP. Μια άλλη επιλογή θα ήταν να προσπαθήσετε να εκμεταλλευτείτε κάθε KSA στο cluster και να ελέγξετε αν έχει πρόσβαση.
Από το GCP είναι πάντα ενδιαφέρον να απαριθμήσετε τους δεσμούς και να γνωρίζετε ποια πρόσβαση δίνετε σε SAs μέσα στο Kubernetes.
This is a script to easily iterate over the all the pods definitions looking for that annotation:
Μια (παρωχημένη) μέθοδος για να δώσετε IAM Ρόλους σε Pods είναι να χρησιμοποιήσετε έναν Kiam ή έναν Kube2IAM διακομιστή. Βασικά, θα χρειαστεί να εκτελέσετε ένα daemonset στο cluster σας με έναν τύπο προνομιακού IAM ρόλου. Αυτό το daemonset θα είναι αυτό που θα δώσει πρόσβαση σε IAM ρόλους στα pods που το χρειάζονται.
Πρώτα απ' όλα, πρέπει να ρυθμίσετε ποιοι ρόλοι μπορούν να προσπελαστούν μέσα στο namespace, και το κάνετε αυτό με μια αναφορά μέσα στο αντικείμενο namespace:
Μόλις το namespace είναι ρυθμισμένο με τους ρόλους IAM που μπορούν να έχουν τα Pods, μπορείτε να υποδείξετε τον ρόλο που θέλετε σε κάθε ορισμό pod με κάτι σαν:
Ως επιτιθέμενος, αν βρείτε αυτές τις αναφορές σε pods ή namespaces ή έναν server kiam/kube2iam που τρέχει (πιθανώς στο kube-system) μπορείτε να παριστάνετε κάθε ρόλο που ήδη χρησιμοποιείται από pods και περισσότερα (αν έχετε πρόσβαση στον λογαριασμό AWS, καταγράψτε τους ρόλους).
Ο IAM ρόλος που πρέπει να υποδειχθεί πρέπει να είναι στον ίδιο λογαριασμό AWS με τον ρόλο kiam/kube2iam και αυτός ο ρόλος πρέπει να μπορεί να έχει πρόσβαση σε αυτόν.
Αυτή είναι η συνιστώμενη μέθοδος από την AWS.
Πρώτα απ' όλα, πρέπει να δημιουργήσετε έναν πάροχο OIDC για το cluster.
Στη συνέχεια, δημιουργείτε έναν IAM ρόλο με τις άδειες που θα απαιτεί η SA.
Δημιουργήστε μια σχέση εμπιστοσύνης μεταξύ του IAM ρόλου και της SA ονόματος (ή των namespaces που δίνουν πρόσβαση στον ρόλο σε όλες τις SAs του namespace). Η σχέση εμπιστοσύνης θα ελέγξει κυρίως το όνομα του παρόχου OIDC, το όνομα του namespace και το όνομα της SA.
Τέλος, δημιουργήστε μια SA με μια σημείωση που υποδεικνύει το ARN του ρόλου, και τα pods που εκτελούνται με αυτή τη SA θα έχουν πρόσβαση στο token του ρόλου. Το token είναι γραμμένο μέσα σε ένα αρχείο και η διαδρομή καθορίζεται στο AWS_WEB_IDENTITY_TOKEN_FILE
(προεπιλογή: /var/run/secrets/eks.amazonaws.com/serviceaccount/token
)
Για να πάρετε το aws χρησιμοποιώντας το token από το /var/run/secrets/eks.amazonaws.com/serviceaccount/token
, εκτελέστε:
Ως επιτιθέμενος, αν μπορείτε να καταγράψετε ένα K8s cluster, ελέγξτε για λογαριασμούς υπηρεσιών με αυτή την αναφορά για να κλιμακώσετε σε AWS. Για να το κάνετε αυτό, απλά exec/create ένα pod χρησιμοποιώντας έναν από τους IAM προνομιακούς λογαριασμούς υπηρεσιών και κλέψτε το token.
Επιπλέον, αν βρίσκεστε μέσα σε ένα pod, ελέγξτε για μεταβλητές περιβάλλοντος όπως AWS_ROLE_ARN και AWS_WEB_IDENTITY_TOKEN.
Μερικές φορές η πολιτική εμπιστοσύνης ενός ρόλου μπορεί να είναι κακώς διαμορφωμένη και αντί να δίνει πρόσβαση AssumeRole στον αναμενόμενο λογαριασμό υπηρεσίας, την δίνει σε όλους τους λογαριασμούς υπηρεσιών. Επομένως, αν μπορείτε να γράψετε μια αναφορά σε έναν ελεγχόμενο λογαριασμό υπηρεσίας, μπορείτε να αποκτήσετε πρόσβαση στον ρόλο.
Ελέγξτε την παρακάτω σελίδα για περισσότερες πληροφορίες:
Αυτό είναι ένα σενάριο για να επικοινωνήσετε εύκολα με όλα τα pods και τις ορισμούς sas αναζητώντας αυτή την αναφορά:
Η προηγούμενη ενότητα αφορούσε το πώς να κλέψετε IAM Roles με pods, αλλά σημειώστε ότι ένα Node του K8s cluster θα είναι μια περίπτωση μέσα στο cloud. Αυτό σημαίνει ότι το Node είναι πολύ πιθανό να έχει έναν νέο IAM ρόλο που μπορείτε να κλέψετε (σημειώστε ότι συνήθως όλα τα nodes ενός K8s cluster θα έχουν τον ίδιο IAM ρόλο, οπότε μπορεί να μην αξίζει να προσπαθήσετε να ελέγξετε κάθε node).
Υπάρχει ωστόσο μια σημαντική απαίτηση για να αποκτήσετε πρόσβαση στο metadata endpoint από το node, πρέπει να είστε στο node (ssh session;) ή τουλάχιστον να έχετε το ίδιο δίκτυο:
Προηγουμένως έχουμε συζητήσει πώς να συνδέσουμε IAM Roles σε Pods ή ακόμα και πώς να διαφύγουμε στον Node για να κλέψουμε το IAM Role που έχει συνημμένο η παρουσία.
Μπορείτε να χρησιμοποιήσετε το παρακάτω σενάριο για να κλέψετε τα νέα σκληρά κερδισμένα διαπιστευτήρια IAM role σας:
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)