AWS - EKS Post Exploitation

Support HackTricks

EKS

Aby uzyskać więcej informacji, sprawdź

Enumerate the cluster from the AWS Console

Jeśli masz uprawnienia eks:AccessKubernetesApi, możesz wyświetlać obiekty Kubernetes za pośrednictwem konsoli AWS EKS (Dowiedz się więcej).

Connect to AWS Kubernetes Cluster

  • Łatwy sposób:

# Generate kubeconfig
aws eks update-kubeconfig --name aws-eks-dev
  • Nie tak łatwy sposób:

Jeśli możesz uzyskać token za pomocą aws eks get-token --name <cluster_name>, ale nie masz uprawnień do uzyskania informacji o klastrze (describeCluster), możesz przygotować własny ~/.kube/config. Jednak mając token, nadal potrzebujesz url endpoint do połączenia (jeśli udało ci się uzyskać token JWT z poda, przeczytaj tutaj) oraz nazwę klastra.

W moim przypadku nie znalazłem informacji w logach CloudWatch, ale znalazłem je w LaunchTemplates userData oraz w maszynach EC2 w userData również. Możesz łatwo zobaczyć te informacje w userData, na przykład w następnym przykładzie (nazwa klastra to 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
kube config

```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 ```

Z AWS do Kubernetes

Twórca klastra EKS ZAWSZE będzie mógł uzyskać dostęp do części klastra kubernetes system:masters (administrator k8s). W momencie pisania tego tekstu nie ma bezpośredniego sposobu na ustalenie kto stworzył klaster (możesz sprawdzić CloudTrail). I nie ma sposobu na usunięcie tego przywileju.

Sposobem na przyznanie dostępu do K8s dla większej liczby użytkowników lub ról AWS IAM jest użycie configmap aws-auth.

Dlatego każdy, kto ma dostęp do zapisu w mapie konfiguracyjnej aws-auth, będzie mógł skompromentować cały klaster.

Aby uzyskać więcej informacji na temat przyznawania dodatkowych przywilejów rolom i użytkownikom IAM w tym samym lub innym koncie oraz jak to wykorzystać do privesc sprawdź tę stronę.

Sprawdź również ten niesamowity post, aby dowiedzieć się, jak działa uwierzytelnianie IAM -> Kubernetes.

Z Kubernetes do AWS

Możliwe jest zezwolenie na uwierzytelnianie OpenID dla konta usługi kubernetes, aby mogły one przyjmować role w AWS. Dowiedz się, jak to działa na tej stronie.

POBIERZ punkt końcowy serwera API z tokena JWT

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

Nie znalazłem żadnej dokumentacji, która wyjaśniałaby kryteria dla 'dwóch znaków' i 'liczby'. Ale robiąc kilka testów na własną rękę, zauważyłem, że te się powtarzają:

  • gr7

  • yl4

W każdym razie to tylko 3 znaki, możemy je bruteforce'ować. Użyj poniższego skryptu do generowania listy.

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))

Potem z wfuzz

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

Pamiętaj, aby zastąpić & .

Ominięcie CloudTrail

Jeśli atakujący uzyska dane uwierzytelniające AWS z uprawnieniami do EKS. Jeśli atakujący skonfiguruje własny kubeconfig (bez wywoływania update-kubeconfig) jak wcześniej wyjaśniono, get-token nie generuje logów w CloudTrail, ponieważ nie wchodzi w interakcję z API AWS (po prostu tworzy token lokalnie).

Więc kiedy atakujący rozmawia z klastrem EKS, cloudtrail nie zarejestruje nic związanego z użytkownikiem, który został skradziony i uzyskuje do niego dostęp.

Zauważ, że klaster EKS może mieć włączone logi, które zarejestrują ten dostęp (chociaż domyślnie są one wyłączone).

EKS Okup?

Domyślnie użytkownik lub rola, która utworzyła klaster ZAWSZE będzie miała uprawnienia administratora do klastra. I że jedynym "bezpiecznym" dostępem, jaki AWS będzie miał do klastra Kubernetes.

Więc, jeśli atakujący przejmie kontrolę nad klastrem używając Fargate i usunie wszystkich innych administratorów oraz usunie użytkownika/rolę AWS, która utworzyła klaster, atakujący mógłby zażądać okupu za klaster.

Zauważ, że jeśli klaster używał maszyn EC2, możliwe byłoby uzyskanie uprawnień administratora z Węzła i odzyskanie klastra.

W rzeczywistości, jeśli klaster używa Fargate, możesz uzyskać węzły EC2 lub przenieść wszystko do EC2 w klastrze i odzyskać go, uzyskując dostęp do tokenów w węźle.

Wsparcie HackTricks

Last updated