
k8scout v0.1.2
将一个单一的二进制文件放入一个被攻破的Kubernetes pod中,立即映射出所有现实的攻击路径:集群管理员、节点逃逸、秘密窃取和云IAM接管。
k8scout
Beta — 一个用于授权安全评估的单二进制 Kubernetes 攻击路径引擎。
将其放入被攻陷的 Pod 中,运行它,即可获得从当前立足点到 cluster-admin、节点访问、密钥窃取和云 IAM 角色的所有现实提权路径图。
设计理念
你在一个 Kubernetes Pod 中获得了 RCE。接下来呢?
k8scout 回答了这个问题。它会自动发现被攻陷 Pod 的服务账户能做什么,绘制 RBAC 图,并追踪从你的确切立足点到高价值目标的多步攻击路径。
它有三种工作模式:
- 攻击模式(默认)—— 在被攻陷的 Pod 内部运行。发现你的身份、权限以及从当前位置可达的所有提权路径。
- 审计模式(
--reviewer-mode)—— 使用只读 SA 运行,审计所有身份的完整集群攻击面。 - 侦察模式(
--recon)—— 快速、低痕迹地查看你的身份、有效权限以及可触及的资源。不构建图或路径查找。添加--bruteforce-ns可发现你无法在集群范围列出的命名空间。
演示
它能发现什么
k8scout 构建加权权限图,并运行基于 Dijkstra 的路径查找,以发现现实的多步攻击链:
- Pod 到 cluster-admin —— 通过 RBAC 绑定、工作负载变更或创建 CRB
- 容器逃逸到节点 —— 通过特权容器、hostPID、hostNetwork、危险 capabilities 或 hostPath 挂载
- 横向移动 —— exec 进入其他 Pod,窃取其 SA 令牌,通过其权限进行跳板
- 密钥和凭据窃取 —— 挂载的 SA 令牌、secrets、包含泄露凭据的 configmaps、孤立令牌
- 云 IAM 提权 —— IRSA (AWS)、GKE Workload Identity、Azure Workload Identity、投影令牌受众滥用
- 模拟链 —— 通过模拟权限进行 SA 到 SA 的接管
- 工作负载变更 —— 修补 deployment 以更改其 SA,然后继承该 SA 的权限
- Webhook 注入 —— 通过 mutating webhook 控制注入到未来的工作负载中
- GitOps operator 滥用 —— ArgoCD、Flux、External Secrets 和 Vault operator 提权
- 错误配置检测 —— 悬空绑定、通配符动词、自动挂载令牌、环境变量中的明文密钥
每个发现都包含 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 —— 这是回答
"这个令牌实际拥有什么?"的最快方式。它报告当前身份、其
有效权限(SelfSubjectRulesReview),以及按资源划分的能力
矩阵(SelfSubjectAccessReview)。--bruteforce-ns 通过读取每个命名空间都有的
知名对象(命名空间对象、其 default ServiceAccount 或 kube-root-ca.crt ConfigMap)来确认命名空间存在 —— 当
身份无法列出命名空间但仍可能访问特定命名空间时非常有用。
审计模式(完整集群审计)
# 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 页面下载。所有二进制文件均为静态链接,无依赖。
| 二进制文件 | 平台 |
|---|---|
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,该工具也能仅从身份数据合成立足点图,并发现通过 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
除非身份已通过 SSAR 确认 GET 权限,否则永远不会读取 Secret 值。
Beta 反馈
k8scout 正在积极开发中。如果你在你的集群中遇到 bug、误报或检测缺口,请提交 issue。误报和遗漏路径尤其有用 —— 如果可能,请包含匿名化的发现 JSON。
许可证
MIT