AWS - EKS Post Exploitation

Sıfırdan kahraman olacak şekilde AWS hackleme öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!

HackTricks'ı desteklemenin diğer yolları:

EKS

Daha fazla bilgi için şuraya bakın

AWS - EKS Enum

AWS Konsolundan Küme Numaralandırma

Eğer eks:AccessKubernetesApi izniniz varsa, AWS EKS konsolu üzerinden Kubernetes nesnelerini görüntüleyebilirsiniz (Daha fazla bilgi).

AWS Kubernetes Kümesine Bağlanma

  • Kolay yol:

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

Eğer aws eks get-token --name <cluster_name> komutu ile bir token alabilirseniz ancak küme bilgilerini alacak izniniz yoksa (describeCluster), kendi ~/.kube/config dosyanızı hazırlayabilirsiniz. Ancak, token'a sahip olsanız bile, hala bağlanılacak url uç noktasına ihtiyacınız vardır (eğer bir JWT tokenı bir pod'dan aldıysanız buraya bakın) ve küme adına ihtiyacınız vardır.

Benim durumumda, CloudWatch günlüklerinde bilgi bulamadım, ancak LaunchTemplates userData ve EC2 makinelerinde de userData içinde buldum. Bu bilgiyi userData içinde kolayca görebilirsiniz, örneğin aşağıdaki örnekte (küme 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'ten Kubernetes'e

EKS kümesinin oluşturucusu her zaman kubernetes kümesine (k8s yönetici) system:masters grubunun içine girebilecektir. Bu yazının yazıldığı sırada, kümenin kim tarafından oluşturulduğunu bulmanın doğrudan bir yolu yok (CloudTrail'ı kontrol edebilirsiniz). Ve bu yetkiyi kaldırmanın bir yolu yok.

AWS IAM kullanıcılarına veya rollerine K8s üzerinde erişim vermenin yolu, aws-auth adlı configmap'i kullanmaktır.

Bu nedenle, aws-auth config haritası üzerinde yazma erişimi olan herkes, tüm kümenin tehlikeye girebileceği anlamına gelir.

Aynı veya farklı hesaptaki IAM rollerine ve kullanıcılarına ek ayrıcalıklar vermenin ve bunu kötüye kullanmanın yolunu öğrenmek için bu sayfaya bakın.

Ayrıca, IAM kimlik doğrulamasının Kubernetes üzerinden nasıl çalıştığını öğrenmek için bu harika yazıya bakın.

Kubernetes'ten AWS'ye

Kubernetes servis hesaplarına AWS'de rolleri assume etmelerine izin vermek için OpenID kimlik doğrulamasına izin vermek mümkündür. Bu sayfada nasıl çalıştığını öğrenin.

JWT Belirtecindeki Api Sunucusu Uç Noktasını Al

JWT belirtecini çözerek küme kimliğini ve aynı zamanda bölgeyi alırız. EKS URL için standart formatın olduğunu bilerek

https://<cluster-id>.<two-random-chars><number>.<region>.eks.amazonaws.com
Belirli 'iki karakter' ve 'sayı' için kriterleri açıklayan herhangi bir belge bulamadım. Ancak kendi adıma bazı testler yaparak şunları tekrarlayarak gördüm:
- gr7
- yl4

Neyse ki sadece 3 karakter oldukları için bunları brute force yöntemiyle deneyebiliriz. Listeyi oluşturmak için aşağıdaki betiğ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))

Ardından wfuzz ile

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

ve değerlerini değiştirmeyi unutmayın.

CloudTrail'ı Atlatma

Bir saldırgan, bir AWS'nin EKS üzerinde izni olan kimlik bilgilerini elde ederse ve saldırgan, önceki açıklamalarda açıklandığı gibi kendi kubeconfig'ini yapılandırırsa ( update-kubeconfig çağırmadan), get-token CloudTrail'de kayıt oluşturmaz çünkü AWS API'siyle etkileşime girmez (yalnızca yerel olarak belirteci oluşturur).

Bu nedenle saldırgan EKS kümesiyle iletişim kurduğunda, cloudtrail, çalınan kullanıcıyla ilgili ve erişim sağlayan herhangi bir şeyi kaydetmeyecektir.

EKS kümesinin etkinleştirilmiş günlüklerinin olabileceğini unutmayın (ancak varsayılan olarak devre dışı bırakılmış olabilir).

EKS Fidye?

Varsayılan olarak bir küme oluşturan kullanıcı veya rolün, küme üzerinde her zaman yönetici ayrıcalıklarına sahip olacağını ve AWS'nin Kubernetes kümesi üzerinde tek "güvenli" erişiminin olacağını unutmayın.

Bu nedenle, bir saldırgan fargate kullanarak bir küme ele geçirirse ve diğer tüm yöneticileri kaldırır ve küme oluşturan AWS kullanıcısını/rolünü silerse, saldırgan kümeyi fidyeyle alabilir.

Küme EC2 VM'ler kullanıyorsa, Yönetici ayrıcalıklarını Node'dan almak ve kümesi kurtarmak mümkün olabilir.

Aslında, Eğer küme Fargate kullanıyorsa, EC2 düğümlerine veya her şeyi EC2'ye taşıyarak kümesine erişerek düğümdeki belirteçlere erişerek kümesi kurtarılabilir.

Sıfırdan ileri seviyeye AWS hackleme becerilerini htARTE (HackTricks AWS Red Team Expert) ile öğrenin!

HackTricks'i desteklemenin diğer yolları:

Last updated