# Pentesting Kubernetes Services

{{#include ../../../banners/hacktricks-training.md}}

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](https://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:

{{#ref}}
../exposing-services-in-kubernetes.md
{{#endref}}

## 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
```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:**

{{#ref}}
../kubernetes-enumeration.md
{{#endref}}

### 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:

![](https://www.cyberark.com/wp-content/uploads/2019/09/Kube-Pen-2-fig-5.png)

### **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**](https://github.com/etcd-io/etcd/blob/master/etcdctl/READMEv2.md) **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**](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) 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:

{{#ref}}
kubelet-authentication-and-authorization.md
{{#endref}}

**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**](https://github.com/cyberark/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](https://www.cyberark.com/wp-content/uploads/2019/09/KUbe-Pen-2-fig-6.png)

## Reference

{{#ref}}
https://www.cyberark.com/resources/threat-research-blog/kubernetes-pentest-methodology-part-2
{{#endref}}

{{#ref}}
https://labs.f-secure.com/blog/attacking-kubernetes-through-kubelet
{{#endref}}

{{#include ../../../banners/hacktricks-training.md}}
