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)
Ako pokrećete k8s klaster unutar GCP-a, verovatno želite da neka aplikacija koja se pokreće unutar klastera ima pristup GCP-u. Postoje 2 uobičajena načina da to uradite:
Uobičajen način da se omogući pristup kubernetes aplikaciji GCP-u je:
Kreirati GCP servisni nalog
Povezati željene dozvole
Preuzeti json ključ kreiranog SA
Montirati ga kao tajnu unutar poda
Postaviti GOOGLE_APPLICATION_CREDENTIALS promenljivu okruženja koja pokazuje na putanju gde se json nalazi.
Dakle, kao napadač, ako kompromitujete kontejner unutar poda, trebali biste proveriti tu env promenljivu i json fajlove sa GCP kredencijalima.
Način da se omogući pristup GSA GKE klasteru je povezivanje na sledeći način:
Kreirati Kubernetes servisni nalog u istom namespace-u kao vaš GKE klaster koristeći sledeću komandu:
Kreirajte Kubernetes Secret koji sadrži akreditive GCP servisnog naloga kojem želite da dodelite pristup GKE klasteru. To možete uraditi koristeći gcloud
komandnu liniju, kao što je prikazano u sledećem primeru:
Povežite Kubernetes tajnu sa Kubernetes servisnim nalogom koristeći sledeću komandu:
U drugom koraku su postavljene akreditivi GSA kao tajna KSA. Tada, ako možete pročitati tu tajnu iz unutrašnjosti GKE klastera, možete eskalirati na taj GCP servisni nalog.
Sa Workload Identity, možemo konfigurisati Kubernetes servisni nalog da deluje kao Google servisni nalog. Podovi koji rade sa Kubernetes servisnim nalogom će se automatski autentifikovati kao Google servisni nalog prilikom pristupanja Google Cloud API-ima.
Prva serija koraka za omogućavanje ovog ponašanja je da omogućite Workload Identity u GCP (koraci) i kreirate GCP SA koji želite da k8s imitira.
Omogućite Workload Identity na novom klasteru
Kreirajte/Ažurirajte novi nodepool (Autopilot klasteri to ne zahtevaju)
Kreirajte GCP servisni nalog za impersonaciju iz K8s sa GCP dozvolama:
Povežite se sa klasterom i napravite račun usluge koji ćete koristiti
Povežite GSA sa KSA
Pokrenite pod sa KSA i proverite pristup do GSA:
Proverite sledeću komandu za autentifikaciju u slučaju potrebe:
Kao napadač unutar K8s, trebali biste tražiti SAs sa iam.gke.io/gcp-service-account
anotacijom, jer to ukazuje da SA može pristupiti nečemu u GCP-u. Druga opcija bi bila da pokušate da zloupotrebite svaki KSA u klasteru i proverite da li ima pristup.
Iz GCP-a je uvek zanimljivo enumerisati veze i znati koji pristup dajete SAs unutar Kubernetes-a.
Ovo je skripta za lako iteriranje kroz sve definicije podova tražeći tu anotaciju:
Jedan (zastareo) način da se dodele IAM uloge Podovima je korišćenje Kiam ili Kube2IAM servera. U suštini, potrebno je pokrenuti daemonset u vašem klasteru sa nekom vrstom privilegovane IAM uloge. Ovaj daemonset će biti taj koji će omogućiti pristup IAM ulogama podovima kojima je to potrebno.
Prvo što treba da uradite je da konfigurišete koje uloge mogu biti pristupne unutar imenskog prostora, a to radite sa anotacijom unutar objekta imenskog prostora:
Kada je prostor imena konfiguran sa IAM rolama koje Podovi mogu imati, možete naznačiti ulogu koju želite u svakoj definiciji poda sa nečim poput:
Kao napadač, ako pronađete ove anotacije u podovima ili prostorima imena ili ako se kiami/kube2iam server pokreće (verovatno u kube-system) možete imitirati svaku rolu koja se već koristi od strane podova i više (ako imate pristup AWS nalogu, enumerišite uloge).
IAM uloga koju treba naznačiti mora biti u istom AWS nalogu kao kiami/kube2iam uloga i ta uloga mora imati pristup.
Ovo je preporučeni način od strane AWS.
Prvo treba da napravite OIDC provajder za klaster.
Zatim kreirajte IAM ulogu sa dozvolama koje će SA zahtevati.
Napravite odnos poverenja između IAM uloge i SA imenom (ili imenom prostora imena koje daje pristup ulozi svim SA-ima u prostoru imena). Odnos poverenja će uglavnom proveravati ime OIDC provajdera, ime prostora imena i ime SA.
Na kraju, napravite SA sa anotacijom koja ukazuje na ARN uloge, a podovi koji se pokreću sa tom SA će imati pristup tokenu uloge. Token je napisan unutar datoteke i putanja je specificirana u AWS_WEB_IDENTITY_TOKEN_FILE
(podrazumevano: /var/run/secrets/eks.amazonaws.com/serviceaccount/token
)
Da dobijete aws koristeći token iz /var/run/secrets/eks.amazonaws.com/serviceaccount/token
, pokrenite:
Kao napadač, ako možete da enumerišete K8s klaster, proverite za service accounts sa tom anotacijom da escalirate na AWS. Da biste to uradili, jednostavno exec/create pod koristeći jedan od IAM privileged service accounts i ukradite token.
Pored toga, ako ste unutar poda, proverite za env varijable kao što su AWS_ROLE_ARN i AWS_WEB_IDENTITY_TOKEN.
Ponekad Trust Policy jednog rola može biti loše konfigurisana i umesto da daje AssumeRole pristup očekivanom service account-u, daje ga svim service accounts. Stoga, ako ste u mogućnosti da napišete anotaciju na kontrolisanom service account-u, možete pristupiti rolu.
Proverite sledeću stranicu za više informacija:
Ovo je skripta za lako iteriranje kroz sve podove i sas definicije tražeći tu anotaciju:
Prethodna sekcija je govorila o tome kako ukrasti IAM uloge pomoću podova, ali imajte na umu da će čvor K8s klastera biti instanca unutar oblaka. To znači da je veoma verovatno da će Čvor imati novu IAM ulogu koju možete ukrasti (imajte na umu da obično svi čvorovi K8s klastera imaju istu IAM ulogu, pa možda nije vredno pokušavati proveravati svaki čvor).
Međutim, postoji važan zahtev za pristup metapodacima sa čvora, morate biti na čvoru (ssh sesija?) ili barem imati istu mrežu:
Prethodno smo razgovarali o tome kako da priključite IAM uloge na Podove ili čak kako da pobegnete na čvor da biste ukrali IAM ulogu koju instanca ima priključenu.
Možete koristiti sledeći skript da ukradete svoje nove, teško zarađene IAM uloge:
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)