9.7 KiB
AWS - EKS Post Exploitation
{{#include ../../../../banners/hacktricks-training.md}}
EKS
Za više informacija pogledaj
{{#ref}} ../../aws-services/aws-eks-enum.md {{#endref}}
Enumerate the cluster from the AWS Console
Ako imaš dozvolu eks:AccessKubernetesApi možeš da pregledaš Kubernetes objekte preko AWS EKS konzole (Saznaj više).
Connect to AWS Kubernetes Cluster
- Easy way:
# Generate kubeconfig
aws eks update-kubeconfig --name aws-eks-dev
- Ne tako lak način:
Ako možete da dobijete token sa aws eks get-token --name <cluster_name>, ali nemate dozvole da dobijete informacije o klasteru (describeCluster), možete da pripremite sopstveni ~/.kube/config. Međutim, čak i sa tokenom, i dalje vam je potreban url endpoint na koji da se povežete (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 ih našao u LaunchTemaplates userData i takođe u EC2 mašinama u userData. Ove informacije možete lako da vidite 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
```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 ```Sa AWS na Kubernetes
Kreator EKS cluster-a će UVEK moći da uđe u deo kubernetes cluster-a koji pripada grupi system:masters (k8s admin). U trenutku pisanja ovog teksta ne postoji direktan način da se sazna ko je kreirao cluster (možete proveriti CloudTrail). I ne postoji nikakav način da se ta privilegija ukloni.
Zloupotreba configmap
Tradicionalni način da se dodeli pristup K8s-u većem broju AWS IAM korisnika ili rolova je korišćenje configmap-a aws-auth.
Warning
Zato će svako ko ima write pristup nad config map-om
aws-authmoći da compromise-uje ceo cluster.
Za više informacija o tome kako da dodelite dodatne privilegije IAM rolama i korisnicima u istom ili drugom account-u i kako da to zloupotrebite za privesc pogledajte ovu stranicu.
Pogledajte i ovaj sjajan post da biste naučili kako funkcioniše authentication IAM -> Kubernetes.
Zloupotreba Access Entries
AWS je implementirao dodatni način da se IAM korisnicima dodeli pristup Kubernetes cluster-u kroz access entries. Ako imate dozvole eks:CreateAccessEntry i eks:AssociateAccessPolicy, možda ćete takođe moći da dodelite Kubernetes administrator ulogu svom korisniku ili određenoj roli.
Prvo, kreirajte access entry za svog korisnika ili rolu:
aws eks create-access-entry --cluster-name <cluster_name> --region <region> --principal-arn <arn_from_your_user_or_role> --type STANDARD
Sa tim unetim unosom, sada možda možeš direktno da mu dodeliš policy. Postoji ugrađeni AWS policy nazvan AmazonEKSClusterAdminPolicy koji može da se koristi direktno. Imaj na umu da, ako tvoje okruženje ima neke druge custom policies koje takođe daju elevated privileges u EKS, možeš da promeniš --policy-arn na bilo koji od njih:
aws eks associate-access-policy --cluster-name <cluster_name> --region <region> --principal-arn <arn_from_your_user_or_role> --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy --access-scope type=cluster
Možete potražiti ovu politiku u zvaničnoj AWS dokumentaciji here
Od ovog trenutka nadalje, možda ćete sada moći da zatražite k8s token i da komunicirate sa klasterom kao administrator:
aws eks get-token --cluster-name <cluster_name> --output json | jq -r '.status.token'
From Kubernetes to AWS
Moguće je omogućiti OpenID authentication za kubernetes service account kako bi mogli da preuzmu roles u AWS. Saznajte kako ovo funkcioniše na ovoj stranici.
GET Api Server Endpoint from a JWT Token
Dekodiranjem JWT tokena dobijamo cluster id i 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 'two chars' i 'number'. Ali, praveći neke testove sa svoje strane, vidim da se ovi često ponavljaju:
- gr7
- yl4
U svakom slučaju, to su samo 3 chars i možemo ih bruteforce-ovati. Koristite skriptu ispod 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
Remember to replace & .
Bypass CloudTrail
Ako napadač dobije credentials AWS-a sa permission over an EKS. Ako napadač podesi svoj kubeconfig (bez pozivanja update-kubeconfig) kao što je ranije objašnjeno, get-token ne generiše logs u Cloudtrail jer ne interaguje sa AWS API (samo lokalno kreira token).
Zato, kada napadač komunicira sa EKS clusterom, cloudtrail neće zabeležiti ništa vezano za ukradeni user i njegov pristup.
Imajte u vidu da EKS cluster može imati uključene logs koji će zabeležiti ovaj pristup (iako su, podrazumevano, isključeni).
EKS Ransom?
Podrazumevano, user ili role koji je kreirao cluster će UVEK imati admin privileges nad clusterom. I to je jedini "secure" access koji AWS ima nad Kubernetes clusterom.
Dakle, ako napadač kompromituje cluster koristeći fargate i ukloni sve ostale admins i dobriše AWS user/role koji je kreirao Cluster, napadač bi mogao da iznudi otkup za cluster.
Tip
Imajte na umu da, ako je cluster koristio EC2 VMs, moglo bi biti moguće dobiti Admin privileges sa Node i oporaviti cluster.
Zapravo, ako cluster koristi Fargate, mogli biste EC2 nodes ili prebaciti sve na EC2 u cluster i oporaviti ga pristupanjem tokenima na node-u.
{{#include ../../../../banners/hacktricks-training.md}}