Kubernetes Enumeration
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 imate kompromitovan pristup mašini, korisnik može imati pristup nekoj Kubernetes platformi. Token se obično nalazi u datoteci na koju ukazuje env var KUBECONFIG
ili unutar ~/.kube
.
U ovoj fascikli možete pronaći konfiguracione datoteke sa tokenima i konfiguracijama za povezivanje sa API serverom. U ovoj fascikli takođe možete pronaći fasciklu sa kešom sa informacijama prethodno preuzetim.
Ako ste kompromitovali pod unutar kubernetes okruženja, postoje druga mesta gde možete pronaći tokene i informacije o trenutnom K8 okruženju:
Pre nego što nastavite, ako ne znate šta je servis u Kubernetes-u, preporučujem da pratite ovu vezu i pročitate barem informacije o Kubernetes arhitekturi.
Uzimajući iz Kubernetes dokumentacije:
“Kada kreirate pod, ako ne navedete servisni nalog, automatski se dodeljuje podrazumevani servisni nalog u istoj imenskoj oblasti.”
ServiceAccount je objekat kojim upravlja Kubernetes i koristi se za pružanje identiteta procesima koji se izvršavaju u podu. Svaki servisni nalog ima tajnu povezanu sa njim i ova tajna sadrži nosilac tokena. Ovo je JSON Web Token (JWT), metoda za sigurno predstavljanje zahteva između dve strane.
Obično jedna od fascikli:
/run/secrets/kubernetes.io/serviceaccount
/var/run/secrets/kubernetes.io/serviceaccount
/secrets/kubernetes.io/serviceaccount
sadrži datoteke:
ca.crt: To je ca sertifikat za proveru kubernetes komunikacija
namespace: Ukazuje na trenutnu imensku oblast
token: Sadrži servisni token trenutnog poda.
Sada kada imate token, možete pronaći API server unutar promenljive okruženja KUBECONFIG
. Za više informacija pokrenite (env | set) | grep -i "kuber|kube
"
Token servisnog naloga se potpisuje ključem koji se nalazi u datoteci sa.key i validira ga sa.pub.
Podrazumevana lokacija na Kubernetes:
/etc/kubernetes/pki
Podrazumevana lokacija na Minikube:
/var/lib/localkube/certs
Hot pods su podovi koji sadrže privilegovani token servisnog naloga. Privilegovani token servisnog naloga je token koji ima dozvolu za obavljanje privilegovanih zadataka kao što su listanje tajni, kreiranje podova, itd.
Ako ne znate šta je RBAC, pročitajte ovu sekciju.
k9s: GUI koji enumeriše kubernetes klaster iz terminala. Proverite komande u https://k9scli.io/topics/commands/. Napišite :namespace
i izaberite sve da biste zatim pretražili resurse u svim imenskim oblastima.
k8slens: Nudi nekoliko besplatnih probnih dana: https://k8slens.dev/
Da biste enumerisali K8s okruženje, potrebni su vam neki od ovih:
validan autentifikacioni token. U prethodnoj sekciji smo videli gde da tražimo korisnički token i token servisnog naloga.
adresa (https://host:port) Kubernetes API. Ovo se obično može pronaći u promenljivim okruženja i/ili u kube konfiguracionoj datoteci.
Opcionalno: ca.crt za verifikaciju API servera. Ovo se može pronaći na istim mestima gde se može pronaći token. Ovo je korisno za verifikaciju sertifikata API servera, ali korišćenjem --insecure-skip-tls-verify
sa kubectl
ili -k
sa curl
vam neće biti potrebno.
Sa tim detaljima možete enumerisati kubernetes. Ako je API iz nekog razloga dostupan putem Interneta, možete jednostavno preuzeti te informacije i enumerisati platformu sa vaše mašine.
Međutim, obično je API server unutar interne mreže, stoga ćete morati da napravite tunel kroz kompromitovanu mašinu da biste mu pristupili sa vaše mašine, ili možete otpremiti kubectl binarni fajl, ili koristiti curl/wget/anything
za izvođenje sirovih HTTP zahteva ka API serveru.
list
and get
verbsSa get
dozvolama možete pristupiti informacijama o specifičnim resursima (describe
opcija u kubectl
) API:
Ако имате list
дозволу, можете да извршавате API захтеве за листање типа имовине (get
опција у kubectl
):
Ако имате watch
дозволу, можете извршавати API захтеве за праћење ресурса:
Oni otvaraju streaming vezu koja vam vraća puni manifest jednog Deployment-a svaki put kada se promeni (ili kada se kreira novi).
Sledeće kubectl
komande pokazuju kako da se navedu objekti. Ako želite da pristupite podacima, morate koristiti describe
umesto get
Iz unutrašnjosti poda možete koristiti nekoliko env varijabli:
Pod po defaultu može pristupiti kube-api serveru u imenskom prostoru kubernetes.default.svc
i možete videti kube mrežu u /etc/resolv.config
jer ćete ovde pronaći adresu kubernetes DNS servera (".1" iste opsega je kube-api krajnja tačka).
Imajući token i adresu API servera, koristite kubectl ili curl za pristup kao što je ovde naznačeno:
Podrazumevano, APISERVER komunicira sa https://
šemom
ako nema
https://
u URL-u, možete dobiti grešku poput Bad Request.
Možete pronaći službeni kubectl cheatsheet ovde. Cilj sledećih sekcija je da predstavi različite opcije za enumeraciju i razumevanje novog K8s na koji ste dobili pristup, u uređenom redosledu.
Da biste pronašli HTTP zahtev koji kubectl
šalje, možete koristiti parametar -v=8
Ako ste uspeli da ukradete akreditive nekih korisnika, možete ih konfigurisati lokalno koristeći nešto poput:
Sa ovim informacijama ćete znati sve usluge koje možete navesti
Drugi način da proverite svoje privilegije je korišćenje alata: https://github.com/corneliusweig/rakkess****
Možete saznati više o Kubernetes RBAC u:
Kubernetes Role-Based Access Control(RBAC)Kada znate koje privilegije imate, proverite sledeću stranicu da biste saznali da li ih možete zloupotrebiti za eskalaciju privilegija:
Abusing Roles/ClusterRoles in KubernetesKubernetes podržava više virtuelnih klastera koji se oslanjaju na isti fizički klaster. Ovi virtuelni klasteri se nazivaju imena prostora.
Ako možete da pročitate tajne, možete koristiti sledeće linije da dobijete privilegije povezane sa svakim tokenom:
Kao što je pomenuto na početku ove stranice kada se pod pokrene, obično mu se dodeljuje servisni nalog. Stoga, listanje servisnih naloga, njihovih dozvola i gde se pokreću može omogućiti korisniku da eskalira privilegije.
Deploymente specificiraju komponente koje treba pokrenuti.
Podovi su stvarni kontejneri koji će raditi.
Kubernetes usluge se koriste za izlaganje usluge na određenom portu i IP (koji će delovati kao balansirnik opterećenja za podove koji zapravo nude uslugu). Ovo je zanimljivo znati gde možete pronaći druge usluge koje možete pokušati napasti.
Dobijte sve čvorove konfigurisane unutar klastera.
DaeamonSets omogućava da se obezbedi da određeni pod radi na svim čvorovima klastera (ili na odabranim). Ako obrišete DaemonSet, podovi koje on upravlja će takođe biti uklonjeni.
Cron poslovi omogućavaju zakazivanje korišćenjem crontab sintakse za pokretanje poda koji će izvršiti neku akciju.
configMap uvek sadrži mnogo informacija i konfiguracionih fajlova koji se pružaju aplikacijama koje rade u kubernetesu. Obično možete pronaći mnogo lozinki, tajni, tokena koji se koriste za povezivanje i validaciju sa drugim internim/eksternim servisima.
Ako ste u mogućnosti da kreirate nove pode, možda ćete moći da pobegnete iz njih na čvor. Da biste to uradili, potrebno je da kreirate novi pod koristeći yaml datoteku, pređete na kreirani pod i zatim chroot-ujete u sistem čvora. Možete koristiti već postojeće pode kao referencu za yaml datoteku, jer prikazuju postojeće slike i putanje.
ako treba da kreirate pod na specifičnom čvoru, možete koristiti sledeću komandu da dobijete oznake na čvoru
k get nodes --show-labels
Obično, kubernetes.io/hostname i node-role.kubernetes.io/master su sve dobre oznake za selektovanje.
Zatim kreirate svoj attack.yaml fajl
Nakon toga kreirate pod
Sada možete preći na kreirani pod na sledeći način
I konačno se chroot-ujete u sistem čvora
Information obtained from: Kubernetes Namespace Breakout using Insecure Host Path Volume — Part 1 Attacking and Defending Kubernetes: Bust-A-Kube – Episode 1
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)