
Atelier pratique de type capture-the-flag pour le OWASP Kubernetes Top 10 (2025). Exploitez 11 faiblesses réelles de clusters, capturez les drapeaux, puis appliquez les correctifs et vérifiez avec un vérificateur automatisé. S'exécute localement sur kind.
Un capture-the-flag construit sur l'OWASP Kubernetes Top Ten — 2025. Vous avez été embauché pour réaliser un test d'intrusion chez NimbusMart, une entreprise de e-commerce fictive dont le cluster a grandi plus vite que sa sécurité. Dix défis, un par risque OWASP (plus un bonus) — exploitez chaque faiblesse, capturez le drapeau, puis appliquez le correctif et prouvez-le avec le vérificateur.
La bible complète (entreprise, services, namespaces, schéma des drapeaux) se trouve dans labs/NIMBUSMART.md.
Tout s'exécute localement sur kind. N'exécutez jamais les manifests vulnérables sur un vrai cluster.
Construit par @hac01.
Ce n'est pas un diaporama — c'est un cluster Kubernetes vulnérable par conception, fonctionnel, accompagné des outils pour l'attaquer, le corriger et vérifier le correctif. À travers les onze défis, vous mettez la main à la pâte sur :
hostPath et
évasion de nœud (K01).ClusterRoles avec wildcard, ServiceAccounts sur-scopés,
et comment un token volé atteint tous les secrets (K02, K09).NetworkPolicy (K05).:latest non fiables et mutables envoyées en
production (bonus).Pour chaque défi, vous obtenez :
Installez ces éléments avant de commencer. Le script d'installation vérifie les quatre premiers et échoue rapidement avec un message clair si l'un d'eux manque.
| Outil | Pourquoi | Installation |
|---|---|---|
| Docker | Exécute le cluster kind et construit les images. Doit être en cours d'exécution. | Docker Desktop / Engine |
| kind | Cluster Kubernetes local dans Docker. | brew install kind |
| kubectl | Parler au cluster. | brew install kubectl |
| Go 1.21+ | Construit et exécute le binaire du vérificateur. | brew install go |
| Node.js 18+ | Uniquement pour exécuter l'application web localement (make web). Pas nécessaire pour la configuration en une commande dans le cluster. | brew install node |
Les commandes
brewsont pour macOS. Sous Linux, utilisez votre gestionnaire de paquets ou les instructions amont liées.
L'application web, un terminal dans le navigateur et le vérificateur peuvent tous s'exécuter dans le cluster kind. Une seule commande lance tout et affiche l'URL :
./setup.sh # ou : make up
# - crée le cluster kind, construit et charge les images, déploie, attend que tout soit prêt
# - Application web : http://localhost:30090
# - Terminal : le bouton 'Terminal' dans l'application web
./setup.sh (re)crée le cluster avec les bons mappages de ports, construit les deux
images (nimbusmart-ctf-web, nimbusmart-ctf-terminal), les charge dans kind, et
applique deploy/. La première exécution télécharge les images de base et prend environ 1 à 2 minutes.
./setup.sh # nouveau cluster + plateforme complète (supprime tout ancien cluster 'owasp-labs')
./setup.sh --keep # réutilise un cluster 'owasp-labs' existant s'il est présent
Ensuite, ouvrez http://localhost:30090, choisissez un défi, et utilisez le bouton Terminal dans le navigateur pour piloter le cluster.
Le pod du terminal s'exécute avec un ServiceAccount cluster-admin, donc le terminal dans le
navigateur pilote ce même cluster — exécutez kubectl apply -f labs/... et
owasp-k8s-checker --check kNN directement dedans.
Attention : le terminal dans le navigateur est effectivement cluster-admin via un WebSocket. Il est sûr uniquement parce qu'il est lié à votre cluster kind local et jetable sur
localhost. N'exposez jamais les ports30080/30090/30091sur un réseau non fiable.
kind delete cluster --name owasp-labs # ou : make cluster-down
.
├── setup.sh Bootstrap en une commande (cluster + images + déploiement)
├── Makefile Cibles pratiques — exécutez `make help` pour les lister
├── web/ Application Next.js + React (thème blanc/violet) — l'interface utilisateur
├── labs/ Manifests K8s réels par risque (vulnerable.yaml + fixed.yaml + README)
│ ├── NIMBUSMART.md Bible complète : entreprise, namespaces, schéma des drapeaux
│ └── kind-cluster.yaml Configuration partagée du cluster local (mappages de ports)
├── deploy/ Manifests de la plateforme dans le cluster (web + terminal + RBAC) + build.sh
├── terminal-server/ Backend WebSocket pour le terminal dans le navigateur
└── checker/ Binaire Go qui valide un cluster par rapport au Top 10
Cibles make utiles (make help affiche tout) :
| Cible | Ce qu'elle fait |
|---|---|
make up | En un coup : cluster + images + déploiement (exécute setup.sh) |
make web | Exécute l'application web en mode dev sur :3000 |
make cluster / make cluster-down | Crée / supprime le cluster kind local |
make scan | Exécute tous les vérificateurs sur le cluster actuel |
make check ID=k01 | Exécute un seul vérificateur |
make clean-labs | Supprime toutes les ressources des labs (réinitialisation entre les défis) |