
k8scout v0.1.2
将一个单一的二进制文件放入一个被攻破的Kubernetes pod中,立即映射出所有现实的攻击路径:集群管理员、节点逃逸、秘密窃取和云IAM接管。
k8scout
Beta — 用于授权安全评估的单一二进制 Kubernetes 攻击路径引擎。
将其放入被攻破的 Pod,运行它,即可获得每个现实可行的横向移动路径地图——从当前落脚点到集群管理员、节点访问、机密窃取和云 IAM 角色。
理念
你在 Kubernetes Pod 中拥有 RCE。接下来呢?
k8scout 回答这个问题。它自动发现被攻破 Pod 的服务账户能做什么,映射 RBAC 图,并追踪从你的确切落脚点到高价值目标的攻击路径。
它有三种工作模式:
- 攻击模式(默认)—— 在被攻破的 Pod 内运行。发现你的身份、权限以及从当前位置可达到的所有横向移动路径。
- 审查模式(
--reviewer-mode)—— 使用只读 SA 运行,审计整个集群所有身份的攻击面。 - 侦察模式(
--recon)—— 快速、低足迹地查看你的身份、有效权限以及你能接触的资源。不构建图或路径。添加--bruteforce-ns以发现你不能全局列举的命名空间。
演示
它发现什么
k8scout 构建一个带权重的权限图,并运行基于 Dijkstra 的路径查找,以发现现实的多步攻击链:
- 从 Pod 到集群管理员 — 通过 RBAC 绑定、工作负载变异或 CRB 创建
- 容器逃逸到节点 — 通过特权容器、hostPID、hostNetwork、危险 capabilities 或 hostPath 挂载
- 横向移动 — exec 进入其他 Pod,窃取其 SA 令牌,通过权限进行 pivot
- 机密和凭据窃取 — 挂载的 SA 令牌、机密、带有泄露凭据的 ConfigMap、孤儿令牌
- 云 IAM 权限提升 — IRSA (AWS)、GKE Workload Identity、Azure Workload Identity、投影令牌观众滥用
- 模拟链 — 通过模拟权限进行 SA 到 SA 的接管
- 工作负载变异 — 修补 Deployment 以更改其 SA,然后继承该 SA 的权限
- Webhook 注入 — 控制变更 Webhook 以注入到未来工作负载
- GitOps 操作者滥用 — ArgoCD、Flux、External Secrets 和 Vault 操作者权限提升
- 错误配置检测 — 悬挂绑定、通配符动词、自动挂载令牌、环境变量中明文机密
每个发现都包含 MITRE ATT&CK 技术 ID、风险评分以及包含实际图节点的逐步攻击路径。总共有 50 条检测规则。
快速开始
从被攻破的 Pod(主要用例)
# 将二进制文件复制到 Pod 中
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
# 如果你正在使用 reverse shell,这个流程完全一样!
二进制文件会自动检测它正在集群内运行,识别 Pod 和 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 和 Job
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
安装
预编译二进制文件
从 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 # 原生二进制文件
make build-linux # 静态 Linux amd64 二进制文件
make build-all # 所有四个发布目标
工作原理
k8scout (在被攻破的 Pod 内运行)
|
├── 1. 检测落脚点
│ Pod 名称 (HOSTNAME)、SA (TokenReview)、Node (downward API)
│
├── 2. 发现权限
│ 每个命名空间的 SSRR + 约 30 个并发 SSAR 抽查
│ (始终被允许,无需 RBAC)
│
├── 3. 列举集群对象 (如果被拒绝则优雅降级)
│ Namespaces、RBAC、Workloads、Pods、Secrets、Nodes、Webhooks、CRDs
│
├── 4. 构建攻击图
│ 节点: pods, SAs, roles, bindings, secrets, workloads, nodes, cloud identities
│ 边: runs_as, mounts, authenticates_as, can_exec, can_patch,
│ can_impersonate, runs_on, assumes_cloud_role, granted_by, ...
│
├── 5. 发现攻击路径 (从落脚点到高价值目标的 Dijkstra 路径)
│ 按攻击者努力程度加权——最便宜(最现实)的路径优先
│ 目标: cluster-admin, nodes, SA tokens, cloud IAM, privileged workloads
│
├── 6. 运行推理规则 (50 条规则,含 MITRE ATT&CK 映射)
│
├── 7. 可选: AI 风险叙述 (GPT-4o)
│
└── 8. 输出: 文本摘要 + JSON 报告
即使使用一个无法列出 Pod 或 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 要求
从被攻破的 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 权限,否则永远不会读取机密值。
Beta 反馈
k8scout 正在积极开发中。如果你在你的集群中遇到错误、误报或检测空白,请提交 issue。误报和遗漏路径尤其有用——如果可能,请包含匿名化的发现 JSON。
许可证
MIT