Pentesting Kubernetes Services

Μάθετε το hacking του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

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

Εύρεση εκτεθειμένων pods με OSINT

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

Πώς εκθέτει ο Kubernetes τις υπηρεσίες

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

Exposing Services in Kubernetes

Εύρεση εκτεθειμένων pods μέσω ανίχνευσης θυρών

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

ΘύραΔιεργασίαΠεριγραφή

443/TCP

kube-apiserver

Θύρα API του Kubernetes

2379/TCP

etcd

6666/TCP

etcd

etcd

4194/TCP

cAdvisor

Μετρήσεις των containers

6443/TCP

kube-apiserver

Θύρα API του Kubernetes

8443/TCP

kube-apiserver

Θύρα API του Minikube

8080/TCP

kube-apiserver

Μη ασφαλής θύρα API

10250/TCP

kubelet

HTTPS API που επιτρέπει πλήρη πρόσβαση σε λειτουργία

10255/TCP

kubelet

Μη εξουσιοδοτημένη θύρα HTTP μόνο για ανάγνωση: pods, εκτελούμενα pods και κατάσταση κόμβου

10256/TCP

kube-proxy

Εξυπηρετητής ελέγχου υγείας του Kube Proxy

9099/TCP

calico-felix

Εξυπηρετητής ελέγχου υγείας για το Calico

6782-4/TCP

weave

Μετρήσεις και σημεία έναρξης

30000-32767/TCP

NodePort

Προϊστάμενος προς τις υπηρεσίες

44134/TCP

Tiller

Υπηρεσία Helm που ακούει

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

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

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

Kubelet API

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

Εάν η απόκριση είναι Unauthorized, τότε απαιτείται πιστοποίηση.

Εάν μπορείτε να καταλογίσετε τους κόμβους, μπορείτε να λάβετε μια λίστα με τα σημεία πρόσβασης των 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 (Μόνο για ανάγνωση)

The kubelet is the primary node agent that runs on each node in a Kubernetes cluster. It is responsible for managing the containers running on the node and ensuring their health and resource allocation.

Το kubelet είναι ο κύριος πράκτορας κόμβου που εκτελείται σε κάθε κόμβο ενός Kubernetes cluster. Είναι υπεύθυνο για τη διαχείριση των εκτελούμενων εμπορευμάτων στον κόμβο και για τη διασφάλιση της υγείας και της διάθεσης των πόρων τους.

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

etcd API

Η etcd API είναι μια διεπαφή προγραμματισμού εφαρμογών που χρησιμοποιείται για την αλληλεπίδραση με το etcd, ένα κλειδοθηκευτή κατανεμημένων συστημάτων. Το etcd χρησιμοποιείται συχνά σε περιβάλλοντα Kubernetes για την αποθήκευση και τον συγχρονισμό των δεδομένων ρυθμίσεων.

Με τη χρήση της etcd API, μπορείτε να διαχειριστείτε τα κλειδιά και τις τιμές του etcd, να δημιουργήσετε, να ενημερώσετε και να διαγράψετε δεδομένα. Επίσης, μπορείτε να παρακολουθείτε τις αλλαγές στα δεδομένα και να εκτελείτε διάφορες ενέργειες όπως ανάγνωση, εγγραφή και διαγραφή.

Η etcd API παρέχει επίσης ασφαλή μέσα επικοινωνίας με τη χρήση κρυπτογραφίας TLS. Αυτό εξασφαλίζει την ασφάλεια των δεδομένων που αποθηκεύονται και μεταδίδονται μέσω του etcd.

Για να χρησιμοποιήσετε την etcd API, μπορείτε να χρησιμοποιήσετε διάφορες βιβλιοθήκες προγραμματισμού, όπως η etcd-client για τη γλώσσα προγραμματισμού της επιλογής σας.

Είναι σημαντικό να είστε προσεκτικοί κατά τη χρήση της 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

Ο Tiller είναι ο διακομιστής του Helm, του εργαλείου διαχείρισης πακέτων για το Kubernetes. Ο Tiller είναι υπεύθυνος για την εγκατάσταση και τη διαχείριση των charts (πακέτων) στο Kubernetes cluster. Είναι σημαντικό να γίνει σωστή ρύθμιση και προστασία του Tiller για να αποφευχθούν πιθανές ευπάθειες ασφαλείας.

Ο Tiller χρησιμοποιεί το gRPC πρωτόκολλο για την επικοινωνία με τον Helm client. Αυτό σημαίνει ότι ο Tiller ακούει σε έναν προκαθορισμένο θύρα στο Kubernetes cluster και ανταλλάσσει μηνύματα με τον client. Είναι σημαντικό να προστατεύσετε τη θύρα αυτή και να περιορίσετε την πρόσβαση μόνο σε αξιόπιστους χρήστες.

Επιπλέον, ο Tiller χρησιμοποιεί έναν service account για να αλληλεπιδρά με το Kubernetes API. Αυτό το service account πρέπει να έχει τις ελάχιστες απαιτούμενες άδειες για να εκτελεί τις λειτουργίες που απαιτούνται από τον Tiller. Είναι σημαντικό να περιορίσετε τα προνόμια αυτού του service account και να μην του δώσετε περισσότερες απολύτως απαραίτητες δυνατότητες.

Τέλος, είναι σημαντικό να ελέγχετε την έκδοση του Tiller που χρησιμοποιείτε και να ενημερώνετε τακτικά σε νεότερες εκδόσεις που περιέχουν διορθώσεις ασφαλείας. Οι παλαιότερες εκδόσεις του Tiller μπορεί να έχουν γνωστές ευπάθειες που μπορούν να εκμεταλλευτούν οι επιτιθέμενοι.

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

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

cAdvisor

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

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

NodePort

Όταν ένας θύρα εκτίθεται σε όλους τους κόμβους μέσω ενός NodePort, η ίδια θύρα ανοίγεται σε όλους τους κόμβους προωθώντας την κίνηση στην δηλωμένη Υπηρεσία. Από προεπιλογή, αυτή η θύρα θα είναι στο εύρος 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.

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

Kubelet Authentication & Authorization

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

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 και τα σημεία τους.

/pods

Αυτό το σημείο ενδιαφέροντος εμφανίζει τα pods και τα containers τους:

kubeletctl pods

/exec

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

kubeletctl exec [command]

Για να αποφευχθεί αυτή η επίθεση, ο υπηρεσία 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

Αναφορές

Μάθετε το hacking στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated