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
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
EKS
Za više informacija proverite
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:
# 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):
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
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. Znajući da je standardni format za EKS url
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.
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
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
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.