Pentesting Kubernetes Services

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Kubernetes gebruik verskeie spesifieke netwerkdienste wat jy mag vind blootgestel aan die Internet of in ’n interne netwerk sodra jy een pod gekompromitteer het.

Finding exposed pods with OSINT

Een manier kan wees om te soek na Identity LIKE "k8s.%.com" in crt.sh om subdomeine te vind wat verband hou met kubernetes. ’n Ander manier kan wees om te soek na "k8s.%.com" in github en te soek na YAML-lêers wat die string bevat.

How Kubernetes Exposes Services

Dit kan nuttig wees vir jou om te verstaan hoe Kubernetes dienste publiek kan blootstel om hulle te vind:

Exposing Services in Kubernetes

Finding Exposed pods via port scanning

Die volgende poorte mag oop wees in ’n Kubernetes-kluster:

PortProcessDescription
443/TCPkube-apiserverKubernetes API port
2379/TCPetcd
6666/TCPetcdetcd
4194/TCPcAdvisorContainer metrics
6443/TCPkube-apiserverKubernetes API port
8443/TCPkube-apiserverMinikube API port
8080/TCPkube-apiserverInsecure API port
10250/TCPkubeletHTTPS API which allows full mode access
10255/TCPkubeletUnauthenticated read-only HTTP port: pods, running pods and node state
10256/TCPkube-proxyKube Proxy health check server
9099/TCPcalico-felixHealth check server for Calico
6782-4/TCPweaveMetrics and endpoints
30000-32767/TCPNodePortProxy to the services
44134/TCPTillerHelm service listening

Nmap

nmap -n -T4 -p 443,2379,6666,4194,6443,8443,8080,10250,10255,10256,9099,6782-6784,30000-32767,44134 <pod_ipaddress>/16

Kube-apiserver

Dit is die API Kubernetes diens waarmee die administrateurs gewoonlik kommunikeer deur die hulpmiddel kubectl te gebruik.

Gewone poorte: 6443 en 443, maar ook 8443 in minikube en 8080 as onveilig.

curl -k https://<IP Address>:(8|6)443/swaggerapi
curl -k https://<IP Address>:(8|6)443/healthz
curl -k https://<IP Address>:(8|6)443/api/v1

Kyk na die volgende bladsy om te leer hoe om sensitiewe data te verkry en sensitiewe aksies uit te voer deur met hierdie diens te praat:

Kubernetes Enumeration

Kubelet API

Hierdie diens loop in elke knoop van die kluster. Dit is die diens wat die pods binne die knoop sal beheer. Dit praat met die kube-apiserver.

As jy hierdie diens blootgestel vind, het jy dalk ’n onaangetekende RCE gevind.

Kubelet API

curl -k https://<IP address>:10250/metrics
curl -k https://<IP address>:10250/pods

As die antwoord Unauthorized is, benodig dit verifikasie.

As jy knope kan lys, kan jy ’n lys van kubelets eindpunte kry met:

kubectl get nodes -o custom-columns='IP:.status.addresses[0].address,KUBELET_PORT:.status.daemonEndpoints.kubeletEndpoint.Port' | grep -v KUBELET_PORT | while IFS='' read -r node; do
ip=$(echo $node | awk '{print $1}')
port=$(echo $node | awk '{print $2}')
echo "curl -k --max-time 30 https://$ip:$port/pods"
echo "curl -k --max-time 30 https://$ip:2379/version" #Check  also for etcd
done

kubelet (Slegs lees)

curl -k https://<IP Address>:10255
http://<external-IP>:10255/pods

etcd API

curl -k https://<IP address>:2379
curl -k https://<IP address>:2379/version
etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only

Tiller

helm --host tiller-deploy.kube-system:44134 version

U kan hierdie diens misbruik om bevoegdhede binne Kubernetes te verhoog:

cAdvisor

Diens nuttig om metings te versamel.

curl -k https://<IP Address>:4194

NodePort

Wanneer ’n poort in al die nodes blootgestel word via ’n NodePort, word dieselfde poort in al die nodes geopen wat die verkeer na die verklaarde Service proxy. Standaard sal hierdie poort in die reeks 30000-32767 wees. Dus kan nuwe ongekontroleerde dienste deur daardie poorte toeganklik wees.

sudo nmap -sS -p 30000-32767 <IP>

Kwetsbare Misconfigurasies

Kube-apiserver Anonieme Toegang

Anonieme toegang tot kube-apiserver API eindpunte is nie toegelaat nie. Maar jy kan sommige eindpunte nagaan:

Kontroleer vir ETCD Anonieme Toegang

Die ETCD stoor die kluster geheime, konfigurasie lêers en meer sensitiewe data. Deur standaard kan die ETCD nie anoniem toeganklik wees nie, maar dit is altyd goed om te kontroleer.

As die ETCD anoniem toeganklik is, moet jy dalk die etcdctl instrument gebruik. Die volgende opdrag sal al die sleutels wat gestoor is, kry:

etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only

Kubelet RCE

Die Kubelet dokumentasie verduidelik dat anonieme toegang tot die diens standaard toegelaat word:

Stel anonieme versoeke aan die Kubelet bediener in. Versoeke wat nie deur ’n ander verifikasiemetode verwerp word nie, word as anonieme versoeke behandel. Anonieme versoeke het ’n gebruikersnaam van system:anonymous, en ’n groepnaam van system:unauthenticated

Om beter te verstaan hoe die verifikasie en magtiging van die Kubelet API werk, kyk na hierdie bladsy:

Kubelet Authentication & Authorization

Die Kubelet diens API is nie gedokumenteer nie, maar die bronnekode kan hier gevind word en om die blootgestelde eindpunte te vind is so maklik soos om te hardloop:

curl -s https://raw.githubusercontent.com/kubernetes/kubernetes/master/pkg/kubelet/server/server.go | grep 'Path("/'

Path("/pods").
Path("/run")
Path("/exec")
Path("/attach")
Path("/portForward")
Path("/containerLogs")
Path("/runningpods/").

Almal klink interessant.

Jy kan die Kubeletctl hulpmiddel gebruik om met Kubelets en hul eindpunte te kommunikeer.

/pods

Hierdie eindpunt lys pods en hul houers:

kubeletctl pods

/exec

Hierdie eindpunt maak dit baie maklik om kode binne enige houer uit te voer:

kubeletctl exec [command]

Note

Om hierdie aanval te vermy, moet die kubelet diens met --anonymous-auth false gedraai word en die diens moet op netwerkvlak gesegregeer word.

Kontroleer Kubelet (Lees Slegs Poort) Inligting Blootstelling

Wanneer ’n kubelet lees-slegs poort blootgestel word, word dit moontlik vir ongeoorloofde partye om inligting van die API te verkry. Die blootstelling van hierdie poort kan lei tot die bekendmaking van verskeie kluster konfigurasie-elemente. Alhoewel die inligting, insluitend pod name, plekke van interne lêers, en ander konfigurasies, dalk nie krities is nie, stel die blootstelling steeds ’n sekuriteitsrisiko voor en moet vermy word.

’n Voorbeeld van hoe hierdie kwesbaarheid uitgebuit kan word, behels ’n afstandaanvaller wat toegang tot ’n spesifieke URL verkry. Deur na http://<external-IP>:10255/pods te navigeer, kan die aanvaller moontlik sensitiewe inligting van die kubelet verkry:

https://www.cyberark.com/wp-content/uploads/2019/09/KUbe-Pen-2-fig-6.png

Verwysings

Kubernetes Pentest Methodology Part 2

https://labs.f-secure.com/blog/attacking-kubernetes-through-kubelet

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks