Pentesting Kubernetes Services

Reading time: 7 minutes

tip

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) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Kubernetes koristi nekoliko specifičnih mrežnih usluga koje možete pronaći izložene internetu ili u internoj mreži kada kompromitujete jedan pod.

Pronalaženje izloženih podova pomoću OSINT-a

Jedan od načina može biti pretraga za Identity LIKE "k8s.%.com" na crt.sh kako biste pronašli poddomene povezane sa kubernetesom. Drugi način može biti pretraga "k8s.%.com" na github-u i pretraga za YAML datotekama koje sadrže ovu string.

Kako Kubernetes izlaže usluge

Može biti korisno da razumete kako Kubernetes može izložiti usluge javno kako biste ih pronašli:

Exposing Services in Kubernetes

Pronalaženje izloženih podova putem skeniranja portova

Sledeći portovi mogu biti otvoreni u Kubernetes klasteru:

PortProcesOpis
443/TCPkube-apiserverKubernetes API port
2379/TCPetcd
6666/TCPetcdetcd
4194/TCPcAdvisorMetrike kontejnera
6443/TCPkube-apiserverKubernetes API port
8443/TCPkube-apiserverMinikube API port
8080/TCPkube-apiserverNezaštićeni API port
10250/TCPkubeletHTTPS API koji omogućava pristup u punom režimu
10255/TCPkubeletNeautentifikovani samo za čitanje HTTP port: podovi, aktivni podovi i stanje čvora
10256/TCPkube-proxyKube Proxy server za proveru zdravlja
9099/TCPcalico-felixServer za proveru zdravlja za Calico
6782-4/TCPweaveMetrike i krajnje tačke
30000-32767/TCPNodePortProxy za usluge
44134/TCPTillerHelm usluga koja sluša

Nmap

bash
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

Ovo je API Kubernetes servis sa kojim administratori obično komuniciraju koristeći alat kubectl.

Uobičajeni portovi: 6443 i 443, ali takođe 8443 u minikube i 8080 kao nesiguran.

bash
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

Proverite sledeću stranicu da biste saznali kako da dobijete osetljive podatke i izvršite osetljive radnje razgovarajući sa ovom uslugom:

Kubernetes Enumeration

Kubelet API

Ova usluga radi na svakoj čvoru klastera. To je usluga koja će kontrolisati podove unutar čvora. Komunicira sa kube-apiserver.

Ako pronađete ovu uslugu izloženu, možda ste pronašli neautentifikovani RCE.

Kubelet API

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

Ako je odgovor Unauthorized, to zahteva autentifikaciju.

Ako možete da navedete čvorove, možete dobiti listu kubelet krajnjih tačaka sa:

bash
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 (Samo za čitanje)

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

etcd API

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

Tiller

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

Možete zloupotrebiti ovu uslugu da biste eskalirali privilegije unutar Kubernetes-a:

cAdvisor

Usluga korisna za prikupljanje metrika.

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

NodePort

Kada je port izložen na svim čvorovima putem NodePort, isti port je otvoren na svim čvorovima, proksirajući saobraćaj u deklarisanu Service. Po defaultu, ovaj port će biti u opsegu 30000-32767. Tako da nove neproverene usluge mogu biti dostupne putem tih portova.

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

Ranljive pogrešne konfiguracije

Kube-apiserver anonimni pristup

Anonimni pristup kube-apiserver API krajnjim tačkama nije dozvoljen. Ali možete proveriti neke krajnje tačke:

Proveravanje ETCD anonimnog pristupa

ETCD čuva tajne klastera, konfiguracione datoteke i više osetljivih podataka. Po defaultu, ETCD ne može biti pristupljen anonimno, ali uvek je dobro proveriti.

Ako se ETCD može pristupiti anonimno, možda ćete morati da koristite etcdctl alat. Sledeća komanda će dobiti sve ključeve koji su sačuvani:

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

Kubelet RCE

The Kubelet documentation objašnjava da je podrazumevano anonimni pristup usluzi dozvoljen:

Omogućava anonimne zahteve ka Kubelet serveru. Zahtevi koji nisu odbijeni od strane druge metode autentifikacije se tretiraju kao anonimni zahtevi. Anonimni zahtevi imaju korisničko ime system:anonymous, i naziv grupe system:unauthenticated

Da biste bolje razumeli kako funkcioniše autentifikacija i autorizacija Kubelet API-ja, proverite ovu stranicu:

Kubelet Authentication & Authorization

Kubelet usluga API nije dokumentovana, ali izvorni kod se može pronaći ovde, a pronalaženje izloženih krajnjih tačaka je lako kao pokretanje:

bash
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/").

Svi zvuče zanimljivo.

Možete koristiti alat Kubeletctl za interakciju sa Kubelet-ima i njihovim krajnjim tačkama.

/pods

Ova krajnja tačka prikazuje podove i njihove kontejnere:

bash
kubeletctl pods

/exec

Ova tačka omogućava lako izvršavanje koda unutar bilo kog kontejnera:

bash
kubeletctl exec [command]

note

Da bi se izbegao ovaj napad, kubelet servis treba da se pokreće sa --anonymous-auth false i servis treba da bude segregiran na mrežnom nivou.

Proveravanje izlaganja informacija Kubelet-a (samo za čitanje)

Kada je kubelet port za čitanje izložen, postaje moguće da neovlašćene strane dobiju informacije sa API-ja. Izlaganje ovog porta može dovesti do otkrivanja raznih elemenata konfiguracije klastera. Iako informacije, uključujući imena podova, lokacije internih fajlova i druge konfiguracije, možda nisu kritične, njihovo izlaganje i dalje predstavlja bezbednosni rizik i treba ga izbegavati.

Primer kako se ova ranjivost može iskoristiti uključuje udaljenog napadača koji pristupa određenom URL-u. Navigacijom do http://<external-IP>:10255/pods, napadač može potencijalno dobiti osetljive informacije sa kubeleta:

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

Reference

Kubernetes Pentest Methodology Part 2

Threats & Research Archives - F-Secure Blog

tip

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) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks