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:
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
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 se 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 podrías 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:
Permite 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 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:
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)