
k8scout v0.1.2
単一のバイナリを侵害されたKubernetesポッドにドロップするだけで、cluster-admin、ノードエスケープ、シークレット窃取、クラウドIAM乗っ取りに至るすべての現実的な攻撃パスを即座にマッピングします。
k8scout
ベータ版 — 認可されたセキュリティ評価のための、シングルバイナリのKubernetes攻撃パスエンジン。
侵害されたPodに投入して実行するだけで、現在の足場からcluster-admin、ノードアクセス、シークレット窃取、クラウド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、危険なケイパビリティ、またはhostPathマウントを経由して
- 横展開 — 他のPodへのexec、そのSAトークンの窃取、その権限を介したピボット
- シークレットと認証情報の窃取 — マウントされたSAトークン、シークレット、認証情報が漏洩したconfigmap、孤立したトークン
- クラウドIAM権限昇格 — IRSA(AWS)、GKE Workload Identity、Azure Workload Identity、projected token audienceの悪用
- なりすましチェーン — なりすまし権限を通じたSAからSAへの乗っ取り
- ワークロードの改変 — deploymentをpatchしてSAを変更し、そのSAの権限を継承
- Webhookインジェクション — mutating webhookを制御して将来のワークロードに注入
- GitOpsオペレーターの悪用 — ArgoCD、Flux、External Secrets、Vaultオペレーターの権限昇格
- 設定ミスの検出 — 宙に浮いたバインディング、ワイルドカードverb、自動マウントトークン、環境変数内の平文シークレット
すべての検出結果には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
偵察モード(迅速な権限とリソースの確認)
# 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
偵察はグラフ構築、推論、AIをスキップします — 「このトークンが実際に何を持っているか?」に答える最速の方法です。現在のID、その有効な権限(SelfSubjectRulesReview)、およびリソースごとのケイパビリティマトリクス(SelfSubjectAccessReview)を報告します。--bruteforce-nsは、すべての名前空間が持つ既知のオブジェクト(名前空間オブジェクト、そのdefault ServiceAccount、またはkube-root-ca.crt ConfigMap)を読み取ることで名前空間の存在を確認します — これはIDが名前空間をリストできないが、特定の名前空間にはアクセスできる可能性がある場合に役立ちます。
レビュアーモード(クラスター全体の監査)
# 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
インストール
ビルド済みバイナリ
Releasesページからダウンロードしてください。すべてのバイナリは静的リンクされており、依存関係はありません。
| 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に読み込んでください(ドラッグアンドドロップ、サーバー不要)。
- Attack Pathsタブ — リスクスコアでランク付けされ、それぞれが足場からターゲットまでの完全なマルチホップチェーンを表示
- マルチチェーンビュー — 重複する攻撃パスを単一のグラフ上で同時に可視化
- Force-directedグラフ — 色分けされたカテゴリとリスクスコアリングを持つすべてのノードとエッジ
- フォーカスモード — 構造的なノイズを暗くして攻撃に関連するノードを強調
- 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で定義された読み取り専用アクセス: