AWS - EKS Post Exploitation

Reading time: 6 minutes

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

EKS

Kwa maelezo zaidi angalia

AWS - EKS Enum

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:
bash
# 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):

bash
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:<acc-id>:cluster/<cluster-name>
contexts:
- context:
cluster: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
user: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
name: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
current-context: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
kind: Config
preferences: {}
users:
- name: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
user:
exec:
apiVersion: client.authentication.k8s.io/v1beta1
args:
- --region
- us-west-2
- --profile
- <profile>
- eks
- get-token
- --cluster-name
- <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

bash
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.

python
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

bash
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.

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks