GCP - Container Privesc
Aprenda e pratique Hacking na AWS: Treinamento HackTricks AWS Red Team Expert (ARTE) Aprenda e pratique Hacking no GCP: Treinamento HackTricks GCP Red Team Expert (GRTE)
container
container.clusters.get
container.clusters.get
Essa 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 Kubernetes podem ser configurados para serem privados, o que impedirá o acesso ao servidor Kube-API pela 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 arquivo gerado se parece com isso:
container.roles.escalate
| container.clusterRoles.escalate
container.roles.escalate
| container.clusterRoles.escalate
Kubernetes por padrão impede que os princípios possam criar ou atualizar Funções e ClusterRoles com mais permissões do que as que o princípio possui. No entanto, um princípio do GCP com essas permissões será capaz de criar/atualizar Funções/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
container.roles.bind
| container.clusterRoles.bind
Kubernetes por padrão impede que os princípios possam criar ou atualizar RoleBindings e ClusterRoleBindings para conceder mais permissões do que as que o princípio possui. No entanto, um princípio do 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
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 vão permitir que você crie ou atualize um recurso onde você pode definir um pod. Ao definir um pod, você pode especificar o SA que será anexado e a imagem que será executada, portanto você pode executar uma imagem que vai extrair 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 do GCP, você também será capaz de obter o SA do nodepool do 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, então você pode escalar para eles.
container.pods.exec
container.pods.exec
Com essa permissão você será capaz de executar em pods, o que lhe dá acesso a todos os SAs do Kubernetes em execução nos pods para escalar privilégios dentro do K8s, mas também será capaz de roubar a Conta de Serviço do 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 pods que podem permitir que você escale 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
Devido ao nome da permissão, parece que ela permitirá que você gere tokens das Contas de Serviço do K8s, então você será capaz de 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.
Aprenda e pratique Hacking AWS:Treinamento HackTricks AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: Treinamento HackTricks GCP Red Team Expert (GRTE)
Last updated