Linux kube-hunter 的 –active 与被动狩猎模式的攻击面覆盖对比

1次阅读

–active模式真实发起攻击性探测,如连接kubernetes api server未授权端口、向kubelet发/pods或/exec请求、探测etcd暴露等;被动模式仅依赖dns解析、tls证书、http响应头等已暴露信息。

Linux kube-hunter 的 –active 与被动狩猎模式的攻击面覆盖对比

主动模式(–active)到底扫哪些东西

它会真实发起攻击性探测,比如尝试连接 Kubernetes API Server 的未授权端口、暴力猜测 service account Token、向 kubelet 发起 /pods/exec 请求、尝试挂载 hostPath 卷、探测 etcd 是否暴露在公网——这些操作都可能触发告警、写入日志甚至中断服务。

实操建议:

  • 只在测试环境或你有明确授权的集群上运行 kube-hunter --active
  • 避免在生产集群的 master 节点所在网段直接执行,防止被网络策略拦截或触发安全设备响应
  • --active 默认不爆破凭证,但会尝试利用已知默认配置(如 anonymous 用户权限、insecure-port 开启等)

被动模式(默认)实际依赖什么信息

它不发任何请求,只靠 DNS 解析、TLS 证书信息、HTTP 响应头、公开端口扫描(不发 payload)、以及对 kubernetes.default.svc 域名能否解析的判断来推测架构。换句话说:它看得到的,仅限于你“已经暴露出去”的那部分表象。

常见错误现象:

  • 集群内网部署,DNS 不对外,kube-hunter 在外部跑,连 kubernetes.default.svc 都解析失败 → 直接退出,不报任何漏洞
  • API Server 启用了 TLS 但证书是自签的,被动模式会记录 “could not verify certificate”,但不会进一步尝试握手
  • 误以为“没报高危 = 安全”,其实只是它压根没看到你的 kubelet 端口(比如被防火墙挡了)

–active 和被动模式在攻击面覆盖上的本质差异

被动模式回答的是:“从外部看,这个集群像不像有漏洞?”;--active 回答的是:“如果我是一个已有基础访问权限的攻击者,现在能走多远?”

关键区别点:

  • 被动模式无法发现需认证后才能触发的问题(如 RBAC 配置过宽、podSecurityPolicy 绕过),--active 会尝试用匿名 token 或默认 service account 去调用
  • --active 会检测本地提权路径(如 hostPath 挂载 /etc/kubernetes),被动模式完全看不到容器运行时配置
  • 某些插件式组件(如 kubefed、karmada)的接口,被动模式基本忽略,--active 可能通过 endpoint 列表识别并探测

别被 –active 的“高危”结果带偏节奏

它报出的 Privilege Escalation via kubelet /execetcd exposed 类问题,往往依赖具体上下文:API Server 是否开启了 --anonymous-auth=true、kubelet 是否禁用了 --read-only-port、etcd 是否绑定了 0.0.0.0 而非 127.0.0.1

容易踩的坑:

  • 在 minikube 或 kind 集群里跑 --active,几乎必报一“高危”,但这只是开发环境默认配置宽松,不等于线上也会这样
  • 没关掉 --insecure-port 就上线,--active 会立刻打穿,但被动模式根本发现不了这个端口是否存在
  • --active 扫完就以为万事大吉,却漏掉了 CI/CD 流水线中硬编码的 token、或 Helm chart 里写死的 hostPath —— 这些不在运行时攻击面里,但一样致命

真正难判断的,从来不是“扫出来几个洞”,而是每个洞背后对应的最小权限边界和横向移动链路是否可控。

text=ZqhQzanResources