Pentesting Kubernetes Services
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"
su 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 KubernetesTrovare 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 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 ai servizi |
44134/TCP | Tiller | Servizio Helm in ascolto |
Nmap
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.
Controlla la seguente pagina per imparare come ottenere dati sensibili e eseguire azioni sensibili parlando con questo servizio:
Kubernetes EnumerationAPI di Kubelet
Questo servizio viene eseguito 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 di Kubelet
Se la risposta è Non autorizzato
, allora richiede autenticazione.
Se puoi elencare i nodi, puoi ottenere un elenco degli endpoint dei kubelet con:
kubelet (sola lettura)
API di etcd
Tiller
Puoi abusare di questo servizio per scalare i privilegi all'interno di Kubernetes:
cAdvisor
Servizio utile per raccogliere metriche.
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à nel range 30000-32767. Quindi nuovi servizi non controllati potrebbero essere accessibili tramite tali porte.
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 comando seguente otterrà tutte le chiavi memorizzate:
RCE Kubelet
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 grupposystem:unauthenticated
Per comprendere meglio come funziona l'autenticazione e l'autorizzazione dell'API di Kubelet, controlla questa pagina:
Kubelet Authentication & AuthorizationIl servizio API di Kubelet non è documentato, ma il codice sorgente può essere trovato qui e trovare i punti finali esposti è semplice come eseguire:
Puoi utilizzare lo strumento Kubeletctl per interagire con i Kubelet e i loro endpoint.
/pods
Questo endpoint elenca i pods e i loro contenitori:
/exec
Questo endpoint consente di eseguire facilmente del codice all'interno di qualsiasi container:
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 di 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
Last updated