Pentesting Kubernetes Services

Impara l'hacking AWS da zero a eroe con htARTE (Esperto Red Team AWS di HackTricks)!

Altri modi per supportare HackTricks:

Kubernetes utilizza diversi servizi di rete specifici che potresti trovare esposti su Internet o in una rete interna una volta 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:

pageExposing Services in Kubernetes

Trovare Pod Esposti tramite scansione delle porte

Le seguenti porte potrebbero essere aperte in un cluster Kubernetes:

PortProcessDescrizione

443/TCP

kube-apiserver

Porta API di Kubernetes

2379/TCP

etcd

6666/TCP

etcd

etcd

4194/TCP

cAdvisor

Metriche del container

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 l'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 salute di Kube Proxy

9099/TCP

calico-felix

Server di controllo dello stato di salute per Calico

6782-4/TCP

weave

Metriche e endpoint

30000-32767/TCP

NodePort

Proxy per i 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 parlano di solito utilizzando lo strumento kubectl.

Porte comuni: 6443 e 443, ma anche 8443 in minikube e 8080 come non sicuro.

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:

pageKubernetes Enumeration

API di Kubelet

Questo servizio viene eseguito in ogni nodo del cluster. È il servizio che controlla le pod all'interno del nodo. Comunica con il kube-apiserver.

Se trovi questo servizio esposto potresti aver trovato un RCE non autenticato.

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

Se la risposta è Unauthorized allora richiede autenticazione.

Se puoi elencare i nodi, puoi ottenere un elenco degli endpoint dei 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 (sola lettura)

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

API di 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

Puoi abusare di questo servizio per scalare i privilegi all'interno di Kubernetes:

cAdvisor

Servizio utile per raccogliere metriche.

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

NodePort

Quando una porta è esposta in tutti i nodi tramite un NodePort, la stessa porta viene aperta in tutti i nodi per instradare il traffico nel Servizio dichiarato. Per impostazione predefinita, questa porta sarà nell'intervallo 30000-32767. Quindi nuovi servizi non controllati potrebbero essere accessibili tramite tali porte.

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

Configurazioni vulnerabili

Accesso anonimo a Kube-apiserver

L'accesso anonimo agli endpoint dell'API kube-apiserver non è consentito. Tuttavia, potresti verificare alcuni endpoint:

Verifica dell'accesso anonimo a ETCD

ETCD memorizza i segreti del cluster, i file di configurazione e altri dati sensibili. Per default, l'ETCD non può essere accessibile in modo anonimo, ma è sempre bene verificare.

Se l'ETCD può essere accessibile in modo anonimo, potresti dover utilizzare lo strumento etcdctl. Il seguente comando otterrà tutte le chiavi memorizzate:

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

Kubelet RCE

La documentazione di Kubelet spiega che per default è consentito l'accesso anonimo al servizio:

Abilita le richieste anonime al server Kubelet. Le richieste che non vengono respinte da un altro metodo di autenticazione sono trattate come richieste anonime. Le richieste anonime hanno un nome utente system:anonymous e un nome gruppo system:unauthenticated

Per comprendere meglio come funziona l'autenticazione e l'autorizzazione dell'API di Kuebelet, controlla questa pagina:

pageKubelet Authentication & Authorization

Il servizio API di Kubelet non è documentato, ma il codice sorgente può essere trovato qui e trovare i punti finali esposti è semplice 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/").

Puoi utilizzare lo strumento Kubeletctl per interagire con i Kubelet e i loro endpoint.

/pods

Questo endpoint elenca i pods e i loro contenitori:

kubeletctl pods

/exec

Questo endpoint consente di eseguire facilmente del codice all'interno di qualsiasi container:

kubeletctl exec [command]

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 Porta di Lettura Kubelet (Read Only)

Quando una porta di lettura in sola lettura del kubelet è esposta, diventa possibile recuperare informazioni dall'API da parte di parti non autorizzate. L'esposizione di questa porta può portare alla divulgazione di vari elementi di configurazione del cluster. Anche se le informazioni, inclusi nomi dei pod, posizioni dei file interni e altre configurazioni, potrebbero 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 potrebbe potenzialmente recuperare informazioni sensibili dal kubelet:

References

Impara l'hacking su AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Last updated