Pentesting Kubernetes Services

Support 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.

Finding exposed pods with 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.

How Kubernetes Exposes Services

Podría ser útil para ti entender cómo Kubernetes puede exponer servicios públicamente para poder encontrarlos:

Exposing Services in Kubernetes

Finding Exposed pods via port scanning

Los siguientes puertos podrían estar abiertos en un clúster de Kubernetes:

PortProcessDescription

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:

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 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>

Vulnerabilidades por Configuraciones Incorrectas

Acceso Anónimo a Kube-apiserver

El acceso anónimo a los endpoints de la API de kube-apiserver no está permitido. Pero puedes verificar algunos endpoints:

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 ellos suenan interesantes.

Puedes usar la herramienta Kubeletctl para interactuar con Kubelets y sus endpoints.

/pods

Este endpoint lista los pods y sus contenedores:

kubeletctl pods

/exec

Este endpoint permite ejecutar código dentro de cualquier contenedor muy fácilmente:

kubeletctl exec [command]

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:

Referencias

Apoya a HackTricks

Last updated