每一个 Node 节点都有一个 kubelet 服务,kubelet 监听了 10250,10248,10255 等端口。

其中 10250 端口是 kubelet 与 apiserver 进行通信的主要端口,通过该端口 kubelet 可以知道自己当前应该处理的任务,该端口在最新版 Kubernetes 是有鉴权的,但在开启了接受匿名请求的情况下,不带鉴权信息的请求也可以使用 10250 提供的能力;因为 Kubernetes 流行早期,很多挖矿木马基于该端口进行传播和利用,所以该组件在安全领域部分群体内部的知名度反而会高于 APIServer。

在新版本 Kubernetes 中当使用以下配置打开匿名访问时便可能存在 kubelet 未授权访问漏洞:

图片

如果 10250 端口存在未授权访问漏洞,那么我们可以先使用 / pods 接口获取集群的详细信息,如 namespace,pods,containers 等

图片

之后再通过

curl -k https://Kubernetes-node-ip:10250/run/// -d “cmd=id” 的方式在任意容器里执行命令

!图片

此时,选择我们所有控制的容器快速过滤出高权限可逃逸的容器就很重要,在上述 /pods API 中可以获取到每个 POD 的配置,包括了 host*、securityContext、volumes 等配置,可以根据容器逃逸知识快速过滤出相应的 POD 进行控制。

图片

由于这里 10250 鉴权当前的 Kubernetes 设计是默认安全的,所以 10255 的开放就可能更加容易在红蓝对抗中起到至关重要的作用。10255 本身为只读端口,虽然开放之后默认不存在鉴权能力,无法直接利用在容器中执行命令,但是可以获取环境变量 ENV、主进程 CMDLINE 等信息,里面包含密码和秘钥等敏感信息的概率是很高的,可以快速帮我们在对抗中打开局面。

最后编辑: kuteng  文档更新时间: 2022-06-01 16:22   作者:kuteng