AWS - EKS Post Exploitation

Impara l'hacking AWS da zero a eroe con htARTE (Esperto Red Team AWS di HackTricks)!

Altri modi per supportare HackTricks:

EKS

Per ulteriori informazioni controlla

pageAWS - EKS Enum

Enumerare il cluster dalla Console AWS

Se hai il permesso eks:AccessKubernetesApi puoi visualizzare gli oggetti Kubernetes tramite la console AWS EKS (Ulteriori informazioni).

Connettersi al Cluster Kubernetes AWS

  • Modo semplice:

# Generate kubeconfig
aws eks update-kubeconfig --name aws-eks-dev
  • Non è così semplice:

Se riesci a ottenere un token con aws eks get-token --name <cluster_name> ma non hai le autorizzazioni per ottenere le informazioni sul cluster (describeCluster), potresti preparare il tuo ~/.kube/config. Tuttavia, avendo il token, hai comunque bisogno dell'endpoint dell'URL a cui connetterti (se sei riuscito a ottenere un token JWT da un pod leggi qui) e del nome del cluster.

Nel mio caso, non ho trovato le informazioni nei log di CloudWatch, ma le ho trovate nei dati di LaunchTemplates e anche nei dati delle macchine EC2. Puoi vedere facilmente queste informazioni nei dati di userData, ad esempio nell'esempio seguente (il nome del 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
configurazione 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 ```

Da AWS a Kubernetes

Il creatore del cluster EKS sarà SEMPRE in grado di accedere alla parte del cluster Kubernetes del gruppo system:masters (k8s admin). Al momento della stesura di questo testo, non c'è un modo diretto per scoprire chi ha creato il cluster (puoi controllare CloudTrail). E non c'è un modo per rimuovere tale privilegio.

Il modo per concedere accesso su K8s ad altri utenti o ruoli IAM di AWS è utilizzando il configmap aws-auth.

Pertanto, chiunque abbia accesso in scrittura al config map aws-auth sarà in grado di compromettere l'intero cluster.

Per ulteriori informazioni su come concedere privilegi aggiuntivi a ruoli IAM e utenti nello stesso account o in account diversi e su come abusare di ciò per controllare questa pagina.

Controlla anche questo fantastico post per imparare come funziona l'autenticazione IAM -> Kubernetes.

Da Kubernetes ad AWS

È possibile consentire un'autenticazione OpenID per l'account di servizio Kubernetes per consentire loro di assumere ruoli in AWS. Scopri come funziona in questa pagina.

Ottenere l'Endpoint del Server Api da un Token JWT

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

Non ho trovato alcuna documentazione che spieghi i criteri per i 'due caratteri' e il 'numero'. Ma facendo alcuni test da solo vedo che ricorrono questi:

  • gr7

  • yl4

Comunque sono solo 3 caratteri che possiamo forzare. Utilizza lo script sottostante per generare la 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))

Quindi con wfuzz

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

Ricordati di sostituire e .

Eludere CloudTrail

Se un attaccante ottiene le credenziali di un AWS con permessi su un EKS. Se l'attaccante configura il proprio kubeconfig (senza chiamare update-kubeconfig) come spiegato in precedenza, il comando get-token non genera registrazioni in CloudTrail perché non interagisce con l'API di AWS (crea solo il token localmente).

Quindi quando l'attaccante parla con il cluster EKS, cloudtrail non registrerà nulla riguardo all'utente che è stato rubato e che vi accede.

Nota che il cluster EKS potrebbe avere i log abilitati che registreranno questo accesso (anche se, per impostazione predefinita, sono disabilitati).

Riscatto EKS?

Per impostazione predefinita, l'utente o ruolo che ha creato un cluster ha sempre privilegi di amministratore sul cluster. Ed è l'unico accesso "sicuro" che AWS avrà sul cluster Kubernetes.

Quindi, se un attaccante compromette un cluster utilizzando fargate e rimuove tutti gli altri amministratori e elimina l'utente/ruolo AWS che ha creato il Cluster, l'attaccante potrebbe aver ricattato il clusterr.

Nota che se il cluster stesse utilizzando EC2 VMs, potrebbe essere possibile ottenere i privilegi di amministratore dal Nodo e recuperare il cluster.

In realtà, se il cluster sta utilizzando Fargate, potresti utilizzare i nodi EC2 o spostare tutto su EC2 nel cluster e recuperarlo accedendo ai token nel nodo.

Impara l'hacking AWS da zero a esperto con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Last updated