GCP - Containers & GKE Enum

Apoya a HackTricks

Contenedores

En los contenedores de GCP puedes encontrar la mayoría de los servicios basados en contenedores que GCP ofrece, aquí puedes ver cómo enumerar los más comunes:

gcloud container images list
gcloud container images list --repository us.gcr.io/<project-name> #Search in other subdomains repositories
gcloud container images describe <name>
gcloud container subnets list-usable
gcloud container clusters list
gcloud container clusters describe <name>
gcloud container clusters get-credentials [NAME]

# Run a container locally
docker run --rm -ti gcr.io/<project-name>/secret:v1 sh

# Login & Download
sudo docker login -u oauth2accesstoken -p $(gcloud auth print-access-token) https://HOSTNAME
## where HOSTNAME is gcr.io, us.gcr.io, eu.gcr.io, or asia.gcr.io.
sudo docker pull HOSTNAME/<project-name>/<image-name>

Privesc

En la siguiente página puedes verificar cómo abusar de los permisos de contenedor para escalar privilegios:

GCP - Container Privesc

Node Pools

Estos son los grupos de máquinas (nodos) que forman los clústeres de kubernetes.

# Pool of machines used by the cluster
gcloud container node-pools list --zone <zone> --cluster <cluster>
gcloud container node-pools describe --cluster <cluster> --zone <zone> <node-pool>

Kubernetes

Para obtener información sobre qué es Kubernetes, consulta esta página:

Kubernetes Pentesting

Primero, puedes verificar si existen clústeres de Kubernetes en tu proyecto.

gcloud container clusters list

Si tienes un clúster, puedes hacer que gcloud configure automáticamente tu archivo ~/.kube/config. Este archivo se utiliza para autenticarte cuando usas kubectl, la CLI nativa para interactuar con clústeres de K8s. Prueba este comando.

gcloud container clusters get-credentials [CLUSTER NAME] --region [REGION]

Luego, echa un vistazo al archivo ~/.kube/config para ver las credenciales generadas. Este archivo se utilizará para actualizar automáticamente los tokens de acceso basados en la misma identidad que está utilizando tu sesión activa de gcloud. Esto, por supuesto, requiere que se tengan los permisos correctos.

Una vez que esto esté configurado, puedes intentar el siguiente comando para obtener la configuración del clúster.

kubectl cluster-info

Puedes leer más sobre gcloud para contenedores aquí.

Este es un script simple para enumerar kubernetes en GCP: https://gitlab.com/gitlab-com/gl-security/security-operations/gl-redteam/gcp_k8s_enum

Escalación de privilegios de TLS Bootstrap

Inicialmente, esta técnica de escalación de privilegios permitía privesc dentro del clúster GKE, permitiendo efectivamente a un atacante comprometerlo completamente.

Esto se debe a que GKE proporciona credenciales de TLS Bootstrap en los metadatos, que son accesibles por cualquier persona al comprometer un pod.

La técnica utilizada se explica en las siguientes publicaciones:

Y esta herramienta fue creada para automatizar el proceso: https://github.com/4ARMED/kubeletmein

Sin embargo, la técnica abusó del hecho de que con las credenciales de metadatos era posible generar un CSR (Solicitud de Firma de Certificado) para un nuevo nodo, que fue aprobado automáticamente. En mi prueba verifiqué que esas solicitudes ya no son aprobadas automáticamente, así que no estoy seguro si esta técnica sigue siendo válida.

Secretos en la API de Kubelet

En esta publicación se descubrió una dirección de API de Kubelet accesible desde dentro de un pod en GKE que daba los detalles de los pods en ejecución:

curl -v -k http://10.124.200.1:10255/pods

Incluso si la API no permite modificar recursos, podría ser posible encontrar información sensible en la respuesta. El endpoint /pods fue encontrado usando Kiterunner.

Support HackTricks

Last updated