AWS - EKS Post Exploitation

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

EKS

Daha fazla bilgi için bakınız

AWS - EKS Enum

AWS Console üzerinden kümeyi listeleme

Eğer eks:AccessKubernetesApi iznine sahipseniz, AWS EKS console üzerinden view Kubernetes objects gerçekleştirebilirsiniz. (Learn more).

AWS Kubernetes Cluster’a Bağlanma

  • Kolay yol:
# Generate kubeconfig
aws eks update-kubeconfig --name aws-eks-dev
  • O kadar kolay olmayan yol:

Eğer get a token’ı aws eks get-token --name <cluster_name> ile alabiliyorsanız ama cluster bilgilerini almak için (describeCluster) izniniz yoksa, kendi ~/.kube/config dosyanızı hazırlayabilirsiniz. Ancak tokena sahip olsanız bile bağlanmak için hâlâ url endpoint to connect to (eğer bir poddan JWT token almayı başardıysanız here okuyun) ve name of the cluster’a ihtiyacınız var.

Benim durumumda bilgiyi CloudWatch loglarında bulamadım, fakat found it in LaunchTemaplates userData ve in EC2 machines in userData also içinde buldum. Bu bilgiyi userData içinde kolayca görebilirsiniz, örneğin aşağıdaki örnekte (cluster adı cluster-name idi):

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 yapılandırması ```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 ```

AWS’den Kubernetes’e

Bir EKS cluster’ı oluşturan kişi, Kubernetes kümesinin system:masters (k8s admin) grubuna HER ZAMAN erişebilecektir. Bu yazının yazıldığı tarihte kümeyi kim oluşturduğunu bulmak için doğrudan bir yol yoktur (kontrol için CloudTrail’e bakabilirsiniz). Ve bu ayrcalığı kaldırmanın bir yolu yoktur.

K8s’e daha fazla AWS IAM users or roles için erişim vermenin yolu configmap aws-auth’ı kullanmaktır.

Warning

Bu nedenle, config map aws-auth üzerinde yazma erişimine sahip olan herkes tüm kümeyi ele geçirebilir.

Daha fazla bilgi için, aynı veya farklı hesapta IAM roles & users’a ekstra ayrıcalıkların nasıl verileceği ve bunun nasıl suistimal edileceği hakkında privesc check this page.

Ayrıca this awesome gönderisini, IAM -> Kubernetes kimlik doğrulamasının nasıl çalıştığını öğrenmek için inceleyin.

Kubernetes’ten AWS’e

OpenID authentication for kubernetes service account’a izin vererek onların AWS rollerini üstlenmelerini sağlamak mümkündür. Nasıl çalıştığını öğrenmek için this work in this page.

JWT Token’dan Api Server Endpoint Alma

JWT token’ı decode ettiğimizde cluster id ve ayrıca bölge bilgisi elde ederiz. image EKS URL’inin standart formatı şu şekildedir

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

‘Two chars’ ve ‘number’ için kriterleri açıklayan herhangi bir dokümantasyon bulamadım. Ancak kendi yaptığım bazı testlerde şu tekrarları görüyorum:

  • gr7
  • yl4

Her neyse, bunlar sadece 3 karakter; bunları bruteforce edebiliriz. Listeyi oluşturmak için aşağıdaki script’i kullanın

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

Sonra wfuzz ile

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

Warning

Yerine & koymayı unutmayın .

CloudTrail’ı Atlatma

Eğer bir attacker, permission over an EKS olan bir AWS kimlik bilgilerini elde ederse. Attacker daha önce açıklandığı gibi kendi kubeconfig’ini (update-kubeconfig çağırmadan) yapılandırırsa, get-token Cloudtrail’da log oluşturmaz çünkü AWS API ile etkileşime girmez (sadece token’ı yerel olarak oluşturur).

Bu nedenle attacker EKS cluster ile iletişim kurduğunda, cloudtrail çalınan kullanıcı ve erişimiyle ilgili hiçbir şeyi loglamayacaktır.

Not: EKS cluster’ın bu erişimi loglayacak şekilde logları etkinleştirilmiş olabilir (varsayılan olarak devre dışı olmalarına rağmen).

EKS Ransom?

Varsayılan olarak bir cluster’ı oluşturan user or role her zaman cluster üzerinde ALWAYS going to have admin privileges olacaktır. Ve bu, AWS’nin Kubernetes cluster’ı üzerinde sahip olduğu tek “secure” erişimdir.

Yani, eğer bir attacker fargate kullanarak bir cluster’ı compromises eder ve diğer tüm adminsleri kaldırır ve Cluster’ı oluşturan AWS user/role’u silerse, attacker cluster’ı ransom etmiş olabilir.

Tip

Dikkat: Eğer cluster EC2 VMs kullanıyorsa, Node’dan Admin ayrıcalıkları elde etmek ve cluster’ı kurtarmak mümkün olabilir.

Aslında, eğer cluster Fargate kullanıyorsa EC2 node’ları oluşturabilir veya her şeyi EC2’ye taşıyarak node içindeki tokens’a erişip kurtarabilirsiniz.

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin