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

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:

PuertoProcesoDescripci贸n
443/TCPkube-apiserverPuerto API de Kubernetes
2379/TCPetcd
6666/TCPetcdetcd
4194/TCPcAdvisorM茅tricas de contenedor
6443/TCPkube-apiserverPuerto API de Kubernetes
8443/TCPkube-apiserverPuerto API de Minikube
8080/TCPkube-apiserverPuerto API inseguro
10250/TCPkubeletAPI HTTPS que permite acceso en modo completo
10255/TCPkubeletPuerto HTTP de solo lectura no autenticado: pods, pods en ejecuci贸n y estado del nodo
10256/TCPkube-proxyServidor de verificaci贸n de salud de Kube Proxy
9099/TCPcalico-felixServidor de verificaci贸n de salud para Calico
6782-4/TCPweaveM茅tricas y puntos finales
30000-32767/TCPNodePortProxy a los servicios
44134/TCPTillerServicio 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:

Kubernetes Enumeration

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 de system: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 false y 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:

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

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