GCP - Container Privesc
container
container.clusters.get
container.clusters.get
Esta permissão permite coletar credenciais para o cluster Kubernetes usando algo como:
Sem permissões extras, as credenciais são bastante básicas, pois você pode apenas listar alguns recursos, mas são úteis para encontrar configurações incorretas no ambiente.
Note que os clusters do kubernetes podem estar configurados para serem privados, o que impedirá o acesso ao servidor Kube-API a partir da Internet.
Se você não tiver essa permissão, ainda poderá acessar o cluster, mas precisará criar seu próprio arquivo de configuração kubectl com as informações dos clusters. Um novo gerado se parece com isso:
container.roles.escalate
| container.clusterRoles.escalate
container.roles.escalate
| container.clusterRoles.escalate
Kubernetes por padrão impede que os principais possam criar ou atualizar Roles e ClusterRoles com mais permissões do que as que o principal possui. No entanto, um principal GCP com essas permissões será capaz de criar/atualizar Roles/ClusterRoles com mais permissões do que as que possui, efetivamente contornando a proteção do Kubernetes contra esse comportamento.
container.roles.create
e/ou container.roles.update
OU container.clusterRoles.create
e/ou container.clusterRoles.update
respectivamente também são necessários para realizar essas ações de escalonamento de privilégios.
container.roles.bind
| container.clusterRoles.bind
container.roles.bind
| container.clusterRoles.bind
Kubernetes por padrão impede que os principais possam criar ou atualizar RoleBindings e ClusterRoleBindings para conceder mais permissões do que as que o principal possui. No entanto, um principal GCP com essas permissões será capaz de criar/atualizar RoleBindings/ClusterRoleBindings com mais permissões do que as que possui, efetivamente contornando a proteção do Kubernetes contra esse comportamento.
container.roleBindings.create
e/ou container.roleBindings.update
OU container.clusterRoleBindings.create
e/ou container.clusterRoleBindings.update
respectivamente também são necessários para realizar essas ações de escalonamento de privilégios.
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
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
Todas essas permissões permitirão que você crie ou atualize um recurso onde você pode definir um pod. Definindo um pod, você pode especificar o SA que será anexado e a imagem que será executada, portanto, você pode executar uma imagem que irá exfiltrar o token do SA para o seu servidor, permitindo que você escale para qualquer conta de serviço. Para mais informações, consulte:
Como estamos em um ambiente GCP, você também poderá obter o SA do nodepool GCP do serviço de metadados e escalar privilégios no GCP (por padrão, o SA de computação é usado).
container.secrets.get
| container.secrets.list
container.secrets.get
| container.secrets.list
Como explicado nesta página, com essas permissões você pode ler os tokens de todos os SAs do Kubernetes, permitindo que você escale para eles.
container.pods.exec
container.pods.exec
Com essa permissão, você poderá executar dentro de pods, o que lhe dá acesso a todos os SAs do Kubernetes em execução em pods para escalar privilégios dentro do K8s, mas também você poderá roubar a Conta de Serviço GCP do NodePool, escalando privilégios no GCP.
container.pods.portForward
container.pods.portForward
Como explicado nesta página, com essas permissões você pode acessar serviços locais em execução em pods que podem permitir que você escalone privilégios no Kubernetes (e no GCP se de alguma forma você conseguir se comunicar com o serviço de metadados).
container.serviceAccounts.createToken
container.serviceAccounts.createToken
Por causa do nome da permissão, parece que permitirá gerar tokens das Contas de Serviço do K8s, então você poderá escalar para qualquer SA dentro do Kubernetes. No entanto, não consegui encontrar nenhum endpoint de API para usá-lo, então me avise se você encontrar.
container.mutatingWebhookConfigurations.create
| container.mutatingWebhookConfigurations.update
container.mutatingWebhookConfigurations.create
| container.mutatingWebhookConfigurations.update
Essas permissões podem permitir que você escale privilégios no Kubernetes, mas mais provavelmente, você poderia abusar delas para persistir no cluster. Para mais informações siga este link.
Last updated