Pentesting Kubernetes Services

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Το Kubernetes χρησιμοποιεί αρκετές συγκεκριμένες υπηρεσίες δικτύου που μπορεί να βρείτε εκτεθειμένες στο Διαδίκτυο ή σε ένα εσωτερικό δίκτυο μόλις έχετε παραβιάσει ένα pod.

Finding exposed pods with OSINT

Ένας τρόπος θα μπορούσε να είναι η αναζήτηση για Identity LIKE "k8s.%.com" στο crt.sh για να βρείτε υποτομείς σχετικούς με το kubernetes. Ένας άλλος τρόπος μπορεί να είναι η αναζήτηση "k8s.%.com" στο github και η αναζήτηση για YAML files που περιέχουν τη συμβολοσειρά.

How Kubernetes Exposes Services

Μπορεί να είναι χρήσιμο για εσάς να κατανοήσετε πώς το Kubernetes μπορεί να εκθέσει υπηρεσίες δημόσια προκειμένου να τις βρείτε:

Exposing Services in Kubernetes

Finding Exposed pods via port scanning

Οι παρακάτω θύρες μπορεί να είναι ανοιχτές σε ένα Kubernetes cluster:

PortProcessDescription
443/TCPkube-apiserverKubernetes API port
2379/TCPetcd
6666/TCPetcdetcd
4194/TCPcAdvisorContainer metrics
6443/TCPkube-apiserverKubernetes API port
8443/TCPkube-apiserverMinikube API port
8080/TCPkube-apiserverInsecure API port
10250/TCPkubeletHTTPS API which allows full mode access
10255/TCPkubeletUnauthenticated read-only HTTP port: pods, running pods and node state
10256/TCPkube-proxyKube Proxy health check server
9099/TCPcalico-felixHealth check server for Calico
6782-4/TCPweaveMetrics and endpoints
30000-32767/TCPNodePortProxy to the services
44134/TCPTillerHelm service listening

Nmap

nmap -n -T4 -p 443,2379,6666,4194,6443,8443,8080,10250,10255,10256,9099,6782-6784,30000-32767,44134 <pod_ipaddress>/16

Kube-apiserver

Αυτή είναι η υπηρεσία API Kubernetes με την οποία οι διαχειριστές επικοινωνούν συνήθως χρησιμοποιώντας το εργαλείο kubectl.

Κοινές θύρες: 6443 και 443, αλλά και 8443 στο minikube και 8080 ως ανασφαλής.

curl -k https://<IP Address>:(8|6)443/swaggerapi
curl -k https://<IP Address>:(8|6)443/healthz
curl -k https://<IP Address>:(8|6)443/api/v1

Ελέγξτε την παρακάτω σελίδα για να μάθετε πώς να αποκτήσετε ευαίσθητα δεδομένα και να εκτελέσετε ευαίσθητες ενέργειες επικοινωνώντας με αυτή την υπηρεσία:

Kubernetes Enumeration

Kubelet API

Αυτή η υπηρεσία τρέχει σε κάθε κόμβο του κλάστερ. Είναι η υπηρεσία που θα ελέγχει τα pods μέσα στον κόμβο. Επικοινωνεί με τον kube-apiserver.

Αν βρείτε αυτή την υπηρεσία εκτεθειμένη, μπορεί να έχετε βρει μια μη αυθεντικοποιημένη RCE.

Kubelet API

curl -k https://<IP address>:10250/metrics
curl -k https://<IP address>:10250/pods

Αν η απάντηση είναι Unauthorized, τότε απαιτείται αυθεντικοποίηση.

Αν μπορείτε να καταγράψετε τους κόμβους, μπορείτε να αποκτήσετε μια λίστα με τα endpoints kubelets με:

kubectl get nodes -o custom-columns='IP:.status.addresses[0].address,KUBELET_PORT:.status.daemonEndpoints.kubeletEndpoint.Port' | grep -v KUBELET_PORT | while IFS='' read -r node; do
ip=$(echo $node | awk '{print $1}')
port=$(echo $node | awk '{print $2}')
echo "curl -k --max-time 30 https://$ip:$port/pods"
echo "curl -k --max-time 30 https://$ip:2379/version" #Check  also for etcd
done

kubelet (Μόνο για ανάγνωση)

curl -k https://<IP Address>:10255
http://<external-IP>:10255/pods

etcd API

curl -k https://<IP address>:2379
curl -k https://<IP address>:2379/version
etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only

Tiller

helm --host tiller-deploy.kube-system:44134 version

Μπορείτε να καταχραστείτε αυτή την υπηρεσία για να κλιμακώσετε τα προνόμια μέσα στο Kubernetes:

cAdvisor

Υπηρεσία χρήσιμη για τη συλλογή μετρήσεων.

curl -k https://<IP Address>:4194

NodePort

Όταν μια θύρα εκτίθεται σε όλους τους κόμβους μέσω ενός NodePort, η ίδια θύρα ανοίγει σε όλους τους κόμβους προξενώντας την κίνηση στην δηλωμένη Service. Από προεπιλογή, αυτή η θύρα θα είναι στην εμβέλεια 30000-32767. Έτσι, νέες μη ελεγμένες υπηρεσίες μπορεί να είναι προσβάσιμες μέσω αυτών των θυρών.

sudo nmap -sS -p 30000-32767 <IP>

Ευάλωτες Καταχωρίσεις

Πρόσβαση Ανώνυμου Χρήστη στο Kube-apiserver

Η ανώνυμη πρόσβαση στα API endpoints του kube-apiserver δεν επιτρέπεται. Αλλά μπορείτε να ελέγξετε κάποια endpoints:

Έλεγχος για Ανώνυμη Πρόσβαση στο ETCD

Το ETCD αποθηκεύει τα μυστικά του cluster, τα αρχεία ρυθμίσεων και περισσότερα ευαίσθητα δεδομένα. Από προεπιλογή, το ETCD δεν μπορεί να προσπελαστεί ανώνυμα, αλλά είναι πάντα καλό να ελέγχετε.

Εάν το ETCD μπορεί να προσπελαστεί ανώνυμα, ίσως χρειαστεί να χρησιμοποιήσετε το etcdctl εργαλείο. Η παρακάτω εντολή θα αποκτήσει όλα τα κλειδιά που είναι αποθηκευμένα:

etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only

Kubelet RCE

Η τεκμηρίωση Kubelet εξηγεί ότι από προεπιλογή η ανώνυμη πρόσβαση στην υπηρεσία είναι επιτρεπτή:

Ενεργοποιεί ανώνυμες αιτήσεις στον διακομιστή Kubelet. Αιτήσεις που δεν απορρίπτονται από άλλη μέθοδο πιστοποίησης θεωρούνται ανώνυμες αιτήσεις. Οι ανώνυμες αιτήσεις έχουν όνομα χρήστη system:anonymous και όνομα ομάδας system:unauthenticated

Για να κατανοήσετε καλύτερα πώς λειτουργεί η πιστοποίηση και εξουσιοδότηση του Kubelet API, ελέγξτε αυτή τη σελίδα:

Kubelet Authentication & Authorization

Η υπηρεσία Kubelet API δεν είναι τεκμηριωμένη, αλλά ο πηγαίος κώδικας μπορεί να βρεθεί εδώ και η εύρεση των εκτεθειμένων σημείων πρόσβασης είναι τόσο εύκολη όσο το τρέξιμο:

curl -s https://raw.githubusercontent.com/kubernetes/kubernetes/master/pkg/kubelet/server/server.go | grep 'Path("/'

Path("/pods").
Path("/run")
Path("/exec")
Path("/attach")
Path("/portForward")
Path("/containerLogs")
Path("/runningpods/").

Όλοι τους ακούγονται ενδιαφέροντες.

Μπορείτε να χρησιμοποιήσετε το Kubeletctl εργαλείο για να αλληλεπιδράσετε με τα Kubelets και τα endpoints τους.

/pods

Αυτό το endpoint παραθέτει τα pods και τα containers τους:

kubeletctl pods

/exec

Αυτή η διεύθυνση επιτρέπει την εκτέλεση κώδικα μέσα σε οποιοδήποτε κοντέινερ πολύ εύκολα:

kubeletctl exec [command]

Note

Για να αποφευχθεί αυτή η επίθεση, η υπηρεσία kubelet θα πρέπει να εκτελείται με --anonymous-auth false και η υπηρεσία θα πρέπει να είναι διαχωρισμένη σε επίπεδο δικτύου.

Έλεγχος Έκθεσης Πληροφοριών Kubelet (Μόνο Ανάγνωση)

Όταν μια θύρα kubelet μόνο για ανάγνωση είναι εκτεθειμένη, καθίσταται δυνατή η ανάκτηση πληροφοριών από το API από μη εξουσιοδοτημένα μέρη. Η έκθεση αυτής της θύρας μπορεί να οδηγήσει στην αποκάλυψη διαφόρων στοιχείων διαμόρφωσης του cluster. Αν και οι πληροφορίες, συμπεριλαμβανομένων των ονόματων pod, τοποθεσιών εσωτερικών αρχείων και άλλων διαμορφώσεων, μπορεί να μην είναι κρίσιμες, η έκθεσή τους εξακολουθεί να θέτει σε κίνδυνο την ασφάλεια και θα πρέπει να αποφεύγεται.

Ένα παράδειγμα του πώς μπορεί να εκμεταλλευτεί αυτή η ευπάθεια περιλαμβάνει έναν απομακρυσμένο επιτιθέμενο που έχει πρόσβαση σε μια συγκεκριμένη διεύθυνση URL. Με την πλοήγηση στη διεύθυνση http://<external-IP>:10255/pods, ο επιτιθέμενος μπορεί δυνητικά να ανακτήσει ευαίσθητες πληροφορίες από το kubelet:

https://www.cyberark.com/wp-content/uploads/2019/09/KUbe-Pen-2-fig-6.png

Αναφορές

Kubernetes Pentest Methodology Part 2

https://labs.f-secure.com/blog/attacking-kubernetes-through-kubelet

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks