docker宿主机访问容器_干货来啦!带你初探Docker逃逸
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
3.此时查看/dev/路径会发现很多设备文件:ls /dev
4.新建目录以备挂载:mkdir /abc
5.将/dev/sda1挂载至 /abc: mount /dev/sda1 /abc
6.最终我们可以通过访问容器内部的/abc路径来达到访问整个宿主机的目的:ls /abc
7.尝试写文件到宿主机:echo 123 > /abc/home/botasky/escape2
8.查看宿主机中的文件:ls /home/botasky/escape2
(二)--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种:
其中使用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
4.运行一个新容器并挂载宿主机根路径:docker -H unix:///host/var/run/docker.sock run -v /:/aa -it ubuntu:14.04 /bin/bash
可以看见@符号后的Docker ID已经发生变化:
5.在新容器/aa路径下完成对宿主机资源的访问:ls /aa
三、存在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,我们可以通过以下命令获取。
1. 运行验证容器:docker-compose run dirtycow /bin/bash
2. 本地开启nc,进行观察(PoC中设置的反弹地址为本地的1234端口):nc -lvp 1234
3. 编译PoC并运行,等待shell反弹:make &./0xdeadbeef
通过ID命令,可以发现这个shell为root权限:
docker宿主机访问容器_干货来啦!带你初探Docker逃逸相关推荐
- docker宿主机访问容器_Docker容器与宿主机器通过IP内外通讯
例如一个如下场景,在Docker环境下面运行了一个含有PHP环境的Docker容器(container),容器名称为php1,同时在宿主机(真实机器)上面有一个MySQL服务器,如何来通过,容器内部的 ...
- docker宿主机访问docker容器服务失败
2019独角兽企业重金招聘Python工程师标准>>> 原因: 因为docker的虚拟ip网段是172.17.*.*与局域网的ip网段172.17冲突了,所以有两种方式: 解决方法: ...
- docker实现跨宿主机的容器之间网络互联
背景:最近闲来无事,想到之前开发提出的问题不用k8s那套网络插件如何实现跨宿主机的容器之间网络互联,顺便复习下iptables知识点. docker实现跨宿主机的容器之间网络互联 一. 环境介绍 二. ...
- 宿主机172连接容器mysql_开发时从宿主机连接容器中的MySQL
从宿主机连接Docker容器中的MySQL 刚接触Docker,电脑安装Docker后,使用docker命令pull了一个MySQL5.6的Docker镜像,之后docker run启动创建容器. 可 ...
- docker网络问题解决办法“大全”:关于宿主机访问不了docker容器中web服务,或者容器内访问不了外网的问题的解决办法
docker网络问题解决办法"大全":关于宿主机访问不了docker容器中web服务,或者容器内访问不了外网的问题的解决办法 参考文章: (1)docker网络问题解决办法&quo ...
- docker如何查看宿主机到容器端口映射
docker/Docker如何查看宿主机到容器端口映射关系 背景 前些天的时候, 在定位问题时发现docker emqx 连接websocket (8083)端口出现异常. 经过很长时间定位, 才发现 ...
- 解决Docker MySQL无法被宿主机访问的问题
1 问题描述 Docker启动MySQL容器后,创建一个localhost访问的用户: create user test@localhost identified by 'test'; 但是在宿主机中 ...
- Docker 宿主机定时清除容器的运行日志
为什么80%的码农都做不了架构师?>>> docker 宿主机定时清除容器的运行日志 一般docker容器都是最小化安装,不仅如此系统定时器相关的服务也不存在,自己去安装也很麻 ...
- Docker 使用容器数据卷 实现宿主机与容器共享数据 容器数据持久化
容器数据卷:可以实现宿主机与容器进行共享.容器数据持久化,容器与容器共享数据.可以在run镜像时使用-v参数指定宿主机与容器进行挂载的目录,也可以使用dockerfile的volume指定容器中容器数 ...
最新文章
- == Equals ReferenceEquals 的区别
- CSS学习02之css导入方式
- Object C学习笔记12-集合
- django多线程_Django两种启动方式(runserver和uwsgi)的区别
- php datediff 函数,dateAdd与DateDiff函数的js代码
- 两个链表求交集_实现两个排序链表的并集和交集
- C++笔记-设置cout输出数据的宽度和填充
- 简述java异常机制处理,简述Java中的异常处理机制
- 记录一次解决404问题
- html表单input file,最简单的方法美化表单中input type=file元素
- ASP.NET中Request.InputStream使用
- Ubuntu 默认启动到字符界面
- java多线程基础_深入了解Java多线程的基础知识!
- List集合对象去重及按属性去重的8种方法
- 增量式PID公式的4点疑问和理解
- 个人收集的mac破解软件免费下载(不断更新中)
- 目标导向型思维, 利他思维,迭代思维, 用忙碌打败无聊,整合型思维 重视运动
- 柳暗花明又一村 WiFi新应用实现3D物体成像
- 图像分类数据集 (FASHION-MNIST)
- java窗口上 显示学号和姓名_java编程 完成下图所示的图形用户界面设计,要求在界面中输入个人的班级、学号、姓名信息后,点击“...
热门文章
- linux mariadb 图形化,linux 初学者 - MariaDB 图形管理篇
- angularjs中ui-sref传值步骤
- mysql 实例与用户_MySQL(17):用户登录实例
- php 图片叠加,thinkPHP5 生成海报(图片叠加定位)
- 云服务器更换系统后tomcat,如何对云服务器装tomcat
- could not start avd怎么解决_双十一又到了,你的购物车塞满了吗?「购物车」用英语该怎么说?...
- elementui 菜单标题_elementUI 动态渲染三级菜单
- 安卓团课快进_青年大学习网上主题团课第十季第七期答案
- 对listView的理解
- ApplicationId 与 PackageName