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
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
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:
Port | Proces | Opis |
---|---|---|
443/TCP | kube-apiserver | Kubernetes API port |
2379/TCP | etcd | |
6666/TCP | etcd | etcd |
4194/TCP | cAdvisor | Metrike kontejnera |
6443/TCP | kube-apiserver | Kubernetes API port |
8443/TCP | kube-apiserver | Minikube API port |
8080/TCP | kube-apiserver | Nezaštićeni API port |
10250/TCP | kubelet | HTTPS API koji omogućava pristup u punom režimu |
10255/TCP | kubelet | Neautentifikovani samo za čitanje HTTP port: podovi, aktivni podovi i stanje čvora |
10256/TCP | kube-proxy | Kube Proxy server za proveru zdravlja |
9099/TCP | calico-felix | Server za proveru zdravlja za Calico |
6782-4/TCP | weave | Metrike i krajnje tačke |
30000-32767/TCP | NodePort | Proxy za usluge |
44134/TCP | Tiller | Helm usluga koja sluša |
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
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.
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:
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
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:
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)
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
Možete zloupotrebiti ovu uslugu da biste eskalirali privilegije unutar Kubernetes-a:
cAdvisor
Usluga korisna za prikupljanje metrika.
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.
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:
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 grupesystem: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:
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:
kubeletctl pods
/exec
Ova tačka omogućava lako izvršavanje koda unutar bilo kog kontejnera:
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:
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
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.