GCP - Container Privesc
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)
container.clusters.get
Este permiso permite reunir credenciales para el clúster de Kubernetes usando algo como:
Sin permisos adicionales, las credenciales son bastante básicas ya que solo puedes listar algunos recursos, pero son útiles para encontrar configuraciones incorrectas en el entorno.
Ten en cuenta que los clústeres de kubernetes pueden estar configurados para ser privados, lo que impedirá el acceso al servidor Kube-API desde Internet.
Si no tienes este permiso, aún puedes acceder al clúster, pero necesitas crear tu propio archivo de configuración kubectl con la información de los clústeres. Uno generado recientemente se ve así:
container.roles.escalate
| container.clusterRoles.escalate
Kubernetes por defecto previene que los principales puedan crear o actualizar Roles y ClusterRoles con más permisos que los que el principal tiene. Sin embargo, un principal de GCP con esos permisos podrá crear/actualizar Roles/ClusterRoles con más permisos que los que poseía, eludiendo efectivamente la protección de Kubernetes contra este comportamiento.
container.roles.create
y/o container.roles.update
O container.clusterRoles.create
y/o container.clusterRoles.update
respectivamente son también necesarios para realizar esas acciones de escalada de privilegios.
container.roles.bind
| container.clusterRoles.bind
Kubernetes por defecto previene que los principales puedan crear o actualizar RoleBindings y ClusterRoleBindings para otorgar más permisos que los que el principal tiene. Sin embargo, un principal de GCP con esos permisos podrá crear/actualizar RoleBindings/ClusterRoleBindings con más permisos que los que tiene, eludiendo efectivamente la protección de Kubernetes contra este comportamiento.
container.roleBindings.create
y/o container.roleBindings.update
O container.clusterRoleBindings.create
y/o container.clusterRoleBindings.update
respectivamente también son necesarios para realizar esas acciones de escalada de privilegios.
container.cronJobs.create
| container.cronJobs.update
| container.daemonSets.create
| container.daemonSets.update
| container.deployments.create
| container.deployments.update
| container.jobs.create
| container.jobs.update
| container.pods.create
| container.pods.update
| container.replicaSets.create
| container.replicaSets.update
| container.replicationControllers.create
| container.replicationControllers.update
| container.scheduledJobs.create
| container.scheduledJobs.update
| container.statefulSets.create
| container.statefulSets.update
Todos estos permisos te permitirán crear o actualizar un recurso donde puedes definir un pod. Al definir un pod puedes especificar el SA que va a ser adjunto y la imagen que va a ser ejecutada, por lo tanto puedes ejecutar una imagen que va a exfiltrar el token del SA a tu servidor, permitiéndote escalar a cualquier cuenta de servicio. Para más información consulta:
Como estamos en un entorno de GCP, también podrás obtener el SA del nodepool de GCP del servicio de metadata y escalar privilegios en GCP (por defecto se utiliza el SA de cómputo).
container.secrets.get
| container.secrets.list
Como se explica en esta página, con estos permisos puedes leer los tokens de todos los SAs de kubernetes, por lo que puedes escalar a ellos.
container.pods.exec
Con este permiso podrás ejecutar comandos en pods, lo que te da acceso a todos los SAs de Kubernetes que se ejecutan en pods para escalar privilegios dentro de K8s, pero también podrás robar la Cuenta de Servicio de GCP del NodePool, escalando privilegios en GCP.
container.pods.portForward
Como se explica en esta página, con estos permisos puedes acceder a servicios locales que se ejecutan en pods que podrían permitirte escalar privilegios en Kubernetes (y en GCP si de alguna manera logras comunicarte con el servicio de metadata).
container.serviceAccounts.createToken
Debido al nombre del permiso, parece que te permitirá generar tokens de las Cuentas de Servicio de K8s, por lo que podrás escalar a cualquier SA dentro de Kubernetes. Sin embargo, no pude encontrar ningún endpoint de API para usarlo, así que házmelo saber si lo encuentras.
container.mutatingWebhookConfigurations.create
| container.mutatingWebhookConfigurations.update
Estos permisos podrían permitirte escalar privilegios en Kubernetes, pero más probablemente, podrías abusar de ellos para persistir en el clúster. Para más información sigue este enlace.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)