
Laboratorio pratico capture-the-flag per OWASP Kubernetes Top 10 (2025). Sfrutta 11 vulnerabilità reali del cluster, cattura le flag, quindi applica le correzioni e verifica con un controllore automatico. Viene eseguito localmente su kind.
Una caccia alla bandiera (capture-the-flag) basata sul OWASP Kubernetes Top 10 — 2025. Sei stato assunto per fare red-teaming su NimbusMart, un'azienda fittizia di e-commerce il cui cluster è cresciuto più velocemente della sua sicurezza. Dieci sfide, una per rischio OWASP (più un bonus) — sfrutta ogni debolezza, cattura la bandiera, poi applica la correzione e verificala con il checker.
La bibbia del mondo (azienda, servizi, namespace, schema delle bandiere) si trova in labs/NIMBUSMART.md.
Tutto gira localmente su kind. Non eseguire mai i manifest vulnerabili su un cluster reale.
Creato da @hac01.
Questo non è un set di diapositive — è un cluster Kubernetes funzionante e vulnerabile di progettazione, più gli strumenti per attaccarlo, correggerlo e verificare la correzione. Attraverso le undici sfide acquisisci esperienza pratica con:
hostPath e fuga dal nodo (K01).ClusterRole con wildcard, ServiceAccounts con ambito eccessivo, e come un singolo token rubato può accedere a tutti i segreti (K02, K09).NetworkPolicy (K05).:latest non fidate e mutabili spedite in produzione (bonus).Per ogni sfida ottieni:
Installa questi prima di iniziare. Lo script di setup controlla i primi quattro e fallisce rapidamente con un messaggio chiaro se mancano.
I comandi
brewsono per macOS. Su Linux usa il tuo gestore di pacchetti o le istruzioni upstream collegate.
L'app web, un terminale nel browser e il checker possono essere eseguiti all'interno del cluster kind. Un comando avvia tutto e stampa l'URL:
./setup.sh # or: make up
# - creates the kind cluster, builds and loads images, deploys, waits for ready
# - Web app: http://localhost:30090
# - Terminal: the 'Terminal' button in the web app
./setup.sh (ri)crea il cluster con i giusti mapping di porta, costruisce le due immagini (nimbusmart-ctf-web, nimbusmart-ctf-terminal), le carica in kind e applica deploy/. Al primo avvio scarica le immagini di base e impiega circa 1-2 minuti.
./setup.sh # fresh cluster + full platform (deletes any old 'owasp-labs' cluster)
./setup.sh --keep # reuse an existing 'owasp-labs' cluster if present
Poi apri http://localhost:30090, scegli una sfida e usa il pulsante Terminale nel browser per guidare il cluster.
Il pod terminale viene eseguito come ServiceAccount cluster-admin, quindi il terminale nel browser guida esattamente questo cluster — esegui kubectl apply -f labs/... e owasp-k8s-checker --check kNN direttamente lì.
Avvertenza: il terminale nel browser è di fatto cluster-admin su un WebSocket. È sicuro solo perché è legato al tuo cluster kind locale e usa e getta su
localhost. Non esporre mai le porte30080/30090/30091a una rete non fidata.
kind delete cluster --name owasp-labs # or: make cluster-down
.
├── setup.sh Bootstrap con un comando (cluster + immagini + deploy)
├── Makefile Target di comodità — esegui `make help` per elencarli
├── web/ App Next.js + React (tema bianco/viola) — l'interfaccia utente
├── labs/ Manifest K8s reali per rischio (vulnerable.yaml + fixed.yaml + README)
│ ├── NIMBUSMART.md Bibbia del mondo: azienda, namespace, schema delle bandiere
│ └── kind-cluster.yaml Configurazione cluster locale condivisa (mapping di porta)
├── deploy/ Manifest della piattaforma in-cluster (web + terminal + RBAC) + build.sh
├── terminal-server/ Backend WebSocket per il terminale nel browser
└── checker/ Binario Go che convalida un cluster rispetto alla Top 10
Target make utili (make help mostra tutti):
Ogni sfida è una vera debolezza nel cluster di NimbusMart — scegli un bersaglio, sfruttalo, cattura la bandiera, poi correggilo e dimostra la correzione con il checker.
Cosa è cambiato rispetto al 2022: l'autorizzazione (era RBAC) è stata ampliata; riordinati segreti, rete, autenticazione e logging; Componenti eccessivamente esposti (K06) e Movimento laterale dal cluster al cloud (K08) aggiunti; componenti malconfigurati e obsoleti unificati in K07; Supply Chain spostata in una sfida bonus. Vedi
labs/NIMBUSMART.mdper la mappa completa sfida-servizio-debolezza, difficoltà e punti (2000 in 10 sfide, +300 bonus).
Preferisci eseguire l'interfaccia utente localmente e guidare i lab dal tuo terminale? Puoi collegare i pezzi manualmente.
cd web
npm install
npm run dev
# open http://localhost:3000 (or: make web)
Il backend del terminale viene eseguito separatamente su :30091 usando il tuo ~/.kube/config:
make terminal-local
kind create cluster --config labs/kind-cluster.yaml # or: make cluster
kubectl config use-context kind-owasp-labs
Ogni sfida ha il proprio README, ma lo schema è lo stesso:
# some challenges seed a target first (a node file, an ops secret, ...)
kubectl apply -f labs/k01-insecure-workload/setup.yaml # only if present
# deploy the vulnerable resource and exploit it to capture the flag
kubectl apply -f labs/k01-insecure-workload/vulnerable.yaml
# ...follow the mission briefing / hints in the web app, grab FLAG{...}, submit it...
# apply the hardened version and confirm the flag path is closed
kubectl delete -f labs/k01-insecure-workload/vulnerable.yaml
kubectl apply -f labs/k01-insecure-workload/fixed.yaml
Ripristina tutto tra le sfide con make clean-labs.
cd checker
go run . --list # show all checks
go run . --check k01 # run a single check
go run . --all # scan the whole cluster
go run . --all --json # machine-readable (for CI)
go run . --all -n apps # scope to a namespace
Il checker esce con valore diverso da zero se un qualsiasi check fallisce, quindi può essere usato come gate CI.
Costruisci un binario autonomo:
cd checker
go build -o owasp-k8s-checker . # or: make checker
./owasp-k8s-checker --all
Ogni checker/checks/kNN.go convalida lo stesso controllo insegnato dal lab corrispondente. Esegui il deploy di fixed.yaml, esegui go run . --check kNN, e dovresti vedere PASS. Esegui il deploy di vulnerable.yaml e lo stesso check riporta i reperti specifici.
Sicurezza: i manifest vulnerabili sono intenzionalmente sfruttabili. Usa solo un cluster
kind/minikubelocale e usa e getta. Eliminalo quando hai finito:kind delete cluster --name owasp-labs.
| Strumento | Perché | Installazione |
|---|
| Docker | Esegue il cluster kind e costruisce le immagini. Deve essere in esecuzione. | Docker Desktop / Engine |
| kind | Cluster Kubernetes locale in Docker. | brew install kind |
| kubectl | Parla con il cluster. | brew install kubectl |
| Go 1.21+ | Costruisce ed esegue il binario del checker. | brew install go |
| Node.js 18+ | Solo per eseguire l'app web localmente (make web). Non necessario per il setup in-cluster con un comando. | brew install node |
| Target | Cosa fa |
|---|
make up | Tutto in un colpo: cluster + immagini + deploy (esegue setup.sh) |
make web | Esegue l'app web in modalità sviluppo su :3000 |
make cluster / make cluster-down | Crea / elimina il cluster kind locale |
make scan | Esegue tutti i checker sul cluster corrente |
make check ID=k01 | Esegue un singolo check |
make clean-labs | Elimina tutte le risorse del lab (reset tra le sfide) |
| ID | Rischio | Cartella lab |
|---|
| K01 | Configurazioni dei carichi di lavoro non sicure | labs/k01-insecure-workload |
| K02 | Configurazioni di autorizzazione eccessivamente permissive | labs/k02-authorization |
| K03 | Fallimenti nella gestione dei segreti | labs/k03-secrets |
| K04 | Mancanza di applicazione delle policy a livello di cluster | labs/k04-policy-enforcement |
| K05 | Mancanza di controlli di segmentazione di rete | labs/k05-network-segmentation |
| K06 | Componenti Kubernetes eccessivamente esposti | labs/k06-exposed-components |
| K07 | Componenti del cluster malconfigurati e vulnerabili | labs/k07-cluster-components |
| K08 | Movimento laterale dal cluster al cloud | labs/k08-cluster-to-cloud |
| K09 | Meccanismi di autenticazione difettosi | labs/k09-authentication |
| K10 | Logging e monitoraggio inadeguati | labs/k10-logging-monitoring |
| Bonus | Vulnerabilità della supply chain | labs/kbonus-supply-chain |