AWS - EKS Post Exploitation

Aprenda hacking na AWS de zero a herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

EKS

Para mais informações, verifique

pageAWS - EKS Enum

Enumerar o cluster a partir do Console da AWS

Se você tiver permissão eks:AccessKubernetesApi você pode visualizar objetos do Kubernetes via console do AWS EKS (Saiba mais).

Conectar ao Cluster Kubernetes da AWS

  • Maneira fácil:

# Generate kubeconfig
aws eks update-kubeconfig --name aws-eks-dev
  • Não é tão fácil assim:

Se você conseguir obter um token com aws eks get-token --name <cluster_name> mas não tiver permissões para obter informações do cluster (describeCluster), você poderia preparar seu próprio ~/.kube/config. No entanto, tendo o token, você ainda precisa do endpoint URL para se conectar (se você conseguiu obter um token JWT de um pod, leia aqui) e do nome do cluster.

No meu caso, não encontrei as informações nos logs do CloudWatch, mas encontrei nos userData dos LaunchTemplates e também nos userData das máquinas EC2. Você pode ver essas informações no userData facilmente, por exemplo no próximo exemplo (o nome do cluster era cluster-name):

API_SERVER_URL=https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-east-1.eks.amazonaws.com

/etc/eks/bootstrap.sh cluster-name --kubelet-extra-args '--node-labels=eks.amazonaws.com/sourceLaunchTemplateVersion=1,alpha.eksctl.io/cluster-name=cluster-name,alpha.eksctl.io/nodegroup-name=prd-ondemand-us-west-2b,role=worker,eks.amazonaws.com/nodegroup-image=ami-002539dd2c532d0a5,eks.amazonaws.com/capacityType=ON_DEMAND,eks.amazonaws.com/nodegroup=prd-ondemand-us-west-2b,type=ondemand,eks.amazonaws.com/sourceLaunchTemplateId=lt-0f0f0ba62bef782e5 --max-pods=58' --b64-cluster-ca $B64_CLUSTER_CA --apiserver-endpoint $API_SERVER_URL --dns-cluster-ip $K8S_CLUSTER_DNS_IP --use-max-pods false
configuração do kube

```yaml describe-cache-parametersapiVersion: v1 clusters: - cluster: certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1USXlPREUyTWpjek1Wb1hEVE15TVRJeU5URTJNamN6TVZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTDlXCk9OS0ZqeXZoRUxDZGhMNnFwWkMwa1d0UURSRVF1UzVpRDcwK2pjbjFKWXZ4a3FsV1ZpbmtwOUt5N2x2ME5mUW8KYkNqREFLQWZmMEtlNlFUWVVvOC9jQXJ4K0RzWVlKV3dzcEZGbWlsY1lFWFZHMG5RV1VoMVQ3VWhOanc0MllMRQpkcVpzTGg4OTlzTXRLT1JtVE5sN1V6a05pTlUzSytueTZSRysvVzZmbFNYYnRiT2kwcXJSeFVpcDhMdWl4WGRVCnk4QTg3VjRjbllsMXo2MUt3NllIV3hhSm11eWI5enRtbCtBRHQ5RVhOUXhDMExrdWcxSDBqdTl1MDlkU09YYlkKMHJxY2lINjYvSTh0MjlPZ3JwNkY0dit5eUNJUjZFQURRaktHTFVEWUlVSkZ4WXA0Y1pGcVA1aVJteGJ5Nkh3UwpDSE52TWNJZFZRRUNQMlg5R2c4Q0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQVXFsekhWZmlDd0xqalhPRmJJUUc3L0VxZ1hNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS1o4c0l4aXpsemx0aXRPcGcySgpYV0VUSThoeWxYNWx6cW1mV0dpZkdFVVduUDU3UEVtWW55eWJHbnZ5RlVDbnczTldMRTNrbEVMQVE4d0tLSG8rCnBZdXAzQlNYamdiWFovdWVJc2RhWlNucmVqNU1USlJ3SVFod250ZUtpU0J4MWFRVU01ZGdZc2c4SlpJY3I2WC8KRG5POGlHOGxmMXVxend1dUdHSHM2R1lNR0Mvd1V0czVvcm1GS291SmtSUWhBZElMVkNuaStYNCtmcHUzT21UNwprS3VmR0tyRVlKT09VL1c2YTB3OTRycU9iSS9Mem1GSWxJQnVNcXZWVDBwOGtlcTc1eklpdGNzaUJmYVVidng3Ci9sMGhvS1RqM0IrOGlwbktIWW4wNGZ1R2F2YVJRbEhWcldDVlZ4c3ZyYWpxOUdJNWJUUlJ6TnpTbzFlcTVZNisKRzVBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== server: https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-west-2.eks.amazonaws.com name: arn:aws:eks:us-east-1::cluster/ contexts: - context: cluster: arn:aws:eks:us-east-1::cluster/ user: arn:aws:eks:us-east-1::cluster/ name: arn:aws:eks:us-east-1::cluster/ current-context: arn:aws:eks:us-east-1::cluster/ kind: Config preferences: {} users: - name: arn:aws:eks:us-east-1::cluster/ user: exec: apiVersion: client.authentication.k8s.io/v1beta1 args: - --region - us-west-2 - --profile - - eks - get-token - --cluster-name - command: aws env: null interactiveMode: IfAvailable provideClusterInfo: false ```

Do AWS para Kubernetes

O criador do cluster EKS sempre poderá acessar a parte do cluster Kubernetes do grupo system:masters (k8s admin). No momento desta escrita, não há uma maneira direta de descobrir quem criou o cluster (você pode verificar o CloudTrail). E não há maneira de remover esse privilégio.

A maneira de conceder acesso ao K8s para mais usuários ou funções do IAM da AWS é usando o configmap aws-auth.

Portanto, qualquer pessoa com acesso de escrita sobre o configmap aws-auth poderá comprometer o cluster inteiro.

Para mais informações sobre como conceder privilégios extras a funções e usuários do IAM na mesma ou em contas diferentes e como abusar disso, verifique esta página.

Confira também este incrível post para aprender como funciona a autenticação IAM -> Kubernetes.

Do Kubernetes para AWS

É possível permitir uma autenticação OpenID para a conta de serviço do Kubernetes para permitir que eles assumam funções na AWS. Saiba como isso funciona nesta página.

Obter o Endpoint do Servidor de API a partir de um Token JWT

https://<cluster-id>.<two-random-chars><number>.<region>.eks.amazonaws.com

Não encontrei nenhuma documentação que explique os critérios para os 'dois chars' e o 'número'. Mas fazendo alguns testes por conta própria, vejo que estão ocorrendo os seguintes:

  • gr7

  • yl4

De qualquer forma, como são apenas 3 caracteres, podemos fazer brute force neles. Use o script abaixo para gerar a lista

from itertools import product
from string import ascii_lowercase

letter_combinations = product('abcdefghijklmnopqrstuvwxyz', repeat = 2)
number_combinations = product('0123456789', repeat = 1)

result = [
f'{''.join(comb[0])}{comb[1][0]}'
for comb in product(letter_combinations, number_combinations)
]

with open('out.txt', 'w') as f:
f.write('\n'.join(result))

Então com wfuzz

wfuzz -Z -z file,out.txt --hw 0 https://<cluster-id>.FUZZ.<region>.eks.amazonaws.com

Lembre-se de substituir e <região>.

Bypass CloudTrail

Se um atacante obtém credenciais de um AWS com permissão sobre um EKS. Se o atacante configurar seu próprio kubeconfig (sem chamar update-kubeconfig) como explicado anteriormente, o get-token não gera logs no CloudTrail porque não interage com a API da AWS (apenas cria o token localmente).

Portanto, quando o atacante conversa com o cluster EKS, o cloudtrail não registrará nada relacionado ao usuário que foi roubado e acessando-o.

Observe que o cluster EKS pode ter logs habilitados que registrarão esse acesso (embora, por padrão, estejam desativados).

EKS Ransom?

Por padrão, o usuário ou função que criou um cluster SEMPRE terá privilégios de administrador sobre o cluster. E essa é a única forma "segura" de acesso que a AWS terá sobre o cluster Kubernetes.

Portanto, se um atacante comprometer um cluster usando fargate e remover todos os outros administradores e excluir o usuário/função da AWS que criou o Cluster, o atacante poderia ter chantageado o clusterr.

Observe que se o cluster estivesse usando VMs EC2, poderia ser possível obter privilégios de administrador a partir do e recuperar o cluster.

Na verdade, se o cluster estiver usando Fargate, você poderia usar nós EC2 ou mover tudo para EC2 no cluster e recuperá-lo acessando os tokens no nó.

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Última actualización