
k8scout v0.1.2
単一のバイナリを侵害されたKubernetesポッドにドロップするだけで、cluster-admin、ノードエスケープ、シークレット窃取、クラウドIAM乗っ取りに至るすべての現実的な攻撃パスを即座にマッピングします。
k8scout
ベータ版 — 許可されたセキュリティ評価のためのシングルバイナリ Kubernetes 攻撃パスエンジン。
侵害されたPodにドロップして実行するだけで、現在の足場からクラスタ管理者、ノードアクセス、シークレット窃取、クラウドIAMロールまでの現実的なすべてのエスカレーションパスのマップを取得できます。
概要
Kubernetes PodでRCEを取得しました。次はどうしますか?
k8scoutがその問いに答えます。侵害されたPodのサービスアカウントが何ができるかを自動的に発見し、RBACグラフをマッピングし、現在の足場から高価値ターゲットまでの複数ステップの攻撃パスをトレースします。
次の3つのモードで動作します:
- 攻撃モード (デフォルト) — 侵害されたPod内で実行します。現在の位置から、自分のID、権限、到達可能なすべてのエスカレーションパスを発見します。
- レビューモード (
--reviewer-mode) — 読み取り専用SAで実行し、すべてのIDに対するクラスタ全体の攻撃面を監査します。 - 偵察モード (
--recon) — 高速でフットプリントの少ないモードで、ID、実効権限、アクセス可能なリソースのみを確認します。グラフやパス検索は行いません。--bruteforce-nsを追加すると、クラスタ全体でリストできない名前空間を発見できます。
デモ
検出内容
k8scoutは重み付き権限グラフを構築し、Dijkstraベースのパス検索を実行して、現実的な複数ステップの攻撃チェーンを発見します:
- Pod から cluster-admin へ — RBACバインディング、ワークロード改変、CRB作成を通じて
- コンテナ脱出からノードへ — 特権コンテナ、hostPID、hostNetwork、危険なCapability、hostPathマウントを介して
- 横移動 — 他のPodにexecし、そのSAトークンを盗み、その権限を通じて移動
- シークレットおよび認証情報の窃取 — マウントされたSAトークン、シークレット、漏洩した認証情報を含むConfigMap、孤立トークン
- クラウドIAMエスカレーション — IRSA (AWS)、GKE Workload Identity、Azure Workload Identity、プロジェクトトークンのオーディエンス悪用
- なりすましチェーン — なりすまし権限によるSA間の乗っ取り
- ワークロード改変 — デプロイメントをパッチしてそのSAを変更し、そのSAの権限を継承
- Webhookインジェクション — 変更系Webhookを制御して将来のワークロードに注入
- GitOpsオペレーターの悪用 — ArgoCD、Flux、External Secrets、Vaultオペレーターの権限昇格
- 設定ミスの検出 — 宙ぶらりんのバインディング、ワイルドカード動詞、自動マウントトークン、環境変数内の平文シークレット
すべての発見にはMITRE ATT&CKテクニックID、リスクスコア、実際のグラフノードを含むステップバイステップの攻撃パスが含まれます。合計50の検出ルール。
クイックスタート
侵害されたPodから(主な使用例)
# Copy the binary into the pod
kubectl cp k8scout-linux-amd64 <ns>/<pod>:/tmp/k8scout
# Run it
kubectl exec -it <ns>/<pod> -- chmod +x /tmp/k8scout
kubectl exec -it <ns>/<pod> -- /tmp/k8scout --out /tmp/result.json
# Pull the results
kubectl cp <ns>/<pod>:/tmp/result.json ./result.json
# This flow works exactly like this in you're revshell!
バイナリは自動的にクラスタ内で実行されていることを検出し、PodとSAを識別し、現在の足場からパス検索を開始します。
想定される使用法: ペネトレーションテスト、レッドチーム運用、内部セキュリティレビュー、クラスタ強化監査。クラスタに対して実行する前には必ず適切な許可を得てください。
ローカルマシンから
# Uses ~/.kube/config or $KUBECONFIG
k8scout --all-namespaces --out result.json
# Target a single namespace
k8scout --namespace production --out result.json
Reconモード(権限とリソースの簡易確認)
# Who am I, what can I do, and what resources can I access?
k8scout --recon
# Discover namespaces you can't list cluster-wide (built-in wordlist)
k8scout --recon --bruteforce-ns
# Bruteforce with your own namespace wordlist (one name per line)
k8scout --recon --bruteforce-ns --ns-wordlist ./namespaces.txt
Reconはグラフ構築、推論、AIをスキップします。これは「このトークンは実際に何を持っているか」に答える最速の方法です。現在のID、その実効権限(SelfSubjectRulesReview)、およびリソースごとの能力マトリックス(SelfSubjectAccessReview)を報告します。--bruteforce-ns は、すべての名前空間が持つ既知のオブジェクト(名前空間オブジェクト、その default ServiceAccount、または kube-root-ca.crt ConfigMap)を読み取ることで名前空間の存在を確認します。IDが名前空間をリストできないが、特定の名前空間にはアクセスできる可能性がある場合に便利です。
Reviewerモード(クラスタ全体の監査)
# Deploy the read-only RBAC and job
kubectl apply -f deploy/rbac.yaml
kubectl apply -f deploy/job.yaml
# Or run directly with reviewer permissions
k8scout --reviewer-mode --all-namespaces --out result.json
AIによる説明付き
export OPENAI_API_KEY="sk-..."
k8scout --all-namespaces --out result.json
インストール
ビルド済みバイナリ
リリース ページからダウンロードしてください。すべてのバイナリは静的リンクされており、依存関係はありません。
| Binary | Platform |
|---|---|
k8scout-linux-amd64 | Linux x86-64 |
k8scout-linux-arm64 | Linux ARM64 |
k8scout-darwin-amd64 | macOS Intel |
k8scout-darwin-arm64 | macOS Apple Silicon |
ソースからビルド
Go 1.22+ が必要です。
git clone https://github.com/hac01/k8scout
cd k8scout
make build # native binary
make build-linux # static Linux amd64 binary
make build-all # all four release targets
動作の仕組み
k8scout (running inside compromised pod)
|
├── 1. Detect foothold
│ Pod name (HOSTNAME), SA (TokenReview), Node (downward API)
│
├── 2. Discover permissions
│ SSRR per namespace + ~30 concurrent SSAR spot-checks
│ (always permitted, no RBAC needed)
│
├── 3. Enumerate cluster objects (graceful degradation if denied)
│ Namespaces, RBAC, Workloads, Pods, Secrets, Nodes, Webhooks, CRDs
│
├── 4. Build attack graph
│ Nodes: pods, SAs, roles, bindings, secrets, workloads, nodes, cloud identities
│ Edges: runs_as, mounts, authenticates_as, can_exec, can_patch,
│ can_impersonate, runs_on, assumes_cloud_role, granted_by, ...
│
├── 5. Find attack paths (Dijkstra from foothold to high-value targets)
│ Weighted by attacker effort — cheapest (most realistic) paths first
│ Targets: cluster-admin, nodes, SA tokens, cloud IAM, privileged workloads
│
├── 6. Run inference rules (50 rules with MITRE ATT&CK mapping)
│
├── 7. Optional: AI risk narrative (GPT-4o)
│
└── 8. Output: text summary + JSON report
PodやRBACオブジェクトをリストできない最小限のSAであっても、このツールはIDデータのみから足場グラフを合成し、SSRR/SSAR権限を通じて到達可能なものを発見します。
攻撃グラフの可視化
JSONレポートを任意のブラウザで web/graph.html にロードしてください(ドラッグ&ドロップ、サーバー不要)。
- 攻撃パスタブ — リスクスコア順にランク付けされ、各パスは足場からターゲットまでの完全なマルチホップチェーンを示します
- マルチチェーンビュー — 重複する攻撃パスを単一のグラフ上で同時に可視化
- フォース指向グラフ — すべてのノードとエッジを色分けカテゴリとリスクスコアリングで表示
- フォーカスモード — 構造上のノイズを暗くし、攻撃に関連するノードを強調
- RBACトグル — RBACノードを隠し、アクティブな攻撃パスの一部である場合に自動的に表示
- ミニマップ — 大規模グラフをナビゲートし、コンテキストを失わない
- ノード詳細 — ノードをクリックするとメタデータ、接続、関連する発見を表示
- エクスポート — 自己完結型のHTMLペンテストレポートをダウンロード
CLIリファレンス
k8scout [flags]
Flags:
--out string Output JSON file path (default "k8scout-result.json")
--namespace string Enumerate a single namespace
--all-namespaces Enumerate all accessible namespaces (default true)
--format string Output format: text | json (default "text")
--timeout int Per-request timeout in seconds (default 60)
--log-level string debug | info | warn | error (default "info")
--kubeconfig string Path to kubeconfig (auto-detected if not set)
--reviewer-mode Full cluster RBAC audit for all identities
--recon Quick recon: identity, permissions (SSRR), accessible resources (SSAR)
--bruteforce-ns Bruteforce namespace names to find ones you can't list (use with --recon)
--ns-wordlist string Custom namespace wordlist for --bruteforce-ns (defaults to a built-in list)
--stealth Skip SSRR/SSAR to reduce audit log footprint
--skip-ssar Skip SSAR spot-checks only
--openai-key string OpenAI API key (or OPENAI_API_KEY env var)
--openai-model string OpenAI model (default "gpt-4o")
--skip-ai Skip AI narrative generation
RBAC要件
侵害されたPodから実行する場合: 特別なRBACは不要です。SSRRとSSARは常に許可されています。SAがクラスタオブジェクトをリストできない場合、ツールは正常に機能低下し、利用可能な情報から権限を発見し、発見を生成します。
完全な列挙の場合(k8scout SAに推奨): deploy/rbac.yaml で定義された読み取り専用アクセス:
namespaces,nodes: get, listserviceaccounts,secrets(メタデータのみ),configmaps: get, listpods,deployments,daemonsets,statefulsets,jobs,cronjobs: get, listroles,rolebindings,clusterroles,clusterrolebindings: get, listmutatingwebhookconfigurations,validatingwebhookconfigurations: get, list
シークレットの値は、IDがSSARを介してGET権限を確認しない限り、決して読み取られません。
ベータフィードバック
k8scoutは活発に開発されています。クラスタでバグ、誤検出、または検出のギャップに遭遇した場合は、issueを開く してください。誤検出や見逃されたパスは特に有用です – 可能であれば匿名化された発見JSONを含めてください。
ライセンス
MIT