Pentesting Kubernetes Services

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks

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

Trouver des 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 chercher des fichiers YAML contenant la chaĂźne.

Comment Kubernetes expose des services

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

Exposing Services in Kubernetes

Trouver des pods exposés via le scan de ports

Les ports suivants pourraient ĂȘtre ouverts dans un cluster Kubernetes :

PortProcessDescription
443/TCPkube-apiserverPort API Kubernetes
2379/TCPetcd
6666/TCPetcdetcd
4194/TCPcAdvisorMétriques de conteneur
6443/TCPkube-apiserverPort API Kubernetes
8443/TCPkube-apiserverPort API Minikube
8080/TCPkube-apiserverPort API non sécurisé
10250/TCPkubeletAPI HTTPS qui permet un accĂšs en mode complet
10255/TCPkubeletPort HTTP en lecture seule non authentifiĂ© : pods, pods en cours d’exĂ©cution et Ă©tat des nƓuds
10256/TCPkube-proxyServeur de vérification de santé Kube Proxy
9099/TCPcalico-felixServeur de vérification de santé pour Calico
6782-4/TCPweaveMétriques et points de terminaison
30000-32767/TCPNodePortProxy vers les services
44134/TCPTillerService Helm Ă  l’é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

C’est le service API Kubernetes avec lequel les administrateurs communiquent gĂ©nĂ©ralement en utilisant l’outil kubectl.

Ports communs : 6443 et 443, mais aussi 8443 dans minikube et 8080 comme 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

Vérifiez la page suivante pour apprendre comment obtenir des données sensibles et effectuer des actions sensibles en communiquant avec ce service :

Kubernetes Enumeration

API Kubelet

Ce service s’exĂ©cute sur chaque nƓud du cluster. C’est le service qui va contrĂŽler les pods Ă  l’intĂ©rieur du nƓud. Il communique avec le kube-apiserver.

Si vous trouvez ce service exposé, vous pourriez avoir trouvé un RCE non authentifié.

API Kubelet

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

Si la réponse est Unauthorized, cela nécessite une authentification.

Si vous pouvez lister les nƓuds, vous pouvez obtenir une liste des points de terminaison 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

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

Vous pourriez abuser de ce service pour Ă©lever les privilĂšges Ă  l’intĂ©rieur de Kubernetes :

cAdvisor

Service utile pour recueillir des métriques.

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

NodePort

Lorsqu’un port est exposĂ© sur tous les nƓuds via un NodePort, le mĂȘme port est ouvert sur tous les nƓuds, proxifiant 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>

Configurations vulnérables

AccĂšs anonyme Ă  Kube-apiserver

L’accĂšs anonyme aux points de terminaison de l’API kube-apiserver n’est pas autorisĂ©. Mais vous pouvez vĂ©rifier certains points de terminaison :

VĂ©rification de l’accĂšs anonyme Ă  ETCD

L’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 accessible anonymement, mais il est toujours bon de vĂ©rifier.

Si l’ETCD peut ĂȘtre accessible anonymement, 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 qu’en default, l’accĂšs anonyme au service est autorisĂ© :

Permet les requĂȘtes anonymes au serveur Kubelet. Les requĂȘtes qui ne sont pas rejetĂ©es par une autre mĂ©thode d’authentification sont traitĂ©es comme des requĂȘtes anonymes. Les requĂȘtes anonymes ont un nom d’utilisateur de system:anonymous, et un nom de groupe de system:unauthenticated

Pour mieux comprendre comment fonctionne l’authentification et l’autorisation de l’API Kubelet, consultez cette page :

Kubelet Authentication & Authorization

L’API du service Kubelet n’est pas documentĂ©e, 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/").

Tous semblent intéressants.

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

/pods

Ce point de terminaison liste les pods et leurs conteneurs :

kubeletctl pods

/exec

Ce point de terminaison permet d’exĂ©cuter du code Ă  l’intĂ©rieur de n’importe quel conteneur trĂšs facilement :

kubeletctl exec [command]

Note

Pour Ă©viter cette attaque, le service kubelet doit ĂȘtre exĂ©cutĂ© avec --anonymous-auth false et le service doit ĂȘtre segregĂ© au niveau du rĂ©seau.

VĂ©rification de l’exposition des informations du Kubelet (Port en lecture seule)

Lorsqu’un port en lecture seule du kubelet est exposĂ©, il devient possible pour des parties non autorisĂ©es de rĂ©cupĂ©rer des informations de l’API. L’exposition de ce port peut conduire Ă  la divulgation de divers Ă©lĂ©ments de configuration du cluster. Bien que les informations, y compris les noms des pods, les emplacements des fichiers internes et d’autres configurations, ne soient pas critiques, leur exposition pose nĂ©anmoins un risque pour la sĂ©curitĂ© et doit ĂȘtre Ă©vitĂ©e.

Un exemple de la façon dont cette vulnĂ©rabilitĂ© peut ĂȘtre exploitĂ©e 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 :

https://www.cyberark.com/wp-content/uploads/2019/09/KUbe-Pen-2-fig-6.png

Références

Kubernetes Pentest Methodology Part 2

https://labs.f-secure.com/blog/attacking-kubernetes-through-kubelet

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks