
OWASP Kubernetes Top 10 (2025)을 위한 실습형 CTF 랩입니다. 11가지 실제 클러스터 취약점을 익스플로잇하고 플래그를 획득한 후, 수정 사항을 적용하고 자동 점검기로 확인합니다. kind에서 로컬로 실행됩니다.
캡처 더 플래그 프로젝트로, OWASP Kubernetes Top 10 — 2025를 기반으로 구성되었습니다. 당신은 가상의 전자상거래 회사 NimbusMart의 레드팀으로 고용되었습니다. 이 회사의 클러스터는 보안보다 빠르게 성장했습니다. 10개의 도전 과제는 각 OWASP 위험 요소당 하나씩 (보너스 포함) 제공됩니다. 각 취약점을 악용하여 깃발을 획득한 다음, 수정 사항을 적용하고 체커로 입증하세요.
전체 배경 이야기(회사, 서비스, 네임스페이스, 깃발 체계)는 labs/NIMBUSMART.md에 있습니다.
모든 것은 로컬 kind 위에서 실행됩니다. 실제 클러스터에 취약한 매니페스트를 절대 실행하지 마세요.
@hac01이 구축했습니다.
이것은 슬라이드 덱이 아닙니다. 의도적으로 취약하게 설계된 쿠버네티스 클러스터와 이를 공격하고, 수정하고, 수정을 확인하는 도구가 함께 제공됩니다. 11개의 도전 과제를 통해 다음과 같은 실습을 수행합니다:
hostPath 마운트, 노드 탈옥 (K01)ClusterRole, 과도한 범위의 ServiceAccount, 하나의 탈취된 토큰이 모든 시크릿에 접근하는 방법 (K02, K09)NetworkPolicy 잠금 (K05):latest 이미지를 프로덕션에 배포 (보너스)각 도전 과제마다 다음을 제공합니다:
시작하기 전에 설치하세요. 설정 스크립트는 처음 네 가지를 확인하고 누락 시 명확한 메시지와 함께 빠르게 실패합니다.
brew명령어는 macOS용입니다. Linux에서는 패키지 관리자나 위에 링크된 공식 설치 방법을 사용하세요.
웹 앱, 브라우저 내 터미널, 체커를 모두 kind 클러스터 내에서 실행할 수 있습니다. 한 명령으로 모든 것을 실행하고 URL을 출력합니다:
./setup.sh # 또는: make up
# - kind 클러스터 생성, 이미지 빌드 및 로드, 배포, 준비될 때까지 대기
# - 웹 앱: http://localhost:30090
# - 터미널: 웹 앱의 'Terminal' 버튼
./setup.sh는 올바른 포트 매핑으로 클러스터를 (재)생성하고, 두 이미지(nimbusmart-ctf-web, nimbusmart-ctf-terminal)를 빌드하여 kind에 로드하고, deploy/를 적용합니다. 첫 실행 시 기본 이미지를 가져오며 약 1-2분이 소요됩니다.
./setup.sh # 새 클러스터 + 전체 플랫폼 (기존 'owasp-labs' 클러스터는 삭제)
./setup.sh --keep # 기존 'owasp-labs' 클러스터가 있으면 재사용
그런 다음 **http://localhost:30090**을 열고, 도전 과제를 선택한 후, 브라우저에서 Terminal 버튼을 사용하여 클러스터를 조작하세요.
터미널 파드는 cluster-admin ServiceAccount로 실행되므로 브라우저의 터미널이 이 클러스터를 직접 조작합니다 — kubectl apply -f labs/... 및 owasp-k8s-checker --check kNN을 그곳에서 실행하세요.
경고: 브라우저 내 터미널은 사실상 WebSocket을 통한 cluster-admin입니다.
localhost에 바인딩된 로컬의 일회용 kind 클러스터이기 때문에 안전합니다. 포트30080/30090/30091을 신뢰할 수 없는 네트워크에 절대 노출하지 마세요.
kind delete cluster --name owasp-labs # 또는: make cluster-down
.
├── setup.sh 원클릭 부트스트랩 (클러스터 + 이미지 + 배포)
├── Makefile 편의 타겟 — `make help`로 목록 보기
├── web/ Next.js + React 앱 (흰색/보라색 테마) — UI
├── 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였던 부분) 확대; 시크릿, 네트워크, 인증, 로깅 순서 변경; 과도하게 노출된 구성 요소(K06) 및 클러스터-클라우드 측면 이동(K08) 추가; 잘못 구성 + 오래된 구성 요소를 K07로 통합; 공급망을 보너스 도전 과제로 이동. 전체 도전-서비스-취약점 맵, 난이도, 점수(10개 도전 과제에 2000점, 보너스 +300점)는
labs/NIMBUSMART.md참조.
UI를 로컬에서 실행하고 실습을 직접 셸에서 하고 싶다면, 각 부분을 수동으로 연결할 수 있습니다.
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가 있지만, 패턴은 동일합니다:
# 일부 도전 과제는 먼저 대상(노드 파일, 운영 시크릿 등)을 설정합니다
kubectl apply -f labs/k01-insecure-workload/setup.yaml # 존재하는 경우에만
# 취약한 리소스를 배포하고 악용하여 깃발 획득
kubectl apply -f labs/k01-insecure-workload/vulnerable.yaml
# ...웹 앱의 임무 브리핑/힌트를 따라 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 # 특정 네임스페이스로 범위 지정
체커는 체크 실패 시 0이 아닌 종료 코드를 반환하므로 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+ | 웹 앱을 로컬에서 실행할 때만 필요 (make web). 원클릭 인클러스터 설정에는 필요하지 않습니다. | brew install node |
| 타겟 | 설명 |
|---|
make up | 한 번에: 클러스터 + 이미지 + 배포 (setup.sh 실행) |
make web | 웹 앱을 :3000에서 개발 모드로 실행 |
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 | 시크릿 관리 실패 | 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 |
| Bonus | 공급망 취약점 | labs/kbonus-supply-chain |