Kubernetes Enumeration
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)
Αν έχετε παραβιάσει την πρόσβαση σε μια μηχανή, ο χρήστης μπορεί να έχει πρόσβαση σε κάποια πλατφόρμα Kubernetes. Το token βρίσκεται συνήθως σε ένα αρχείο που υποδεικνύεται από την env var KUBECONFIG
ή μέσα στο ~/.kube
.
Σε αυτόν τον φάκελο μπορεί να βρείτε αρχεία ρυθμίσεων με tokens και ρυθμίσεις για σύνδεση με τον API server. Σε αυτόν τον φάκελο μπορείτε επίσης να βρείτε έναν φάκελο cache με πληροφορίες που έχουν ανακτηθεί προηγουμένως.
Αν έχετε παραβιάσει ένα pod μέσα σε ένα περιβάλλον kubernetes, υπάρχουν άλλα μέρη όπου μπορείτε να βρείτε tokens και πληροφορίες σχετικά με το τρέχον K8 env:
Πριν συνεχίσετε, αν δεν ξέρετε τι είναι μια υπηρεσία στο Kubernetes, θα σας πρότεινα να ακολουθήσετε αυτόν τον σύνδεσμο και να διαβάσετε τουλάχιστον τις πληροφορίες σχετικά με την αρχιτεκτονική του Kubernetes.
Λαμβάνοντας από την τεκμηρίωση:
“Όταν δημιουργείτε ένα pod, αν δεν καθορίσετε μια υπηρεσία, ανατίθεται αυτόματα η default υπηρεσία στην ίδια namespace.”
ServiceAccount είναι ένα αντικείμενο που διαχειρίζεται το Kubernetes και χρησιμοποιείται για να παρέχει μια ταυτότητα για τις διαδικασίες που εκτελούνται σε ένα pod. Κάθε service account έχει ένα μυστικό σχετικό με αυτό και αυτό το μυστικό περιέχει ένα bearer token. Αυτό είναι ένα JSON Web Token (JWT), μια μέθοδος για την ασφαλή αναπαράσταση αξιώσεων μεταξύ δύο μερών.
Συνήθως ένας από τους καταλόγους:
/run/secrets/kubernetes.io/serviceaccount
/var/run/secrets/kubernetes.io/serviceaccount
/secrets/kubernetes.io/serviceaccount
περιέχει τα αρχεία:
ca.crt: Είναι το ca πιστοποιητικό για να ελέγχει τις επικοινωνίες του kubernetes
namespace: Υποδεικνύει την τρέχουσα namespace
token: Περιέχει το service token του τρέχοντος pod.
Τώρα που έχετε το token, μπορείτε να βρείτε τον API server μέσα στη μεταβλητή περιβάλλοντος KUBECONFIG
. Για περισσότερες πληροφορίες εκτελέστε (env | set) | grep -i "kuber|kube
"
Το service account token υπογράφεται από το κλειδί που βρίσκεται στο αρχείο sa.key και επικυρώνεται από το sa.pub.
Προεπιλεγμένη τοποθεσία στο Kubernetes:
/etc/kubernetes/pki
Προεπιλεγμένη τοποθεσία στο Minikube:
/var/lib/localkube/certs
Hot pods είναι pods που περιέχουν ένα προνομιακό service account token. Ένα προνομιακό service account token είναι ένα token που έχει άδεια να εκτελεί προνομιακές εργασίες όπως η καταγραφή μυστικών, η δημιουργία pods, κ.λπ.
Αν δεν ξέρετε τι είναι το RBAC, διαβάστε αυτή την ενότητα.
k9s: Μια GUI που καταγράφει ένα kubernetes cluster από το τερματικό. Ελέγξτε τις εντολές στο https://k9scli.io/topics/commands/. Γράψτε :namespace
και επιλέξτε όλα για να αναζητήσετε πόρους σε όλες τις namespaces.
k8slens: Προσφέρει μερικές δωρεάν δοκιμαστικές ημέρες: https://k8slens.dev/
Για να καταγράψετε ένα περιβάλλον K8s χρειάζεστε μερικά από αυτά:
Ένα έγκυρο authentication token. Στην προηγούμενη ενότητα είδαμε πού να αναζητήσουμε ένα token χρήστη και ένα token service account.
Η διεύθυνση (https://host:port) του Kubernetes API. Αυτό μπορεί συνήθως να βρεθεί στις μεταβλητές περιβάλλοντος και/ή στο αρχείο kube config.
Προαιρετικό: Το ca.crt για να επαληθεύσετε τον API server. Αυτό μπορεί να βρεθεί στα ίδια μέρη όπου μπορεί να βρεθεί το token. Αυτό είναι χρήσιμο για να επαληθεύσετε το πιστοποιητικό του API server, αλλά χρησιμοποιώντας --insecure-skip-tls-verify
με kubectl
ή -k
με curl
δεν θα χρειαστείτε αυτό.
Με αυτές τις λεπτομέρειες μπορείτε να καταγράψετε το kubernetes. Αν ο API για κάποιο λόγο είναι προσβάσιμος μέσω του Internet, μπορείτε απλά να κατεβάσετε αυτές τις πληροφορίες και να καταγράψετε την πλατφόρμα από τη μηχανή σας.
Ωστόσο, συνήθως ο API server είναι μέσα σε ένα εσωτερικό δίκτυο, επομένως θα χρειαστεί να δημιουργήσετε ένα τούνελ μέσω της παραβιασμένης μηχανής για να έχετε πρόσβαση σε αυτό από τη μηχανή σας, ή μπορείτε να ανεβάσετε το kubectl δυαδικό αρχείο, ή να χρησιμοποιήσετε curl/wget/anything
για να εκτελέσετε ωμές HTTP αιτήσεις στον API server.
list
and get
verbsΜε get
δικαιώματα μπορείτε να αποκτήσετε πληροφορίες συγκεκριμένων περιουσιακών στοιχείων (describe
επιλογή στο kubectl
) API:
Αν έχετε την άδεια list
, σας επιτρέπεται να εκτελείτε API αιτήματα για να καταγράφετε έναν τύπο περιουσιακού στοιχείου (get
επιλογή στο kubectl
):
Αν έχετε την άδεια watch
, σας επιτρέπεται να εκτελείτε API αιτήματα για να παρακολουθείτε πόρους:
Ανοίγουν μια ροή σύνδεσης που σας επιστρέφει το πλήρες μανιφέστο μιας Ανάπτυξης όποτε αλλάζει (ή όταν δημιουργείται μια νέα).
Οι παρακάτω εντολές kubectl
υποδεικνύουν ακριβώς πώς να απαριθμήσετε τα αντικείμενα. Εάν θέλετε να αποκτήσετε πρόσβαση στα δεδομένα, πρέπει να χρησιμοποιήσετε το describe
αντί για το get
Από μέσα σε ένα pod μπορείτε να χρησιμοποιήσετε πολλές μεταβλητές περιβάλλοντος:
Από προεπιλογή, το pod μπορεί να πρόσβαση στον kube-api server στο όνομα τομέα kubernetes.default.svc
και μπορείτε να δείτε το kube δίκτυο στο /etc/resolv.config
καθώς εδώ θα βρείτε τη διεύθυνση του DNS server του kubernetes (το ".1" της ίδιας περιοχής είναι το kube-api endpoint).
Έχοντας το token και τη διεύθυνση του API server, χρησιμοποιείτε το kubectl ή το curl για να αποκτήσετε πρόσβαση σε αυτό όπως υποδεικνύεται εδώ:
Από προεπιλογή, ο APISERVER επικοινωνεί με το σχήμα https://
αν δεν υπάρχει
https://
στη διεύθυνση URL, μπορεί να λάβετε σφάλμα όπως Bad Request.
Μπορείτε να βρείτε ένα επίσημο cheatsheet για το kubectl εδώ. Ο στόχος των επόμενων τμημάτων είναι να παρουσιάσει με οργανωμένο τρόπο διάφορες επιλογές για να καταγράψετε και να κατανοήσετε το νέο K8s που έχετε αποκτήσει πρόσβαση.
Για να βρείτε το HTTP αίτημα που στέλνει το kubectl
, μπορείτε να χρησιμοποιήσετε την παράμετρο -v=8
Αν καταφέρατε να κλέψετε κάποια διαπιστευτήρια χρηστών, μπορείτε να τα ρυθμίσετε τοπικά χρησιμοποιώντας κάτι σαν:
Με αυτές τις πληροφορίες θα γνωρίζετε όλες τις υπηρεσίες που μπορείτε να καταγράψετε
Ένας άλλος τρόπος για να ελέγξετε τα δικαιώματά σας είναι να χρησιμοποιήσετε το εργαλείο: https://github.com/corneliusweig/rakkess****
Μπορείτε να μάθετε περισσότερα για το Kubernetes RBAC στο:
Μόλις γνωρίζετε ποια δικαιώματα έχετε, ελέγξτε την παρακάτω σελίδα για να καταλάβετε αν μπορείτε να τα εκμεταλλευτείτε για να κλιμακώσετε τα δικαιώματα:
Το Kubernetes υποστηρίζει πολλαπλούς εικονικούς κλάδους που υποστηρίζονται από τον ίδιο φυσικό κλάδο. Αυτοί οι εικονικοί κλάδοι ονομάζονται namespaces.
Αν μπορείτε να διαβάσετε μυστικά, μπορείτε να χρησιμοποιήσετε τις παρακάτω γραμμές για να αποκτήσετε τα δικαιώματα που σχετίζονται με κάθε token:
Όπως συζητήθηκε στην αρχή αυτής της σελίδας όταν εκτελείται ένα pod, συνήθως ανατίθεται ένας λογαριασμός υπηρεσίας σε αυτό. Επομένως, η καταγραφή των λογαριασμών υπηρεσιών, των δικαιωμάτων τους και πού εκτελούνται μπορεί να επιτρέψει σε έναν χρήστη να κλιμακώσει τα δικαιώματα.
Οι αναπτύξεις καθορίζουν τα συστατικά που πρέπει να εκτελούνται.
Τα Pods είναι τα πραγματικά δοχεία που θα τρέξουν.
Kubernetes υπηρεσίες χρησιμοποιούνται για να εκθέσουν μια υπηρεσία σε μια συγκεκριμένη θύρα και IP (η οποία θα λειτουργεί ως φορτωτής για τα pods που προσφέρουν πραγματικά την υπηρεσία). Αυτό είναι ενδιαφέρον για να γνωρίζετε πού μπορείτε να βρείτε άλλες υπηρεσίες για να προσπαθήσετε να επιτεθείτε.
Πάρε όλους τους κόμβους που είναι ρυθμισμένοι μέσα στο cluster.
DaeamonSets επιτρέπει να διασφαλιστεί ότι ένα συγκεκριμένο pod εκτελείται σε όλους τους κόμβους του κλάστερ (ή στους επιλεγμένους). Εάν διαγράψετε το DaemonSet, τα pods που διαχειρίζεται θα διαγραφούν επίσης.
Οι cron jobs επιτρέπουν τον προγραμματισμό της εκκίνησης ενός pod που θα εκτελέσει κάποια ενέργεια, χρησιμοποιώντας σύνταξη παρόμοια με αυτή του crontab.
Το configMap περιέχει πάντα πολλές πληροφορίες και αρχεία ρυθμίσεων που παρέχονται σε εφαρμογές που εκτελούνται στο kubernetes. Συνήθως μπορείτε να βρείτε πολλούς κωδικούς πρόσβασης, μυστικά, και tokens που χρησιμοποιούνται για τη σύνδεση και την επικύρωση με άλλες εσωτερικές/εξωτερικές υπηρεσίες.
Αν μπορείτε να δημιουργήσετε νέα pods, ίσως να μπορείτε να διαφύγετε από αυτά στο node. Για να το κάνετε αυτό, πρέπει να δημιουργήσετε ένα νέο pod χρησιμοποιώντας ένα αρχείο yaml, να μεταβείτε στο δημιουργηθέν pod και στη συνέχεια να chroot στο σύστημα του node. Μπορείτε να χρησιμοποιήσετε ήδη υπάρχοντα pods ως αναφορά για το αρχείο yaml, καθώς εμφανίζουν υπάρχουσες εικόνες και διαδρομές.
αν χρειάζεστε να δημιουργήσετε pod σε συγκεκριμένο κόμβο, μπορείτε να χρησιμοποιήσετε την παρακάτω εντολή για να αποκτήσετε ετικέτες στον κόμβο
k get nodes --show-labels
Συνήθως, οι kubernetes.io/hostname και node-role.kubernetes.io/master είναι καλές ετικέτες για επιλογή.
Στη συνέχεια, δημιουργείτε το αρχείο attack.yaml σας.
Μετά από αυτό δημιουργείτε το pod
Τώρα μπορείτε να μεταβείτε στο δημιουργημένο pod ως εξής
Και τελικά κάνετε chroot στο σύστημα του κόμβου
Information obtained from: Kubernetes Namespace Breakout using Insecure Host Path Volume — Part 1 Attacking and Defending Kubernetes: Bust-A-Kube – Episode 1
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)