Files
hacktricks-cloud/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-eks-post-exploitation.md
T

8.2 KiB

AWS - EKS Post Exploitation

{{#include ../../../banners/hacktricks-training.md}}

EKS

Kwa maelezo zaidi angalia

{{#ref}} ../aws-services/aws-eks-enum.md {{#endref}}

Tambua klasta kutoka kwa AWS Console

Ikiwa una ruhusa eks:AccessKubernetesApi unaweza kuona vitu vya Kubernetes kupitia AWS EKS console (Learn more).

Unganisha na AWS Kubernetes Cluster

  • Njia rahisi:
# Generate kubeconfig
aws eks update-kubeconfig --name aws-eks-dev
  • Si njia rahisi:

Ikiwa unaweza kupata token kwa aws eks get-token --name <cluster_name> lakini huna ruhusa ya kupata taarifa za klasta (describeCluster), unaweza kuandaa ~/.kube/config yako mwenyewe. Hata hivyo, ukiwa na token, bado unahitaji url endpoint ya kuungana (ikiwa umeweza kupata token ya JWT kutoka kwa pod soma hapa) na jina la klasta.

Katika kesi yangu, sikuweza kupata taarifa katika CloudWatch logs, lakini nilipata katika LaunchTemplates userData na katika mashine za EC2 katika userData pia. Unaweza kuona taarifa hii katika userData kwa urahisi, kwa mfano katika mfano ufuatao (jina la klasta lilikuwa 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 ```

Kutoka AWS hadi Kubernetes

Mwandishi wa EKS cluster daima atakuwa na uwezo wa kuingia kwenye sehemu ya kundi la system:masters (k8s admin). Wakati wa kuandika hii, hakuna njia ya moja kwa moja ya kubaini nani aliumba kundi hilo (unaweza kuangalia CloudTrail). Na hakuna njia ya kuondoa hiyo haki.

Njia ya kutoa ufikiaji kwa K8s kwa watumiaji au majukumu mengine ya AWS IAM ni kutumia configmap aws-auth.

Warning

Hivyo, mtu yeyote mwenye ufikiaji wa kuandika kwenye ramani ya config aws-auth ataweza kuharibu kundi zima.

Kwa maelezo zaidi kuhusu jinsi ya kutoa haki za ziada kwa majukumu na watumiaji wa IAM katika akaunti sawa au tofauti na jinsi ya kudhulumu hii privesc angalia ukurasa huu.

Angalia pia hii nzuri post ili kujifunza jinsi uthibitisho wa IAM -> Kubernetes unavyofanya kazi.

Kutoka Kubernetes hadi AWS

Inawezekana kuruhusu uthibitisho wa OpenID kwa akaunti ya huduma ya kubernetes ili kuwawezesha kuchukua majukumu katika AWS. Jifunze jinsi hii inavyofanya kazi katika ukurasa huu.

PATA Api Server Endpoint kutoka kwa JWT Token

Kwa kufungua token ya JWT tunapata kitambulisho cha kundi & pia eneo. image Kujua kwamba muundo wa kawaida wa URL ya EKS ni

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

Sijapata hati yoyote inayofafanua vigezo vya 'herufi mbili' na 'nambari'. Lakini nikifanya majaribio kwa niaba yangu, naona hizi zikijirudia:

  • gr7
  • yl4

Hata hivyo, ni herufi 3 tu tunaweza kuzivunja. Tumia script iliyo hapa chini kutengeneza orodha.

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

Kisha na wfuzz

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

Warning

Kumbuka kubadilisha & .

Kupita CloudTrail

Ikiwa mshambuliaji anapata akreditivu za AWS zenye ruhusa juu ya EKS. Ikiwa mshambuliaji anapanga kubeconfig yake mwenyewe (bila kuita update-kubeconfig) kama ilivyoelezwa hapo awali, get-token haitengenezi kumbukumbu katika Cloudtrail kwa sababu haiingiliani na API ya AWS (inaunda tu token hiyo kwa ndani).

Hivyo, wakati mshambuliaji anazungumza na klasta ya EKS, cloudtrail haitarekodi chochote kinachohusiana na mtumiaji aliyeibiwa na kuingia.

Kumbuka kwamba klasta ya EKS inaweza kuwa na kumbukumbu zilizoanzishwa ambazo zitaandika ufikiaji huu (ingawa, kwa kawaida, zimezimwa).

EKS Ransom?

Kwa kawaida mtumiaji au jukumu lililounda klasta lina DAIMA kuwa na ruhusa za usimamizi juu ya klasta hiyo. Na kwamba ufikiaji pekee "salama" ambao AWS itakuwa nao juu ya klasta ya Kubernetes.

Hivyo, ikiwa mshambuliaji anaharibu klasta kwa kutumia fargate na kuondoa wasimamizi wengine wote na kufuta mtumiaji/jukumu la AWS lililounda Klasta, mshambuliaji anaweza kuwa amechukua nyara klastar.

Tip

Kumbuka kwamba ikiwa klasta ilikuwa inatumia EC2 VMs, inaweza kuwa inawezekana kupata ruhusa za Usimamizi kutoka kwa Node na kurejesha klasta.

Kwa kweli, ikiwa klasta inatumia Fargate unaweza EC2 nodes au kuhamasisha kila kitu kwenda EC2 kwenye klasta na kuirejesha kwa kufikia token katika node.

{{#include ../../../banners/hacktricks-training.md}}