Pentesting Kubernetes Services
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripci贸n!
- 脷nete al 馃挰 grupo de Discord o al grupo de telegram o s铆guenos en Twitter 馃惁 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Kubernetes utiliza varios servicios de red espec铆ficos que podr铆as encontrar expuestos a Internet o en una red interna una vez que hayas comprometido un pod.
Encontrar pods expuestos con OSINT
Una forma podr铆a ser buscar Identity LIKE "k8s.%.com" en crt.sh para encontrar subdominios relacionados con kubernetes. Otra forma podr铆a ser buscar "k8s.%.com" en github y buscar archivos YAML que contengan la cadena.
C贸mo Kubernetes expone servicios
Podr铆a ser 煤til para ti entender c贸mo Kubernetes puede exponer servicios p煤blicamente para poder encontrarlos:
Exposing Services in Kubernetes
Encontrar pods expuestos a trav茅s de escaneo de puertos
Los siguientes puertos podr铆an estar abiertos en un cl煤ster de Kubernetes:
| Puerto | Proceso | Descripci贸n |
|---|---|---|
| 443/TCP | kube-apiserver | Puerto API de Kubernetes |
| 2379/TCP | etcd | |
| 6666/TCP | etcd | etcd |
| 4194/TCP | cAdvisor | M茅tricas de contenedor |
| 6443/TCP | kube-apiserver | Puerto API de Kubernetes |
| 8443/TCP | kube-apiserver | Puerto API de Minikube |
| 8080/TCP | kube-apiserver | Puerto API inseguro |
| 10250/TCP | kubelet | API HTTPS que permite acceso en modo completo |
| 10255/TCP | kubelet | Puerto HTTP de solo lectura no autenticado: pods, pods en ejecuci贸n y estado del nodo |
| 10256/TCP | kube-proxy | Servidor de verificaci贸n de salud de Kube Proxy |
| 9099/TCP | calico-felix | Servidor de verificaci贸n de salud para Calico |
| 6782-4/TCP | weave | M茅tricas y puntos finales |
| 30000-32767/TCP | NodePort | Proxy a los servicios |
| 44134/TCP | Tiller | Servicio Helm escuchando |
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
Este es el servicio API de Kubernetes con el que los administradores suelen comunicarse utilizando la herramienta kubectl.
Puertos comunes: 6443 y 443, pero tambi茅n 8443 en minikube y 8080 como inseguro.
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
Consulta la siguiente p谩gina para aprender c贸mo obtener datos sensibles y realizar acciones sensibles hablando con este servicio:
API de Kubelet
Este servicio se ejecuta en cada nodo del cl煤ster. Es el servicio que controlar谩 los pods dentro del nodo. Se comunica con el kube-apiserver.
Si encuentras este servicio expuesto, podr铆as haber encontrado un RCE no autenticado.
API de Kubelet
curl -k https://<IP address>:10250/metrics
curl -k https://<IP address>:10250/pods
Si la respuesta es Unauthorized, entonces se requiere autenticaci贸n.
Si puedes listar nodos, puedes obtener una lista de los endpoints de kubelets 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 lectura)
curl -k https://<IP Address>:10255
http://<external-IP>:10255/pods
API de 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
Podr铆as abusar de este servicio para escalar privilegios dentro de Kubernetes:
cAdvisor
Servicio 煤til para recopilar m茅tricas.
curl -k https://<IP Address>:4194
NodePort
Cuando un puerto se expone en todos los nodos a trav茅s de un NodePort, el mismo puerto se abre en todos los nodos proxificando el tr谩fico hacia el Service declarado. Por defecto, este puerto estar谩 en el rango 30000-32767. Por lo tanto, los nuevos servicios no verificados podr铆an ser accesibles a trav茅s de esos puertos.
sudo nmap -sS -p 30000-32767 <IP>
Configuraciones Vulnerables
Acceso An贸nimo a Kube-apiserver
El acceso an贸nimo a los puntos finales de la API de kube-apiserver no est谩 permitido. Pero podr铆as verificar algunos puntos finales:

Verificando el Acceso An贸nimo a ETCD
El ETCD almacena los secretos del cl煤ster, archivos de configuraci贸n y m谩s datos sensibles. Por defecto, el ETCD no puede ser accedido an贸nimamente, pero siempre es bueno verificar.
Si el ETCD puede ser accedido an贸nimamente, es posible que necesites usar el etcdctl herramienta. El siguiente comando obtendr谩 todas las claves almacenadas:
etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only
Kubelet RCE
La documentaci贸n de Kubelet explica que por defecto se permite el acceso an贸nimo al servicio:
Habilita solicitudes an贸nimas al servidor Kubelet. Las solicitudes que no son rechazadas por otro m茅todo de autenticaci贸n se tratan como solicitudes an贸nimas. Las solicitudes an贸nimas tienen un nombre de usuario de
system:anonymous, y un nombre de grupo desystem:unauthenticated
Para entender mejor c贸mo funciona la autenticaci贸n y autorizaci贸n de la API de Kubelet, consulta esta p谩gina:
Kubelet Authentication & Authorization
La API del servicio Kubelet no est谩 documentada, pero el c贸digo fuente se puede encontrar aqu铆 y encontrar los endpoints expuestos es tan f谩cil como ejecutar:
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/").
Todos suenan interesantes.
Puedes usar la Kubeletctl herramienta para interactuar con Kubelets y sus endpoints.
/pods
Este endpoint lista pods y sus contenedores:
kubeletctl pods
/exec
Este endpoint permite ejecutar c贸digo dentro de cualquier contenedor muy f谩cilmente:
kubeletctl exec [command]
Note
Para evitar este ataque, el servicio kubelet debe ejecutarse con
--anonymous-auth falsey el servicio debe estar segregado a nivel de red.
Verificaci贸n de la Exposici贸n de Informaci贸n del Kubelet (Puerto Solo de Lectura)
Cuando un puerto de solo lectura del kubelet est谩 expuesto, se vuelve posible que partes no autorizadas recuperen informaci贸n de la API. La exposici贸n de este puerto puede llevar a la divulgaci贸n de varios elementos de configuraci贸n del cl煤ster. Aunque la informaci贸n, incluidos nombres de pods, ubicaciones de archivos internos y otras configuraciones, puede no ser cr铆tica, su exposici贸n sigue representando un riesgo de seguridad y debe evitarse.
Un ejemplo de c贸mo se puede explotar esta vulnerabilidad implica a un atacante remoto accediendo a una URL espec铆fica. Al navegar a http://<external-IP>:10255/pods, el atacante puede potencialmente recuperar informaci贸n sensible del kubelet:

Referencias
Kubernetes Pentest Methodology Part 2
https://labs.f-secure.com/blog/attacking-kubernetes-through-kubelet
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripci贸n!
- 脷nete al 馃挰 grupo de Discord o al grupo de telegram o s铆guenos en Twitter 馃惁 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
HackTricks Cloud

