
Laboratorio práctico de captura de banderas para el OWASP Kubernetes Top 10 (2025). Explota 11 debilidades reales de clúster, captura banderas, luego aplica correcciones y verifica con un comprobador automatizado. Se ejecuta localmente en kind.
Un capture-the-flag basado en el OWASP Kubernetes Top Ten — 2025. Te han contratado como red team para NimbusMart, una empresa ficticia de comercio electrónico cuyo clúster creció más rápido que su seguridad. Diez desafíos, uno por cada riesgo de OWASP (más un bonus): explota cada debilidad, captura la bandera, luego aplica la corrección y demuéstrala con el verificador.
La biblia del mundo (empresa, servicios, namespaces, esquema de banderas) está en labs/NIMBUSMART.md.
Todo se ejecuta localmente con kind. Nunca ejecutes los manifiestos vulnerables contra un clúster real.
Creado por @hac01.
Esto no es una presentación de diapositivas, es un clúster Kubernetes funcional y vulnerable por diseño, junto con las herramientas para atacarlo, corregirlo y verificar la corrección. En los once desafíos practicarás con:
hostPath y
escape de nodo (K01).ClusterRoles comodín, ServiceAccounts con demasiado ámbito,
y cómo un solo token robado llega a todos los secretos (K02, K09).NetworkPolicy (K05).:latest no confiables y mutables enviadas a producción (bonus).Por cada desafío obtienes:
Instala estos antes de empezar. El script de configuración verifica los primeros cuatro y falla rápidamente con un mensaje claro si falta alguno.
Los comandos
brewson para macOS. En Linux usa tu gestor de paquetes o las instrucciones enlazadas.
La aplicación web, un terminal en el navegador y el verificador pueden ejecutarse dentro del clúster kind. Un solo comando levanta todo e imprime la URL:
./setup.sh # o: make up
# - crea el clúster kind, construye y carga imágenes, despliega, espera a que esté listo
# - App web: http://localhost:30090
# - Terminal: el botón 'Terminal' en la aplicación web
./setup.sh (re)crea el clúster con los mapeos de puertos correctos, construye las dos
imágenes (nimbusmart-ctf-web, nimbusmart-ctf-terminal), las carga en kind y
aplica deploy/. La primera ejecución descarga las imágenes base y tarda ~1-2 minutos.
./setup.sh # clúster nuevo + plataforma completa (elimina cualquier clúster 'owasp-labs' antiguo)
./setup.sh --keep # reutiliza un clúster 'owasp-labs' existente si está presente
Luego abre http://localhost:30090, elige un desafío y usa el botón Terminal en el navegador para manejar el clúster.
El pod del terminal se ejecuta como una ServiceAccount con privilegios cluster-admin, por lo que el terminal en el
navegador maneja este mismo clúster — ejecuta kubectl apply -f labs/... y
owasp-k8s-checker --check kNN directamente allí.
Advertencia: el terminal en el navegador es efectivamente cluster-admin sobre un WebSocket. Solo es seguro porque está vinculado a tu clúster kind local y desechable en
localhost. Nunca expongas los puertos30080/30090/30091a una red no confiable.
kind delete cluster --name owasp-labs # o: make cluster-down
.
├── setup.sh Arranque con un solo comando (clúster + imágenes + despliegue)
├── Makefile Objetivos de conveniencia — ejecuta `make help` para listarlos
├── web/ App Next.js + React (tema blanco/morado) — la interfaz
├── labs/ Manifiestos K8s reales por riesgo (vulnerable.yaml + fixed.yaml + README)
│ ├── NIMBUSMART.md Biblia del mundo: empresa, namespaces, esquema de banderas
│ └── kind-cluster.yaml Configuración del clúster local compartido (mapeos de puertos)
├── deploy/ Manifiestos de la plataforma dentro del clúster (web + terminal + RBAC) + build.sh
├── terminal-server/ Backend WebSocket para el terminal en el navegador
└── checker/ Binario Go que valida un clúster contra el Top 10
Objetivos útiles de make (make help muestra todos):
Cada desafío es una debilidad real en el clúster de NimbusMart — elige un objetivo, explótalo, captura la bandera, luego parchéala y demuestra la corrección con el verificador.
Qué cambió desde 2022: autorización (antes RBAC) ampliada; secretos, red, autenticación y registro reordenados; se añadieron Componentes demasiado expuestos (K06) y Movimiento lateral clúster-a-nube (K08); componentes mal configurados y obsoletos fusionados en K07; Cadena de suministro movida a un desafío bonus. Consulta
labs/NIMBUSMART.mdpara el mapa completo de desafío-a-servicio-a- debilidad, dificultad y puntos (2000 en 10 desafíos, +300 de bonus).
¿Prefieres ejecutar la interfaz localmente y manejar los laboratorios desde tu propio shell? Puedes conectar las piezas manualmente.
cd web
npm install
npm run dev
# abre http://localhost:3000 (o: make web)
El backend del terminal se ejecuta por separado en :30091 usando tu ~/.kube/config:
make terminal-local
kind create cluster --config labs/kind-cluster.yaml # o: make cluster
kubectl config use-context kind-owasp-labs
Cada desafío tiene su propio README, pero el patrón es el mismo:
# algunos desafíos siembran primero un objetivo (un archivo de nodo, un secreto de operaciones, ...)
kubectl apply -f labs/k01-insecure-workload/setup.yaml # solo si está presente
# despliega el recurso vulnerable y explótalo para capturar la bandera
kubectl apply -f labs/k01-insecure-workload/vulnerable.yaml
# ...sigue el briefing de la misión / pistas en la aplicación web, obtén FLAG{...}, envíalo...
# aplica la versión endurecida y confirma que el camino a la bandera está cerrado
kubectl delete -f labs/k01-insecure-workload/vulnerable.yaml
kubectl apply -f labs/k01-insecure-workload/fixed.yaml
Reinicia todo entre desafíos con make clean-labs.
cd checker
go run . --list # muestra todas las verificaciones
go run . --check k01 # ejecuta una sola verificación
go run . --all # escanea todo el clúster
go run . --all --json # legible por máquina (para CI)
go run . --all -n apps # limita a un namespace
El verificador sale con código distinto de cero si alguna verificación falla, por lo que puede ser una puerta de CI.
Construye un binario independiente:
cd checker
go build -o owasp-k8s-checker . # o: make checker
./owasp-k8s-checker --all
Cada checker/checks/kNN.go valida el mismo control que enseña el laboratorio correspondiente.
Despliega el fixed.yaml, ejecuta go run . --check kNN, y deberías ver PASS.
Despliega el vulnerable.yaml y la misma verificación reporta los hallazgos específicos.
Seguridad: los manifiestos vulnerables son deliberadamente explotables. Usa solo un clúster local y desechable (
kind/minikube). Bórralo cuando termines:kind delete cluster --name owasp-labs.
| Herramienta | Por qué | Instalar |
|---|
| Docker | Ejecuta el clúster kind y construye imágenes. Debe estar en ejecución. | Docker Desktop / Engine |
| kind | Clúster Kubernetes local en Docker. | brew install kind |
| kubectl | Habla con el clúster. | brew install kubectl |
| Go 1.21+ | Construye y ejecuta el binario verificador. | brew install go |
| Node.js 18+ | Solo para ejecutar la aplicación web localmente (make web). No es necesario para la configuración dentro del clúster con un solo comando. | brew install node |
| Objetivo | Qué hace |
|---|
make up | Un solo paso: clúster + imágenes + despliegue (ejecuta setup.sh) |
make web | Ejecuta la app web en modo dev en :3000 |
make cluster / make cluster-down | Crear / eliminar el clúster kind local |
make scan | Ejecuta todos los verificadores contra el clúster actual |
make check ID=k01 | Ejecuta una sola verificación |
make clean-labs | Elimina todos los recursos del laboratorio (reinicio entre desafíos) |
| ID | Riesgo | Carpeta del laboratorio |
|---|
| K01 | Configuraciones de carga de trabajo inseguras | labs/k01-insecure-workload |
| K02 | Configuraciones de autorización demasiado permisivas | labs/k02-authorization |
| K03 | Fallos en la gestión de secretos | labs/k03-secrets |
| K04 | Falta de aplicación de políticas a nivel de clúster | labs/k04-policy-enforcement |
| K05 | Faltan controles de segmentación de red | labs/k05-network-segmentation |
| K06 | Componentes Kubernetes demasiado expuestos | labs/k06-exposed-components |
| K07 | Componentes del clúster mal configurados y vulnerables | labs/k07-cluster-components |
| K08 | Movimiento lateral clúster-a-nube | labs/k08-cluster-to-cloud |
| K09 | Mecanismos de autenticación rotos | labs/k09-authentication |
| K10 | Registro y monitoreo inadecuados | labs/k10-logging-monitoring |
| Bonus | Vulnerabilidades en la cadena de suministro | labs/kbonus-supply-chain |