업데이트로 돌아가기
New releaseAug 16, 2026

k8scout v0.1.2

단일 바이너리를 손상된 Kubernetes 파드에 드롭하고 클러스터 관리자, 노드 이스케이프, 시크릿 도난, 클라우드 IAM 탈취로 이어지는 모든 현실적인 공격 경로를 즉시 매핑하세요.

공유

k8scout 로고

GitHub stars GitHub forks GitHub issues GitHub license

k8scout

베타 — 승인된 보안 평가를 위한 단일 바이너리 Kubernetes 공격 경로 엔진.

손상된 파드에 넣고 실행하면, 현재 거점에서 cluster-admin, 노드 접근, 시크릿 탈취, 클라우드 IAM 역할까지 이어지는 모든 현실적인 권한 상승 경로의 지도를 얻을 수 있습니다.


아이디어

Kubernetes 파드에서 RCE를 얻었습니다. 이제 무엇을 할까요?

k8scout이 그 질문에 답합니다. 손상된 파드의 서비스 어카운트가 무엇을 할 수 있는지 자동으로 발견하고, RBAC 그래프를 매핑하며, 정확한 거점에서 고가치 목표까지 이어지는 다단계 공격 경로를 추적합니다.

세 가지 모드로 작동합니다:

  • 공격 모드 (기본값) — 손상된 파드 내부에서 실행합니다. 현재 위치에서 도달할 수 있는 모든 권한 상승 경로와 자신의 신원, 권한을 발견합니다.
  • 리뷰어 모드 (--reviewer-mode) — 읽기 전용 SA로 실행하여 모든 신원에 대한 전체 클러스터 공격 표면을 감사합니다.
  • 정찰 모드 (--recon) — 자신의 신원, 유효 권한, 접근 가능한 리소스만 빠르고 가볍게 살펴봅니다. 그래프나 경로 탐색은 없습니다. --bruteforce-ns를 추가하여 클러스터 전체에서 나열할 수 없는 네임스페이스를 발견합니다.

데모

k8scout 데모


무엇을 찾아내나요?

k8scout은 가중치가 부여된 권한 그래프를 구축하고 Dijkstra 기반 경로 탐색을 실행하여 현실적인 다단계 공격 체인을 발견합니다:

  • 파드에서 cluster-admin으로 — RBAC 바인딩, 워크로드 변조, CRB 생성을 통해
  • 컨테이너 탈출에서 노드로 — 권한 있는 컨테이너, hostPID, hostNetwork, 위험한 capability, hostPath 마운트를 통해
  • 측면 이동 — 다른 파드로 exec, SA 토큰 탈취, 해당 권한을 통해 이동
  • 시크릿 및 자격 증명 탈취 — 마운트된 SA 토큰, 시크릿, 유출된 자격 증명이 있는 ConfigMap, 고아 토큰
  • 클라우드 IAM 권한 상승 — IRSA (AWS), GKE Workload Identity, Azure Workload Identity, 프로젝션된 토큰 audience 남용
  • 가장 체인 — 가장 권한을 통한 SA-to-SA 인수
  • 워크로드 변조 — 디플로이먼트를 패치하여 SA를 변경한 후 해당 SA의 권한 상속
  • 웹훅 주입 — 변경형 웹훅 제어를 통해 향후 워크로드에 주입
  • GitOps 운영자 남용 — ArgoCD, Flux, External Secrets, Vault 운영자 권한 상승
  • 오설정 탐지 — 매달린 바인딩, 와일드카드 동사, 자동 마운트된 토큰, 환경 변수의 일반 텍스트 시크릿

모든 발견에는 MITRE ATT&CK 기술 ID, 위험 점수, 실제 그래프 노드가 포함된 단계별 공격 경로가 포함됩니다. 총 50개의 탐지 규칙.


빠른 시작

손상된 파드에서 (주 사용 사례)

# 바이너리를 파드에 복사
kubectl cp k8scout-linux-amd64 <ns>/<pod>:/tmp/k8scout

# 실행
kubectl exec -it <ns>/<pod> -- chmod +x /tmp/k8scout
kubectl exec -it <ns>/<pod> -- /tmp/k8scout --out /tmp/result.json

# 결과 가져오기
kubectl cp <ns>/<pod>:/tmp/result.json ./result.json

# 리버스 쉘에서도 동일하게 작동합니다!

바이너리는 자동으로 클러스터 내에서 실행 중임을 감지하고, 파드와 SA를 식별한 후 현재 거점에서 경로 탐색을 시작합니다.

의도된 사용: 침투 테스트, 레드 팀 운영, 내부 보안 검토, 클러스터 강화 감사. 항상 실행 전에 적절한 승인을 받으십시오.

로컬 머신에서

# ~/.kube/config 또는 $KUBECONFIG 사용
k8scout --all-namespaces --out result.json

# 단일 네임스페이스 대상
k8scout --namespace production --out result.json

정찰 모드 (빠른 권한 및 리소스 확인)

# 나는 누구이며, 무엇을 할 수 있고, 어떤 리소스에 접근할 수 있나?
k8scout --recon

# 클러스터 전체에서 나열할 수 없는 네임스페이스 발견 (내장 단어 목록)
k8scout --recon --bruteforce-ns

# 자신의 네임스페이스 단어 목록으로 무차별 대입 (한 줄에 하나씩)
k8scout --recon --bruteforce-ns --ns-wordlist ./namespaces.txt

정찰 모드는 그래프 구축, 추론, AI를 건너뛰므로 "이 토큰이 실제로 무엇을 가지고 있나?"에 가장 빠르게 답할 수 있습니다. 현재 신원, 유효 권한(SelfSubjectRulesReview), 리소스별 기능 매트릭스(SelfSubjectAccessReview)를 보고합니다. --bruteforce-ns는 모든 네임스페이스가 가지고 있는 잘 알려진 객체(네임스페이스 객체, default ServiceAccount, kube-root-ca.crt ConfigMap)를 읽어 네임스페이스 존재를 확인합니다. 신원이 네임스페이스를 나열할 수 없지만 특정 네임스페이스에 접근할 수 있을 때 유용합니다.

리뷰어 모드 (전체 클러스터 감사)

# 읽기 전용 RBAC 및 작업 배포
kubectl apply -f deploy/rbac.yaml
kubectl apply -f deploy/job.yaml

# 또는 리뷰어 권한으로 직접 실행
k8scout --reviewer-mode --all-namespaces --out result.json

AI 내러티브 사용

export OPENAI_API_KEY="sk-..."
k8scout --all-namespaces --out result.json

설치

사전 빌드된 바이너리

릴리스 페이지에서 다운로드하세요. 모든 바이너리는 정적으로 링크되어 있으며 종속성이 없습니다.

바이너리플랫폼
k8scout-linux-amd64Linux x86-64
k8scout-linux-arm64Linux ARM64
k8scout-darwin-amd64macOS Intel
k8scout-darwin-arm64macOS Apple Silicon

소스에서 빌드

Go 1.22+ 필요.

git clone https://github.com/hac01/k8scout
cd k8scout
make build          # 네이티브 바이너리
make build-linux    # 정적 Linux amd64 바이너리
make build-all      # 네 가지 릴리스 타겟 모두

작동 방식

k8scout (손상된 파드 내에서 실행)
 |
 ├── 1. 거점 탐지
 │     파드 이름 (HOSTNAME), SA (TokenReview), 노드 (downward API)
 │
 ├── 2. 권한 발견
 │     네임스페이스별 SSRR + 약 30개의 동시 SSAR 스팟 체크
 │     (항상 허용됨, RBAC 불필요)
 │
 ├── 3. 클러스터 객체 열거 (거부 시 정상적 저하)
 │     네임스페이스, RBAC, 워크로드, 파드, 시크릿, 노드, 웹훅, CRD
 │
 ├── 4. 공격 그래프 구축
 │     노드: 파드, SA, 역할, 바인딩, 시크릿, 워크로드, 노드, 클라우드 신원
 │     엣지: runs_as, mounts, authenticates_as, can_exec, can_patch,
 │            can_impersonate, runs_on, assumes_cloud_role, granted_by, ...
 │
 ├── 5. 공격 경로 탐색 (거점에서 고가치 목표까지 Dijkstra)
 │     공격자 노력에 가중치 부여 — 가장 저렴한 (가장 현실적인) 경로 우선
 │     목표: cluster-admin, 노드, SA 토큰, 클라우드 IAM, 권한 있는 워크로드
 │
 ├── 6. 추론 규칙 실행 (MITRE ATT&CK 매핑 포함 50개 규칙)
 │
 ├── 7. 선택사항: AI 위험 내러티브 (GPT-4o)
 │
 └── 8. 출력: 텍스트 요약 + JSON 보고서

파드나 RBAC 객체를 나열할 수 없는 최소한의 SA로도, 이 도구는 신원 데이터만으로 거점 그래프를 합성하고 SSRR/SSAR 권한을 통해 도달 가능한 것을 발견합니다.


공격 그래프 시각화

JSON 보고서를 브라우저에서 web/graph.html로 로드하세요 (드래그 앤 드롭, 서버 불필요).

  • 공격 경로 탭 — 위험 점수 순으로 정렬, 각 경로는 거점에서 목표까지의 전체 다중 홉 체인을 보여줍니다
  • 다중 체인 보기 — 단일 그래프에서 겹치는 공격 경로를 동시에 시각화
  • 포스 방향 그래프 — 모든 노드와 엣지, 색상 코드 범주 및 위험 점수 링 표시
  • 포커스 모드 — 공격 관련 노드를 강조하기 위해 구조적 노이즈를 흐리게 표시
  • RBAC 토글 — RBAC 노드를 숨기지만 활성 공격 경로의 일부일 때는 자동으로 표시
  • 미니맵 — 큰 그래프 탐색 시 컨텍스트 유지
  • 노드 상세 — 노드를 클릭하면 메타데이터, 연결, 관련 발견 사항 확인
  • 내보내기 — 자체 포함된 HTML 침투 테스트 보고서 다운로드

CLI 참조

k8scout [flags]

Flags:
  --out string            출력 JSON 파일 경로 (기본값 "k8scout-result.json")
  --namespace string      단일 네임스페이스 열거
  --all-namespaces        접근 가능한 모든 네임스페이스 열거 (기본값 true)
  --format string         출력 형식: text | json (기본값 "text")
  --timeout int           요청당 타임아웃 (초) (기본값 60)
  --log-level string      debug | info | warn | error (기본값 "info")
  --kubeconfig string     kubeconfig 경로 (설정하지 않으면 자동 감지)
  --reviewer-mode         모든 신원에 대한 전체 클러스터 RBAC 감사
  --recon                 빠른 정찰: 신원, 권한 (SSRR), 접근 가능 리소스 (SSAR)
  --bruteforce-ns         네임스페이스 이름 무차별 대입으로 나열할 수 없는 네임스페이스 찾기 (--recon과 함께 사용)
  --ns-wordlist string    --bruteforce-ns용 사용자 정의 네임스페이스 단어 목록 (기본값은 내장 목록)
  --stealth               감사 로그 풋프린트를 줄이기 위해 SSRR/SSAR 건너뛰기
  --skip-ssar             SSAR 스팟 체크만 건너뛰기
  --openai-key string     OpenAI API 키 (또는 OPENAI_API_KEY 환경 변수)
  --openai-model string   OpenAI 모델 (기본값 "gpt-4o")
  --skip-ai               AI 내러티브 생성 건너뛰기

RBAC 요구 사항

손상된 파드에서 실행할 때: 특별한 RBAC가 필요하지 않습니다. SSRR과 SSAR은 항상 허용됩니다. SA가 클러스터 객체를 나열할 수 없으면 도구는 정상적으로 저하됩니다. 사용 가능한 정보로 권한을 발견하고 결과를 생성합니다.

전체 열거를 위해 (k8scout SA에 권장): deploy/rbac.yaml에 정의된 읽기 전용 접근:

  • namespaces, nodes: get, list
  • serviceaccounts, secrets (메타데이터만), configmaps: get, list
  • pods, deployments, daemonsets, statefulsets, jobs, cronjobs: get, list
  • roles, rolebindings, clusterroles, clusterrolebindings: get, list
  • mutatingwebhookconfigurations, validatingwebhookconfigurations: get, list

신원이 SSAR을 통해 GET 권한을 확인하지 않는 한 시크릿 값은 절대 읽히지 않습니다.


베타 피드백

k8scout은 활발히 개발 중입니다. 클러스터에서 버그, 오탐, 탐지 누락을 발견하면 이슈를 열어주세요. 오탐과 놓친 경로는 특히 유용합니다. 가능하면 익명화된 발견 JSON을 포함해 주세요.


라이선스

MIT

카테고리