Pentesting Kubernetes Services

Support HackTricks

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.

Finding exposed pods with 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.

How Kubernetes Exposes Services

Potrebbe esserti utile capire come Kubernetes può esporre servizi pubblicamente per trovarli:

Exposing Services in Kubernetes

Finding Exposed pods via port scanning

Le seguenti porte potrebbero essere aperte in un cluster Kubernetes:

PortProcessDescription

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 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 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:

Kubernetes Enumeration

API Kubelet

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.

API Kubelet

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 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 (Solo lettura)

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

Potresti abusare di questo servizio per escalare 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 è aperta in tutti i nodi, proiettando il traffico nel Service dichiarato. Per impostazione predefinita, questa porta sarà nell'intervallo 30000-32767. Quindi, nuovi servizi non controllati potrebbero essere accessibili tramite quelle porte.

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 di system: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 utilizzare lo strumento Kubeletctl per interagire con i Kubelet e i loro endpoint.

/pods

Questo endpoint elenca i pod e i loro contenitori:

kubeletctl pods

/exec

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

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

Supporta HackTricks

Last updated