Pentesting Kubernetes Services
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 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 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
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.
Consulte la siguiente página para aprender cómo obtener datos sensibles y realizar acciones sensibles hablando con este servicio:
pageKubernetes 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 encuentra este servicio expuesto, es posible que haya 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
Tiller es un componente de Kubernetes que gestiona los despliegues de Helm en el clúster.
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 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:
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 gruposystem:unauthenticated
.
Para comprender mejor cómo funciona la autenticación y autorización de la API de Kuebelet, consulte esta página:
pageKubelet Authentication & AuthorizationEl 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:
Puedes usar la herramienta Kubeletctl para interactuar con los Kubelets y sus puntos finales.
/pods
Este punto final lista los 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 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
Última actualización