AWS - EKS Post Exploitation

Wesprzyj HackTricks

EKS

Aby uzyskać więcej informacji, sprawdź

AWS - 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 tych informacji w logach CloudWatch, ale znalazłem je w danych uruchomieniowych LaunchTemplates oraz również w danych uruchomieniowych EC2. Możesz łatwo zobaczyć te informacje w danych uruchomieniowych, 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 części klastra kubernetes w grupie system:masters (k8s admin). W chwili pisania tego nie ma bezpośredniego sposobu na znalezienie kto utworzył klaster (możesz sprawdzić CloudTrail). I nie ma 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 configmap aws-auth.

Dlatego każdy z uprawnieniem do zapisu w mapie konfiguracyjnej aws-auth będzie mógł zagrozić całemu klastrze.

Aby uzyskać więcej informacji na temat tego, jak udzielić dodatkowych uprawnień rolom i użytkownikom IAM w tym samym lub innym koncie oraz jak to wykorzystać, zajrzyj na tę stronę.

Sprawdź również ten fantastyczny 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 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

Dekodując token JWT, otrzymujemy identyfikator klastra oraz region. Wiedząc, że standardowy format adresu URL EKS to

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

Nie znaleziono żadnej dokumentacji wyjaśniającej kryteria dla 'dwóch znaków' i 'liczby'. Ale po przeprowadzeniu testów zauważyłem, że pojawiają się one często:

  • 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 swój własny 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 (tylko tworzy token lokalnie).

Dlatego 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 klasterem. 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 uzyskać dostęp do węzłów EC2 lub przenieść wszystko do EC2 do klastra i odzyskać go uzyskując dostęp do tokenów w węźle.

Wesprzyj HackTricks

Last updated