AWS - EKS Post Exploitation

Reading time: 6 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

EKS

Za više informacija proverite

AWS - EKS Enum

Enumerate the cluster from the AWS Console

Ako imate dozvolu eks:AccessKubernetesApi možete videti Kubernetes objekte putem AWS EKS konzole (Learn more).

Connect to AWS Kubernetes Cluster

  • Lako rešenje:
bash
# Generate kubeconfig
aws eks update-kubeconfig --name aws-eks-dev
  • Nije tako lak način:

Ako možete dobiti token sa aws eks get-token --name <cluster_name> ali nemate dozvole za dobijanje informacija o klasteru (describeCluster), možete pripremiti svoj ~/.kube/config. Međutim, imajući token, još uvek vam je potrebna url adresa za povezivanje (ako ste uspeli da dobijete JWT token iz poda pročitajte ovde) i ime klastera.

U mom slučaju, nisam našao informacije u CloudWatch logovima, ali sam pronašao u LaunchTemplates userData i u EC2 mašinama u userData takođe. Ove informacije možete lako videti u userData, na primer u sledećem primeru (ime klastera je bilo 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

Od AWS do Kubernetes

Kreator EKS klastera će UVEK moći da uđe u deo kubernetes klastera grupe system:masters (k8s admin). U trenutku pisanja ovog teksta ne postoji direktan način da se sazna ko je kreirao klaster (možete proveriti CloudTrail). I ne postoji način da se ukloni ta privilegija.

Način da se dodeli pristup više AWS IAM korisnicima ili rolama je korišćenjem configmap aws-auth.

warning

Stoga, svako ko ima pristup za pisanje preko config mapa aws-auth će moći da kompromituje ceo klaster.

Za više informacija o tome kako da dodelite dodatne privilegije IAM rolama i korisnicima u isto ili različitoj računu i kako da zloupotrebite ovo da privesc proverite ovu stranicu.

Proverite takođe ovaj sjajan post da saznate kako funkcioniše autentifikacija IAM -> Kubernetes.

Od Kubernetes do AWS

Moguće je omogućiti OpenID autentifikaciju za kubernetes servisni nalog da im omogući da preuzmu uloge u AWS-u. Saznajte kako to funkcioniše na ovoj stranici.

DOBIJANJE Api Server Endpoint-a iz JWT Tokena

Dekodiranjem JWT tokena dobijamo id klastera i takođe region. image Znajući da je standardni format za EKS url

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

Nisam pronašao nikakvu dokumentaciju koja objašnjava kriterijume za 'dva karaktera' i 'broj'. Ali, radeći neke testove u svoje ime, primetio sam da se ovi ponavljaju:

  • gr7
  • yl4

U svakom slučaju, to su samo 3 karaktera koje možemo bruteforce-ovati. Koristite ispod navedeni skript za generisanje liste.

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

Zatim sa wfuzz

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

warning

Zapamtite da zamenite & .

Bypass CloudTrail

Ako napadač dobije akreditive AWS sa dozvolama nad EKS. Ako napadač konfiguriše svoj kubeconfig (bez pozivanja update-kubeconfig) kao što je objašnjeno ranije, get-token ne generiše logove u Cloudtrail-u jer ne komunicira sa AWS API-jem (samo kreira token lokalno).

Dakle, kada napadač komunicira sa EKS klasterom, cloudtrail neće zabeležiti ništa vezano za ukradenu korisničku sesiju i pristup.

Napomena da EKS klaster može imati omogućene logove koji će zabeležiti ovaj pristup (iako su po defaultu isključeni).

EKS Ransom?

Po defaultu, korisnik ili uloga koja je kreirala klaster uvek će imati admin privilegije nad klasterom. I to je jedini "siguran" pristup koji AWS može imati nad Kubernetes klasterom.

Dakle, ako napadač kompromituje klaster koristeći fargate i ukloni sve druge administratore i obriše AWS korisnika/ulogu koja je kreirala klaster, napadač bi mogao da iznudi klasterr.

tip

Napomena da ako je klaster koristio EC2 VMs, moglo bi biti moguće dobiti admin privilegije sa Node i povratiti klaster.

U stvari, ako klaster koristi Fargate, mogli biste da koristite EC2 čvorove ili prebacite sve na EC2 klaster i povratite ga pristupajući tokenima u čvoru.

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks