Pentesting Kubernetes Services
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
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.
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.
Podría ser útil para ti entender cómo Kubernetes puede exponer servicios públicamente para poder encontrarlos:
Exposing Services in KubernetesLos siguientes puertos podrían estar abiertos en un clúster de Kubernetes:
Port | Process | Description |
---|---|---|
443/TCP | kube-apiserver | Puerto de la API de Kubernetes |
2379/TCP | etcd | |
6666/TCP | etcd | etcd |
4194/TCP | cAdvisor | Métricas de contenedor |
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 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 |
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.
Consulta la siguiente página para aprender cómo obtener datos sensibles y realizar acciones sensibles hablando con este servicio:
Kubernetes EnumerationEste 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.
Si la respuesta es Unauthorized
, entonces requiere autenticación.
Si puedes listar nodos, puedes obtener una lista de los endpoints de kubelets con:
Podrías abusar de este servicio para escalar privilegios dentro de Kubernetes:
Servicio útil para recopilar métricas.
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.
El acceso anónimo a kube-apiserver API endpoints no está permitido. Pero puedes verificar algunos endpoints:
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:
La documentación de Kubelet explica que por defecto el acceso anónimo al servicio está permitido:
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 & AuthorizationLa 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:
Todos ellos suenan interesantes.
Puedes usar la herramienta Kubeletctl para interactuar con Kubelets y sus endpoints.
Este endpoint lista los pods y sus contenedores:
Este endpoint permite ejecutar código dentro de cualquier contenedor muy fácilmente:
Para evitar este ataque, el servicio kubelet debe ejecutarse con --anonymous-auth false
y el servicio debe estar segregado a nivel de red.
Cuando un puerto solo de 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 aún representa 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:
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)