Pentesting Kubernetes Services
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 encontrarlos:
Exposing Services in KubernetesEncontrar Pods Expuestos mediante escaneo de puertos
Los siguientes puertos podrían estar abiertos en un clúster de Kubernetes:
Puerto | Proceso | Descripció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 la API inseguro |
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
Kube-apiserver
Este es el servicio API 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.
Verifica la siguiente página para aprender cómo obtener datos sensibles y realizar acciones sensibles hablando con este servicio:
Kubernetes EnumerationAPI 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 encuentras este servicio expuesto, es posible que hayas encontrado un RCE sin autenticación.
API de Kubelet
Si la respuesta es Unauthorized
entonces requiere autenticación.
Si puedes listar nodos, puedes obtener una lista de puntos finales de kubelets con:
kubelet (Solo lectura)
API de etcd
Tiller
Puedes abusar de este servicio para escalar privilegios dentro de Kubernetes:
cAdvisor
Servicio útil para recopilar métricas.
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.
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 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 de forma anónima, es posible que necesites utilizar la herramienta etcdctl. El siguiente comando obtendrá todas las claves almacenadas:
RCE de Kubelet
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 gruposystem:unauthenticated
.
Para comprender mejor cómo funciona la autenticación y autorización de la API de Kubelet, consulta esta página:
Kubelet Authentication & AuthorizationEl servicio de Kubelet no tiene documentación de API, pero el código fuente se puede encontrar aquí y encontrar los puntos finales expuestos es tan fácil como ejecutar:
Puedes usar la herramienta Kubeletctl para interactuar con Kubelets y sus puntos finales.
/pods
Este punto final lista pods y sus contenedores:
/exec
Este endpoint permite ejecutar código dentro de cualquier contenedor de forma muy sencilla:
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 terceros no autorizados 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 que no sea crítica, su exposición sigue representando 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
Last updated