Pentesting Kubernetes Services

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert Red Team AWS de HackTricks)!

Autres façons de soutenir HackTricks :

Kubernetes utilise plusieurs services réseau spécifiques que vous pourriez trouver exposés sur Internet ou sur un réseau interne une fois que vous avez compromis un pod.

Recherche de pods exposés avec OSINT

Une façon pourrait être de rechercher Identity LIKE "k8s.%.com" dans crt.sh pour trouver des sous-domaines liés à Kubernetes. Une autre façon pourrait être de rechercher "k8s.%.com" sur GitHub et de rechercher des fichiers YAML contenant la chaîne.

Comment Kubernetes expose les services

Il pourrait être utile pour vous de comprendre comment Kubernetes peut exposer des services publiquement afin de les trouver :

pageExposing Services in Kubernetes

Recherche de pods exposés via un balayage de ports

Les ports suivants pourraient être ouverts dans un cluster Kubernetes :

PortProcessusDescription

443/TCP

kube-apiserver

Port de l'API Kubernetes

2379/TCP

etcd

6666/TCP

etcd

etcd

4194/TCP

cAdvisor

Métriques des conteneurs

6443/TCP

kube-apiserver

Port de l'API Kubernetes

8443/TCP

kube-apiserver

Port de l'API Minikube

8080/TCP

kube-apiserver

Port d'API non sécurisé

10250/TCP

kubelet

API HTTPS permettant un accès en mode complet

10255/TCP

kubelet

Port HTTP en lecture seule non authentifié : pods, pods en cours d'exécution et état du nœud

10256/TCP

kube-proxy

Serveur de vérification de l'état de santé de Kube Proxy

9099/TCP

calico-felix

Serveur de vérification de l'état de santé pour Calico

6782-4/TCP

weave

Métriques et points de terminaison

30000-32767/TCP

NodePort

Proxy vers les services

44134/TCP

Tiller

Service Helm en écoute

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

Il s'agit du service API Kubernetes avec lequel les administrateurs communiquent généralement en utilisant l'outil kubectl.

Ports courants : 6443 et 443, mais aussi 8443 dans minikube et 8080 en mode non sécurisé.

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

Consultez la page suivante pour apprendre comment obtenir des données sensibles et effectuer des actions sensibles en parlant à ce service :

pageKubernetes Enumeration

API Kubelet

Ce service s'exécute sur chaque nœud du cluster. C'est le service qui contrôlera les pods à l'intérieur du nœud. Il communique avec le kube-apiserver.

Si vous trouvez ce service exposé, vous pourriez avoir découvert une RCE non authentifiée.

API Kubelet

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

Si la réponse est Unauthorized, alors une authentification est requise.

Si vous pouvez répertorier les nœuds, vous pouvez obtenir une liste des points de terminaison des kubelets avec :

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 (Lecture seule)

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

Tiller

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

Vous pourriez abuser de ce service pour escalader les privilèges à l'intérieur de Kubernetes :

cAdvisor

Service utile pour collecter des métriques.

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

NodePort

Lorsqu'un port est exposé dans tous les nœuds via un NodePort, le même port est ouvert dans tous les nœuds pour acheminer le trafic vers le Service déclaré. Par défaut, ce port sera dans la plage 30000-32767. Ainsi, de nouveaux services non vérifiés pourraient être accessibles via ces ports.

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

Vulnérabilités de configuration incorrecte

Accès anonyme à Kube-apiserver

L'accès anonyme aux points d'API de kube-apiserver n'est pas autorisé. Cependant, vous pouvez vérifier certains points d'accès :

Vérification de l'accès anonyme à ETCD

ETCD stocke les secrets du cluster, les fichiers de configuration et d'autres données sensibles. Par défaut, l'ETCD ne peut pas être accédé anonymement, mais il est toujours bon de vérifier.

Si l'ETCD peut être accédé de manière anonyme, vous devrez peut-être utiliser l'outil etcdctl. La commande suivante récupérera toutes les clés stockées :

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

Kubelet RCE

La documentation de Kubelet explique que par défaut l'accès anonyme au service est autorisé :

Autorise les requêtes anonymes au serveur Kubelet. Les requêtes qui ne sont pas rejetées par un autre méthode d'authentification sont traitées comme des requêtes anonymes. Les requêtes anonymes ont un nom d'utilisateur system:anonymous, et un nom de groupe system:unauthenticated

Pour mieux comprendre comment l'authentification et l'autorisation de l'API Kuebelet fonctionnent, consultez cette page :

pageKubelet Authentication & Authorization

Le service Kubelet API n'est pas documenté, mais le code source peut être trouvé ici et trouver les points de terminaison exposés est aussi simple que d'exécuter:

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/").

Vous pouvez utiliser l'outil Kubeletctl pour interagir avec les Kubelets et leurs points de terminaison.

/pods

Cet endpoint répertorie les pods et leurs conteneurs :

kubeletctl pods

/exec

Cet endpoint permet d'exécuter du code à l'intérieur de n'importe quel conteneur très facilement :

kubeletctl exec [command]

Pour éviter cette attaque, le service kubelet doit être exécuté avec --anonymous-auth false et le service doit être séparé au niveau du réseau.

Vérification de l'exposition des informations du port en lecture seule de Kubelet

Lorsqu'un port en lecture seule de kubelet est exposé, il devient possible de récupérer des informations de l'API par des parties non autorisées. L'exposition de ce port peut entraîner la divulgation de divers éléments de configuration de cluster. Bien que les informations, y compris les noms des pods, les emplacements des fichiers internes et autres configurations, ne soient pas critiques, leur exposition représente tout de même un risque pour la sécurité et doit être évitée.

Un exemple de l'exploitation de cette vulnérabilité implique un attaquant distant accédant à une URL spécifique. En naviguant vers http://<external-IP>:10255/pods, l'attaquant peut potentiellement récupérer des informations sensibles du kubelet :

Références

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks :

Dernière mise à jour