Kubernetes Pivoting to Clouds
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
As jy 'n k8s-kluster binne GCP bestuur, wil jy waarskynlik hê dat 'n toepassing wat binne die kluster loop, toegang tot GCP het. Daar is 2 algemene maniere om dit te doen:
'n Algemene manier om toegang tot 'n kubernetes-toepassing tot GCP te gee, is om:
'n GCP-diensrekening te skep
Die gewenste toestemmings daarop te bind
'n json-sleutel van die geskepte SA af te laai
Dit as 'n geheim binne die pod te monteer
Die GOOGLE_APPLICATION_CREDENTIALS omgewing veranderlike in te stel wat na die pad wys waar die json is.
Daarom, as 'n aanvaller, as jy 'n houer binne 'n pod kompromitteer, moet jy kyk vir daardie env veranderlike en json lêers met GCP-akkrediteer.
'n Manier om toegang tot 'n GSA aan 'n GKE-kluster te gee, is deur hulle op hierdie manier te bind:
Skep 'n Kubernetes-diensrekening in dieselfde naamruimte as jou GKE-kluster met die volgende opdrag:
Skep 'n Kubernetes Secret wat die geloofsbriewe van die GCP-diensrekening bevat waartoe jy toegang tot die GKE-kluster wil verleen. Jy kan dit doen met die gcloud
opdraglyn hulpmiddel, soos in die volgende voorbeeld getoon:
Bind die Kubernetes Secret aan die Kubernetes diensrekening met die volgende opdrag:
In die tweede stap is die bewyse van die GSA as geheim van die KSA gestel. Dan, as jy daardie geheim van binne die GKE kluster kan lees, kan jy eskaleer na daardie GCP diensrekening.
Met Werklas Identiteit kan ons 'n Kubernetes diensrekening konfigureer om as 'n Google diensrekening op te tree. Pods wat met die Kubernetes diensrekening loop, sal outomaties as die Google diensrekening autentiseer wanneer hulle toegang tot Google Cloud API's verkry.
Die eerste reeks stappe om hierdie gedrag te aktiveer is om Werklas Identiteit in GCP te aktiveer (stappe) en die GCP SA te skep wat jy wil hê k8s moet naboots.
Aktiveer Werklas Identiteit op 'n nuwe kluster
Skep/Opdateer 'n nuwe nodepool (Autopilot-klusters het dit nie nodig nie)
Skep die GCP Diensrekening om te verteenwoordig vanaf K8s met GCP-toestemmings:
Verbind met die kluster en skep die diensrekening om te gebruik
Bind die GSA met die KSA
Voer 'n pod uit met die KSA en kontroleer die toegang tot die GSA:
Kontroleer die volgende opdrag om te autentiseer indien nodig:
As 'n aanvaller binne K8s moet jy soek na SA's met die iam.gke.io/gcp-service-account
annotasie aangesien dit aandui dat die SA toegang tot iets in GCP kan hê. 'n Ander opsie sou wees om te probeer om elke KSA in die kluster te misbruik en te kyk of dit toegang het.
Van GCP is dit altyd interessant om die bindings te tel en te weet watter toegang jy aan SA's binne Kubernetes gee.
This is a script to easily iterate over the all the pods definitions looking for that annotation:
'n (verouderde) manier om IAM-rolle aan Pods te gee, is om 'n Kiam of 'n Kube2IAM bediener te gebruik. Basies moet jy 'n daemonset in jou kluster laat loop met 'n soort bevoorregte IAM-rol. Hierdie daemonset sal die een wees wat toegang tot IAM-rolle aan die pods wat dit nodig het, sal gee.
Eerstens moet jy watter rolle binne die naamruimte toeganklik is, konfigureer, en jy doen dit met 'n annotasie binne die naamruimte objek:
Sodra die naamruimte geconfigureer is met die IAM rolle wat die Pods kan hê, kan jy die rol wat jy op elke pod-definisie wil hê, aandui met iets soos:
As 'n aanvaller, as jy hierdie annotasies in pods of namespaces of 'n kiam/kube2iam bediener wat loop (waarskynlik in kube-system) vind, kan jy alle role wat reeds deur pods gebruik word en meer naboots (as jy toegang het tot die AWS-rekening, tel die rolle op).
Die IAM rol wat aangedui moet word, moet in dieselfde AWS-rekening wees as die kiam/kube2iam rol en daardie rol moet in staat wees om dit te benader.
Dit is die aanbevole manier deur AWS.
Eerstens moet jy ‘n OIDC-verskaffer vir die kluster skep.
Dan skep jy ‘n IAM rol met die toestemmings wat die SA benodig.
Skep ‘n vertrouensverhouding tussen die IAM rol en die SA naam (of die namespaces wat toegang tot die rol aan al die SAs van die namespace gee). Die vertrouensverhouding sal hoofsaaklik die OIDC-verskaffer naam, die namespace naam en die SA naam nagaan.
Laastens, skep ‘n SA met ‘n annotasie wat die ARN van die rol aandui, en die pods wat met daardie SA loop, sal toegang hê tot die token van die rol. Die token is geskryf binne ‘n lêer en die pad is gespesifiseer in AWS_WEB_IDENTITY_TOKEN_FILE
(standaard: /var/run/secrets/eks.amazonaws.com/serviceaccount/token
)
Om aws te kry met die token van /var/run/secrets/eks.amazonaws.com/serviceaccount/token
, voer uit:
As 'n aanvaller, as jy 'n K8s-kluster kan opnoem, kyk vir diensrekeninge met daardie annotasie om op te skaal na AWS. Om dit te doen, net exec/create 'n pod met een van die IAM bevoorregte diensrekeninge en steel die token.
Boonop, as jy binne 'n pod is, kyk vir omgewingsveranderlikes soos AWS_ROLE_ARN en AWS_WEB_IDENTITY_TOKEN.
Soms mag die Vertrouensbeleid van 'n rol sleg geconfigureer wees en in plaas daarvan om AssumeRole-toegang aan die verwagte diensrekening te gee, gee dit dit aan alle diensrekeninge. Daarom, as jy in staat is om 'n annotasie op 'n beheerde diensrekening te skryf, kan jy toegang tot die rol verkry.
Kyk na die volgende bladsy vir meer inligting:
Dit is 'n skrip om maklik oor al die pods en sas definisies te herhaal op soek na daardie annotasie:
Die vorige afdeling was oor hoe om IAM Rolle met pods te steel, maar let daarop dat 'n Node van die K8s-kluster 'n instansie binne die wolk gaan wees. Dit beteken dat die Node hoogs waarskynlik 'n nuwe IAM rol gaan hê wat jy kan steel (let daarop dat gewoonlik al die nodes van 'n K8s-kluster dieselfde IAM rol sal hê, so dit mag nie die moeite werd wees om op elke node te probeer kyk).
Daar is egter 'n belangrike vereiste om toegang tot die metadata-eindpunt vanaf die node te verkry, jy moet in die node wees (ssh-sessie?) of ten minste dieselfde netwerk hê:
Previously we have discussed how to attach IAM Roles to Pods or even how to escape to the Node to steal the IAM Role the instance has attached to it.
You can use the following script to steal your new hard worked IAM rol geloofsbriewe:
Leer & oefen AWS Hacking:HackTricks Opleiding AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Opleiding GCP Red Team Expert (GRTE)