Kubernetes Pivoting to Clouds
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)
Se você estiver executando um cluster k8s dentro do GCP, provavelmente desejará que algum aplicativo em execução dentro do cluster tenha acesso ao GCP. Existem 2 maneiras comuns de fazer isso:
Uma maneira comum de dar acesso a um aplicativo kubernetes ao GCP é:
Criar uma Conta de Serviço do GCP
Vincular as permissões desejadas
Baixar uma chave json da SA criada
Montá-la como um segredo dentro do pod
Definir a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS apontando para o caminho onde o json está.
Portanto, como um atacante, se você comprometer um contêiner dentro de um pod, deve verificar essa variável env e arquivos json com credenciais do GCP.
Uma maneira de dar acesso a um GSA a um cluster GKE é vinculá-los desta forma:
Criar uma conta de serviço Kubernetes no mesmo namespace que seu cluster GKE usando o seguinte comando:
Crie um Kubernetes Secret que contenha as credenciais da conta de serviço GCP à qual você deseja conceder acesso ao cluster GKE. Você pode fazer isso usando a ferramenta de linha de comando gcloud
, conforme mostrado no exemplo a seguir:
Vincule o Kubernetes Secret à conta de serviço do Kubernetes usando o seguinte comando:
No segundo passo, foram configuradas as credenciais do GSA como segredo do KSA. Então, se você puder ler esse segredo de dentro do cluster GKE, você pode escalar para essa conta de serviço GCP.
Com a Identidade de Trabalho, podemos configurar uma conta de serviço Kubernetes para agir como uma conta de serviço Google. Pods executando com a conta de serviço Kubernetes se autenticarão automaticamente como a conta de serviço Google ao acessar APIs do Google Cloud.
A primeira série de passos para habilitar esse comportamento é habilitar a Identidade de Trabalho no GCP (passos) e criar a SA GCP que você deseja que o k8s impersonifique.
Habilitar a Identidade de Trabalho em um novo cluster
Criar/Atualizar um novo nodepool (clusters Autopilot não precisam disso)
Crie a Conta de Serviço GCP para se passar do K8s com permissões GCP:
Conecte-se ao cluster e crie a conta de serviço para usar
Vincular o GSA com o KSA
Execute um pod com o KSA e verifique o acesso ao GSA:
Verifique o seguinte comando para autenticar, caso necessário:
Como um atacante dentro do K8s, você deve procurar por SAs com a anotação iam.gke.io/gcp-service-account
, pois isso indica que a SA pode acessar algo no GCP. Outra opção seria tentar abusar de cada KSA no cluster e verificar se ela tem acesso.
Do GCP, é sempre interessante enumerar as vinculações e saber quais acessos você está concedendo às SAs dentro do Kubernetes.
Este é um script para facilmente iterar sobre todas as definições de pods procurando por essa anotação:
Uma maneira (ultrapassada) de dar funções IAM para Pods é usar um Kiam ou um Kube2IAM servidor. Basicamente, você precisará executar um daemonset em seu cluster com um tipo de função IAM privilegiada. Este daemonset será o responsável por conceder acesso às funções IAM para os pods que precisarem.
Primeiramente, você precisa configurar quais funções podem ser acessadas dentro do namespace, e você faz isso com uma anotação dentro do objeto namespace:
Uma vez que o namespace está configurado com os papéis IAM que os Pods podem ter, você pode indicar o papel que deseja em cada definição de pod com algo como:
Como um atacante, se você encontrar essas anotações em pods ou namespaces ou um servidor kiam/kube2iam em execução (provavelmente no kube-system), você pode impersonar todos os roles que já estão sendo usados por pods e mais (se você tiver acesso à conta AWS, enumere os roles).
O role IAM a ser indicado deve estar na mesma conta AWS que o role kiam/kube2iam e esse role deve ser capaz de acessá-lo.
Esta é a maneira recomendada pela AWS.
Primeiro, você precisa criar um provedor OIDC para o cluster.
Em seguida, você cria uma função IAM com as permissões que o SA precisará.
Crie uma relação de confiança entre a função IAM e o SA nome (ou os namespaces que dão acesso à função para todos os SAs do namespace). A relação de confiança verificará principalmente o nome do provedor OIDC, o nome do namespace e o nome do SA.
Finalmente, crie um SA com uma anotação indicando o ARN da função, e os pods executando com esse SA terão acesso ao token da função. O token é escrito dentro de um arquivo e o caminho é especificado em AWS_WEB_IDENTITY_TOKEN_FILE
(padrão: /var/run/secrets/eks.amazonaws.com/serviceaccount/token
)
Para obter aws usando o token de /var/run/secrets/eks.amazonaws.com/serviceaccount/token
, execute:
Como um atacante, se você puder enumerar um cluster K8s, verifique as contas de serviço com essa anotação para escalar para AWS. Para fazer isso, basta exec/criar um pod usando uma das contas de serviço privilegiadas do IAM e roubar o token.
Além disso, se você estiver dentro de um pod, verifique variáveis de ambiente como AWS_ROLE_ARN e AWS_WEB_IDENTITY_TOKEN.
Às vezes, a Política de Confiança de um papel pode estar mal configurada e, em vez de dar acesso AssumeRole à conta de serviço esperada, ela dá acesso a todas as contas de serviço. Portanto, se você for capaz de escrever uma anotação em uma conta de serviço controlada, poderá acessar o papel.
Verifique a página a seguir para mais informações:
Este é um script para facilmente iterar sobre todos os pods e definições de sas procurando por essa anotação:
A seção anterior tratava de como roubar IAM Roles com pods, mas note que um Node do cluster K8s será uma instância dentro da nuvem. Isso significa que o Node é altamente provável que tenha um novo IAM role que você pode roubar (note que geralmente todos os nodes de um cluster K8s terão o mesmo IAM role, então pode não valer a pena tentar verificar em cada node).
No entanto, há um requisito importante para acessar o endpoint de metadados a partir do node, você precisa estar no node (sessão ssh?) ou pelo menos ter a mesma rede:
Anteriormente, discutimos como anexar Papéis IAM aos Pods ou até mesmo como escapar para o Nó para roubar o Papel IAM que a instância tem anexado a ele.
Você pode usar o seguinte script para roubar suas novas credenciais de papel IAM:
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)