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
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
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 :
| Port | Process | Description |
|---|---|---|
| 443/TCP | kube-apiserver | Port API Kubernetes |
| 2379/TCP | etcd | |
| 6666/TCP | etcd | etcd |
| 4194/TCP | cAdvisor | Métriques de conteneur |
| 6443/TCP | kube-apiserver | Port API Kubernetes |
| 8443/TCP | kube-apiserver | Port API Minikube |
| 8080/TCP | kube-apiserver | Port API non sécurisé |
| 10250/TCP | kubelet | API HTTPS qui permet 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 des nĆuds |
| 10256/TCP | kube-proxy | Serveur de vérification de santé Kube Proxy |
| 9099/TCP | calico-felix | Serveur de vérification 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 Ă 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 :
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 desystem: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 falseet 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 :

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
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

