AWS - EKS Post Exploitation

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

EKS

Dla więcej informacji sprawdź

pageAWS - EKS Enum

Wylicz klaster z konsoli AWS

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

Połącz się z klastrą AWS Kubernetes

  • Łatwy sposób:

# Generate kubeconfig
aws eks update-kubeconfig --name aws-eks-dev
  • Nie takie proste rozwiązanie:

Jeśli możesz uzyskać token za pomocą aws eks get-token --name <nazwa_klastra> ale nie masz uprawnień do uzyskania informacji o klastrze (describeCluster), możesz przygotować swój własny plik ~/.kube/config. Mimo posiadania tokenu, nadal potrzebujesz adresu URL punktu końcowego do połączenia (jeśli udało ci się uzyskać token JWT z poda, przeczytaj tutaj) oraz nazwy klastra.

W moim przypadku nie znalazłem informacji w logach CloudWatch, ale znalazłem je w danych userData LaunchTemplates oraz również w danych userData EC2 machines. Możesz łatwo zobaczyć te informacje w userData, na przykład w poniższym 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
konfiguracja 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 ```

Z AWS do Kubernetes

Twórca klastra EKS zawsze będzie mógł uzyskać dostęp do klastra Kubernetes jako część grupy system:masters (administrator k8s). W chwili pisania tego tekstu nie ma bezpośredniego sposobu na znalezienie twórcy klastra (można sprawdzić CloudTrail). Nie ma również sposobu na usunięcie tego uprawnienia.

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

Dlatego każda osoba mająca dostęp do zapisu w mapie konfiguracyjnej aws-auth będzie mogła zagrozić całemu klastrze.

Aby uzyskać więcej informacji na temat udzielania dodatkowych uprawnień dla ról i użytkowników IAM w tym samym lub innym koncie oraz jak to wykorzystać, zajrzyj na tę stronę.

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

Z Kubernetes do AWS

Możliwe jest umożliwienie uwierzytelniania OpenID dla konta usługi kubernetes, aby umożliwić im przejmowanie ról 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 znaleziono dokumentacji wyjaśniającej kryteria dla 'dwóch znaków' i 'liczby'. Ale po przeprowadzeniu testów zauważyłem, że występują często takie kombinacje:

  • gr7

  • yl4

W każdym razie, skoro są to tylko 3 znaki, możemy je przetestować metodą bruteforce. Użyj poniższego skryptu do wygenerowania 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))

Następnie 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 poświadczenia AWS z uprawnieniami do EKS. Jeśli atakujący skonfiguruje swoje własne kubeconfig (bez wywoływania update-kubeconfig) jak wyjaśniono wcześniej, polecenie get-token nie generuje logów w CloudTrail, ponieważ nie komunikuje się z interfejsem API AWS (tworzy tylko token lokalnie).

Więc gdy atakujący rozmawia z klastrą EKS, cloudtrail nie zarejestruje niczego związanego z użytkownikiem, który został skradziony i uzyskał do niego dostęp.

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

Ransom EKS?

Domyślnie użytkownik lub rola, która utworzyła klaster zawsze będzie miała uprawnienia administratora nad klastrem. I to jedyny "bezpieczny" dostęp, jaki AWS będzie miał do klastra Kubernetes.

Więc jeśli atakujący przejmuje klaster za pomocą fargate i usunie wszystkich innych administratorów oraz usunie użytkownika/rolę AWS, który utworzył klaster, atakujący mógłby wymusić okup na klastrzer.

Zauważ, że jeśli klaster korzystał z maszyn wirtualnych EC2, byłoby możliwe uzyskanie uprawnień administratora z Node i odzyskanie klastra.

Tak naprawdę, jeśli klaster korzysta z Fargate, można użyć węzłów EC2 lub przenieść wszystko do EC2 do klastra i odzyskać go uzyskując dostęp do tokenów w węźle.

Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated