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
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 más configurações 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 pode acessar o cluster, mas precisa 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
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 ele 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
Kubernetes por padrão impede que os principais possam criar ou atualizar RoleBindings e ClusterRoleBindings para dar 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 ele 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
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
Como explicado nesta página, com essas permissões você pode ler os tokens de todos os SAs do kubernetes, então você pode escalar para eles.
container.pods.exec
Com essa permissão, você poderá executar dentro de pods, o que lhe dá acesso a todos os SAs do Kubernetes executando 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
Como explicado nesta página, com essas permissões você pode acessar serviços locais executando 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
Por causa do nome da permissão, parece que permitirá gerar tokens das Contas de Serviço 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
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.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)