亲自动手的夺旗实验,针对 OWASP Kubernetes Top 10 (2025)。利用 11 个真实世界的集群弱点,获取旗帜,然后应用修复并通过自动检查器验证。在本地 kind 上运行。
基于 OWASP Kubernetes Top 10 — 2025 搭建的 夺旗赛(capture-the-flag)。
你被聘为红队成员,攻击 NimbusMart(一家虚构的电商公司),其集群增长速度快于安全建设。十个挑战对应十个 OWASP 风险(外加一个额外关卡)—— 利用每个弱点,夺旗,然后应用修复并用检查器验证。
世界设定(公司、服务、命名空间、旗帜方案)详见 labs/NIMBUSMART.md。
一切在本地 kind 上运行。切勿在真实集群上运行这些脆弱清单。
由 @hac01 构建。
这不是幻灯片 —— 而是一个可运行的、故意设计为脆弱的 Kubernetes 集群,以及用于攻击、修复和验证修复的工具。在十一个挑战中,你将动手实践:
hostPath 挂载和节点逃逸(K01)。ClusterRole、权限过大的 ServiceAccount,以及一个被盗令牌如何触及所有 Secret(K02、K09)。NetworkPolicy 封锁(K05)。:latest 镜像被推送到生产环境(额外)。对于每个挑战,你将获得:
在开始之前安装这些工具。设置脚本会检查前四个工具,如果缺失会立刻失败并给出清晰提示。
brew命令适用于 macOS。在 Linux 上请使用你的包管理器或参考上述上游安装指引。
Web 应用、浏览器内终端和检查器都可以在 kind 集群内运行。一条命令即可启动所有内容并打印 URL:
./setup.sh # 或:make up
# - 创建 kind 集群、构建并加载镜像、部署、等待就绪
# - Web 应用:http://localhost:30090
# - 终端:Web 应用中的“终端”按钮
./setup.sh(重新)创建带有正确端口映射的集群,构建两个镜像(nimbusmart-ctf-web、nimbusmart-ctf-terminal),加载到 kind 中,并应用 deploy/。首次运行时会拉取基础镜像,大约需要 1-2 分钟。
./setup.sh # 全新集群 + 完整平台(删除任何旧 'owasp-labs' 集群)
./setup.sh --keep # 如果存在则重用现有的 'owasp-labs' 集群
然后打开 **http://localhost:30090**,选择一个挑战,并使用浏览器中的**终端**按钮驱动集群。
终端 Pod 以 cluster-admin ServiceAccount 运行,因此浏览器中的终端驱动的就是这个集群 —— 直接运行 kubectl apply -f labs/... 和 owasp-k8s-checker --check kNN。
警告: 浏览器内终端实际上是 WebSocket 上的 cluster-admin。它之所以安全,是因为它绑定在你本地的、一次性的 kind 集群上,地址为
localhost。切勿将端口30080/30090/30091暴露给不可信网络。
kind delete cluster --name owasp-labs # 或:make cluster-down
.
├── setup.sh 单命令引导(集群 + 镜像 + 部署)
├── Makefile 便利目标 —— 运行 `make help` 列出所有目标
├── web/ Next.js + React 应用(白/紫主题)—— 用户界面
├── labs/ 每个风险对应的真实 K8s 清单(vulnerable.yaml + fixed.yaml + README)
│ ├── NIMBUSMART.md 世界设定:公司、命名空间、旗帜方案
│ └── kind-cluster.yaml 共享本地集群配置(端口映射)
├── deploy/ 集群内平台清单(web + terminal + RBAC)+ build.sh
├── terminal-server/ 浏览器内终端的 WebSocket 后端
└── checker/ 用于根据 Top 10 验证集群的 Go 二进制文件
有用的 make 目标(make help 显示所有):
每个挑战都是 NimbusMart 集群中的一个真实弱点 —— 选择一个目标,利用它,夺旗,然后打补丁并用检查器证明修复。
与 2022 版的区别: 授权(原 RBAC)范围扩大;Secret、网络、认证和日志记录顺序调整;新增过度暴露的组件(K06)和集群到云的横向移动(K08);配置不当与过时组件合并为 K07;供应链移至额外挑战。详见
labs/NIMBUSMART.md中完整的挑战-服务-弱点映射、难度和分数(10 个挑战共 2000 分,额外 +300 分)。
希望在本机运行 UI 并从自己的 shell 驱动实验?你可以手动组合各部件。
cd web
npm install
npm run dev
# 打开 http://localhost:3000 (或:make web)
终端后端在 :30091 上单独运行,使用你的 ~/.kube/config:
make terminal-local
kind create cluster --config labs/kind-cluster.yaml # 或:make cluster
kubectl config use-context kind-owasp-labs
每个挑战都有各自的 README,但模式相同:
# 某些挑战会先播种一个目标(节点文件、运维 Secret 等)
kubectl apply -f labs/k01-insecure-workload/setup.yaml # 仅当存在时
# 部署脆弱资源并利用它以夺旗
kubectl apply -f labs/k01-insecure-workload/vulnerable.yaml
# ...按照 Web 应用中的任务简报/提示操作,获取 FLAG{...},提交...
# 应用加固版本并确认旗帜路径已关闭
kubectl delete -f labs/k01-insecure-workload/vulnerable.yaml
kubectl apply -f labs/k01-insecure-workload/fixed.yaml
使用 make clean-labs 在挑战之间重置所有内容。
cd checker
go run . --list # 显示所有检查
go run . --check k01 # 运行单个检查
go run . --all # 扫描整个集群
go run . --all --json # 机器可读格式(适用于 CI)
go run . --all -n apps # 限定命名空间
检查器在任意检查失败时返回非零退出码,因此可用于 CI 门禁。
构建独立二进制文件:
cd checker
go build -o owasp-k8s-checker . # 或:make checker
./owasp-k8s-checker --all
每个 checker/checks/kNN.go 验证的是对应实验教授的控制项。部署 fixed.yaml,运行 go run . --check kNN,你应该会看到 PASS。部署 vulnerable.yaml,相同的检查会报告具体的发现问题。
安全提示: 脆弱清单是故意可被利用的。请仅使用本地、一次性的
kind/minikube集群。完成后删除它:kind delete cluster --name owasp-labs。
| 工具 | 用途 | 安装 |
|---|
| Docker | 运行 kind 集群并构建镜像。必须正在运行。 | Docker Desktop / Engine |
| kind | 在 Docker 中本地运行 Kubernetes 集群。 | brew install kind |
| kubectl | 与集群通信。 | brew install kubectl |
| Go 1.21+ | 构建并运行检查器二进制文件。 | brew install go |
| Node.js 18+ | 仅用于本地运行 Web 应用(make web)。对于单命令集群内设置不需要。 | brew install node |
| 目标 | 作用 |
|---|
make up | 一键:集群 + 镜像 + 部署(运行 setup.sh) |
make web | 在 :3000 上以开发模式运行 Web 应用 |
make cluster / make cluster-down | 创建 / 删除本地 kind 集群 |
make scan | 对当前集群运行所有检查器 |
make check ID=k01 | 运行单个检查 |
make clean-labs | 删除所有实验资源(在挑战之间重置) |
| ID | 风险 | 实验文件夹 |
|---|
| K01 | 不安全的工作负载配置 | labs/k01-insecure-workload |
| K02 | 过度许可的授权配置 | labs/k02-authorization |
| K03 | Secret 管理失败 | labs/k03-secrets |
| K04 | 缺乏集群级策略强制执行 | labs/k04-policy-enforcement |
| K05 | 缺少网络分段控制 | labs/k05-network-segmentation |
| K06 | 过度暴露的 Kubernetes 组件 | labs/k06-exposed-components |
| K07 | 配置不当且易受攻击的集群组件 | labs/k07-cluster-components |
| K08 | 集群到云的横向移动 | labs/k08-cluster-to-cloud |
| K09 | 损坏的认证机制 | labs/k09-authentication |
| K10 | 日志记录与监控不足 | labs/k10-logging-monitoring |
| 额外 | 供应链漏洞 | labs/kbonus-supply-chain |