metarget

Metarget is a framework providing automatic constructions of vulnerable infrastructures.

APACHE-2.0 License

Stars
1K

中文 | English

1 项目介绍

Metarget的名称来源于meta-(元)加target(目标,靶机),是一个脆弱基础设施自动化构建框架,主要用于快速、自动化搭建从简单到复杂的脆弱云原生靶机环境。

「绿盟科技研究通讯」上发布了一篇阐述Metarget的设计理念和技术目标的文章,见Metarget:云原生攻防靶场开源啦!

1.1 项目的缘起

在研究漏洞时,我们经常会发现“环境搭建”这一步骤本身就会占用大量的时间,与之相比,真正测试PoC、ExP的时间可能非常短。由于许多官方镜像在国内的网络环境下并不方便获得,加上云原生组件自身的复杂性,在云原生安全领域,前述问题尤为明显。

与此同时,我们也能看到,开源社区涌现出一些优秀的安全项目,如VulhubVulApps等,将漏洞场景打包成镜像,方便研究人员开箱即用。

然而,这些项目主要针对应用程序漏洞。那么,如果我们需要研究的是Docker、Kubernetes、操作系统内核等底层基础设施自身的漏洞呢?这又回到了前面的环境搭建问题。

我们希望Metarget能够在一定程度上解决这个问题,致力于底层基础设施的脆弱场景自动化构建。在此之上,我们还希望Metarget实现对云原生环境多层次脆弱场景的自动化构建。

1.2 “安装漏洞”

在Metarget项目中,我们提出“安装漏洞”、“安装脆弱场景”的概念。漏洞为什么不能像软件一样直接安装呢?程序为实,漏洞为虚;软件为满,漏洞为缺。那么只需换一种视角,视虚为实,以缺为满,我们完全可以像安装软件一样安装漏洞——以安全研究、攻防实战为目的。

具体来说,我们希望:

  • 执行metarget cnv install cve-2019-5736直接将带有CVE-2019-5736漏洞的Docker安装在服务器上。
  • 执行metarget cnv install cve-2018-1002105直接将带有CVE-2018-1002105漏洞的Kubernetes安装在服务器上。
  • 执行metarget cnv install kata-escape-2020直接将带有CVE-2020-2023/2025/2026等漏洞的Kata-containers安装在服务器上。
  • 执行metarget cnv install cve-2016-5195直接将系统切换为带有脏牛漏洞的内核。

有点酷了,是不是?不要讲那么多,不要RTFM,我只想一键搞定环境泡杯咖啡,然后开始漏洞研究。

在这个基础上,我们还希望:

  • 攻防相关的同学能够借助Metarget快速搭建从简单到复杂的云原生靶场环境,从而积累云原生环境下的渗透经验。
  • 执行metarget appv install dvwa直接安装一个DVWA靶机到脆弱的底层基础设施上。
  • 执行metarget appv install thinkphp-5-0-23-rce --external直接安装一个ThinkPHP RCE漏洞环境到脆弱的底层基础设施上,并以NodePort形式将端口暴露出来。

在一个刚刚装好的Ubuntu操作系统上,安装Metarget,然后简单执行五条指令就能完成一个多层次脆弱靶机场景搭建:

./metarget cnv install cve-2016-5195 # 内核漏洞层面容器逃逸
./metarget cnv install cve-2019-5736 # Docker层面容器逃逸
./metarget cnv install cve-2018-1002105 --domestic # Kubernetes单节点集群(包含权限提升漏洞)
./metarget cnv install privileged-container # 部署一个特权容器
./metarget appv install dvwa --external # 部署一个DVWA靶机

RCE、容器逃逸、横向移动、隐蔽持久化,统统打包送给你。

在这个基础上,我们还希望......

先留个悬念,请拭目以待 :)

注意:

本项目目的在于自动化构建用于信息安全研究的脆弱场景,不保证生成的场景(如自动化安装的Kubernetes)的安全性,不推荐将本项目用于正常业务组件、集群的安装和部署。

2 安装方法

2.1 依赖项

  • Ubuntu 16.04或18.04(推荐)
    • 在某些情况下(例如,新的内核漏洞),需要使用特定的Ubuntu发行版s
    • 可以阅读对应漏洞的提示来选择合适的发行版(后面列表中名字后面带星号的部分漏洞)
  • Python >= 3.6 (不支持Python 2.x!)
  • pip3

2.2 从源码安装

拉取仓库,安装必要库文件:

git clone https://github.com/brant-ruan/metarget.git
cd metarget/
pip3 install -r requirements.txt

使用Metarget,搭建脆弱场景,例如:

./metarget cnv install cve-2019-5736

2.3 从PyPI安装

暂不支持。

3 使用方法

Metarget需要以root权限运行。

建议在执行命令时加上--verbose参数,方便调试。

3.1 基本操作

usage: metarget [-h] [-v] subcommand ...

automatic constructions of vulnerable infrastructures

positional arguments:
  subcommand     description
    gadget       cloud native gadgets (docker/k8s/...) management
    cnv          cloud native vulnerabilities management
    appv         application vulnerabilities management

optional arguments:
  -h, --help     show this help message and exit
  -v, --version  show program's version number and exit

执行./metarget gadget list了解当前支持的云原生组件。

3.2 管理云原生组件

usage: metarget gadget [-h] subcommand ...

positional arguments:
  subcommand  description
    list      list supported gadgets
    install   install gadgets
    remove    uninstall gadgets

optional arguments:
  -h, --help  show this help message and exit

3.2.1 示例:安装指定版本Docker

执行以下命令:

./metarget gadget install docker --version 18.03.1

执行成功后,版本为18.03.1的Docker将被安装在当前Linux系统上。

3.2.2 示例:安装指定版本Kubernetes

执行以下命令:

./metarget gadget install k8s --version 1.16.5

执行成功后,版本为1.16.5的单节点Kubernetes将被安装在当前Linux系统上。

注意:

Kubernetes通常需要配置大量参数,Metarget项目提供了部分参数供指定:

  -v VERSION, --version VERSION
                        gadget version
  --cni-plugin CNI_PLUGIN
                        cni plugin, flannel by default
  --pod-network-cidr POD_NETWORK_CIDR
                        pod network cidr, default cidr for each plugin by
                        default
  --taint-master        taint master node or not
  --domestic            magic

考虑到特殊的网络环境,国内的朋友如果无法访问Kubernetes官方镜像源,可以指定以下参数,以顺利完成Kubernetes的部署:

  • --domestic:当使用该选项时,Metarget将自动从国内源(阿里云)下载Kubernetes系统组件镜像,无需代理(偶尔会下载失败,需多次尝试)

如果主机能够直接访问Kubernetes官方镜像源,则不必指定该参数。

Metarget支持部署多节点Kubernetes集群环境,如果想要部署多节点,在单节点部署成功后,将tools目录下生成的install_k8s_worker.sh脚本复制到每个工作节点上执行即可。

3.2.3 示例:安装指定版本的Kata-containers

执行以下命令:

./metarget gadget install kata --version 1.10.0

执行成功后,版本为1.10.0的Kata-containers将被安装在当前Linux系统上。

注意:

你也可以通过--kata-runtime-type选项指定kata运行时的类型(如qemu、clh、fc等),默认值为qemu

考虑到特殊的网络环境,国内的朋友如果无法下载Kata-containers安装包,可以通过--https-proxy参数指定代理,也可以预先从Github上下载Kata-containers压缩包放置在data/目录下,Metarget将自动使用已下载的包。

3.2.4 示例:安装指定版本Linux内核

执行以下命令:

./metarget gadget install kernel --version 5.7.5

执行成功后,版本为5.7.5的内核将被安装在当前Linux系统上。

注意:

当前Metarget采用两种方法安装内核:

  1. apt
  2. 在apt无备选包的情况下,直接远程下载Ubuntu deb内核包进行安装

内核安装成功后需要重新启动系统以生效,Metarget会提醒是否自动重启系统。

3.3 管理“云原生组件”的脆弱场景

usage: metarget cnv [-h] subcommand ...

positional arguments:
  subcommand  description
    list      list supported cloud native vulnerabilities
    install   install cloud native vulnerabilities
    remove    uninstall cloud native vulnerabilities

optional arguments:
  -h, --help  show this help message and exit

执行./metarget cnv list了解当前支持的云原生组件脆弱场景。

3.3.1 示例:CVE-2019-5736

执行以下命令:

./metarget cnv install cve-2019-5736

执行成功后,存在CVE-2019-5736漏洞的Docker将被安装在当前Linux系统上。

3.3.2 示例:CVE-2018-1002105

执行以下命令:

./metarget cnv install cve-2018-1002105

执行成功后,存在CVE-2018-1002105漏洞的Kubernetes单节点集群将被安装在当前Linux系统上。

考虑到特殊的网络环境,国内的朋友如果无法访问Kubernetes官方镜像源,可以指定以下参数,以顺利完成Kubernetes的部署:

  • --domestic:当使用该选项时,Metarget将自动从国内源(阿里云)下载Kubernetes系统组件镜像,无需代理(偶尔会下载失败,需多次尝试)

如果主机能够直接访问Kubernetes官方镜像源,则不必指定该参数。

3.3.3 示例:Kata-containers安全容器逃逸

执行以下命令:

./metarget cnv install kata-escape-2020

执行成功后,存在CVE-2020-2023/2025/2026等漏洞的Kata-containers将被安装在当前系统上。

考虑到特殊的网络环境,国内的朋友如果无法下载Kata-containers安装包,可以通过--https-proxy参数指定代理,也可以预先从Github上下载Kata-containers压缩包放置在data/目录下,Metarget将自动使用已下载的包。

3.3.4 示例:CVE-2016-5195

执行以下命令:

./metarget cnv install cve-2016-5195

执行成功后,存在CVE-2016-5195漏洞的Linux内核将被安装在当前系统上。

3.4 管理“云原生应用”的脆弱场景

usage: metarget appv [-h] subcommand ...

positional arguments:
  subcommand  description
    list      list supported application vulnerabilities
    install   install application vulnerabilities
    remove    uninstall application vulnerabilities

optional arguments:
  -h, --help  show this help message and exit

执行./metarget appv list了解当前支持的云原生应用脆弱场景。

注意:

在构建云原生应用的脆弱场景前,需要先安装Docker及Kubernetes,可以使用Metarget相关命令来完成。

3.4.1 示例:DVWA

执行以下命令:

./metarget appv install dvwa

执行成功后,DVWA将以Deployment和Service资源的形式被部署在当前集群中。

注意:

  • 你可以通过指定--external选项让服务以Nodeport形式暴露出来,这样一来,你就能够通过工作节点的IP访问到该服务(默认情况下,服务类型为ClusterIP)。
  • 你可以指定--host-net选项,这样一来,该脆弱应用将共享宿主机网络命名空间。
  • 你可以指定--host-pid选项,这样一来,该脆弱应用将共享宿主机PID命名空间。

3.5 管理“云原生靶机集群”的脆弱场景

正在开发,暂不支持。

4 场景列表

4.1 云原生组件脆弱场景

如果某个脆弱场景名称的末尾带了星号(*),你还需要关注表格下面提供的关于此场景的其他说明。

场景名称 涉及组件 场景类型 CVSS 3.x Writeup
cve-2018-15664 docker 容器逃逸 7.5
cve-2019-13139 docker 命令执行 8.4 链接
cve-2019-14271 docker 容器逃逸 9.8 链接
cve-2020-15257 docker/containerd 容器逃逸 5.2 链接
cve-2019-5736 docker/runc 容器逃逸 8.6
cve-2019-16884 docker/runc 容器逃逸 7.5
cve-2021-30465* docker/runc 容器逃逸 7.6 链接
cve-2017-1002101 k8s 容器逃逸 9.6 链接
cve-2018-1002105 k8s 权限提升 9.8
cve-2018-1002100 k8s/kubectl 容器逃逸 5.5
cve-2019-1002101 k8s/kubectl 容器逃逸 5.5
cve-2019-11246 k8s/kubectl 容器逃逸 6.5
cve-2019-11249 k8s/kubectl 容器逃逸 6.5
cve-2019-11251 k8s/kubectl 容器逃逸 5.7
cve-2019-11253 k8s 拒绝服务 7.5
cve-2019-9512 k8s 拒绝服务 7.5
cve-2019-9514 k8s 拒绝服务 7.5
cve-2019-9946 k8s 流量劫持 7.5
cve-2020-8554 k8s 中间人攻击 5.0
cve-2020-10749 k8s/kubernetes-cni 中间人攻击 6.0
cve-2020-8555 k8s 服务端请求伪造(SSRF) 6.3
cve-2020-8557 k8s 拒绝服务 5.5
cve-2020-8558 k8s 服务暴露 8.8
cve-2020-8559 k8s 权限提升 6.8
cve-2021-25741 k8s 容器逃逸 8.1
cve-2016-5195 kernel 容器逃逸 7.8
cve-2016-8655 kernel 权限提升 7.8
cve-2017-6074 kernel 权限提升 7.8
cve-2017-7308 kernel 容器逃逸 7.8 链接
cve-2017-16995 kernel 权限提升 7.8
cve-2017-1000112 kernel 容器逃逸 7.0 链接
cve-2018-18955 kernel 权限提升 7.0
cve-2020-14386 kernel 容器逃逸 7.8
cve-2021-3493 kernel 权限提升 7.8 链接
cve-2021-4204 kernel 权限提升 -
cve-2021-22555 kernel 容器逃逸 7.8
cve-2022-0185 kernel 容器逃逸 8.4
cve-2022-0492 kernel 容器逃逸 7.8 链接
cve-2022-0847 kernel 容器逃逸 7.8 链接
cve-2022-0995* kernel 权限提升 7.1
cve-2022-25636* kernel 权限提升 7.8
cve-2022-23222 kernel 权限提升 7.8
cve-2022-27666* kernel 权限提升 7.8
kata-escape-2020 kata-containers 容器逃逸 6.3/8.8/8.8
cap_dac_read_search-container 危险配置 容器逃逸 - 链接
cap_sys_admin-container 危险配置 容器逃逸 -
cap_sys_ptrace-container 危险配置 容器逃逸 -
cap_sys_module-container 危险配置 容器逃逸 - 链接
privileged-container 危险配置 容器逃逸 - 链接
k8s_backdoor_daemonset 危险配置 持久化 - 链接
k8s_backdoor_cronjob 危险配置 持久化 - 链接
k8s_shadow_apiserver 危险配置 持久化 - 链接
k8s_node_proxy 危险配置 权限提升 - 链接
mount-docker-sock 危险挂载 容器逃逸 - 链接
mount-host-etc 危险挂载 容器逃逸 -
mount-host-procfs 危险挂载 容器逃逸 - 链接
mount-var-log 危险挂载 容器逃逸 - 链接

注意:

  • 建议在执行命令时加上--verbose参数,方便调试。
  • 关于内核漏洞类型的说明:大家可能会发现有的内核漏洞标注的类型是权限提升,有的则是容器逃逸。本质上来说,这两者的区别主要在于攻击载荷(获得一个高权限shell还是先逃逸)。
    • 另外,由于容器默认有一些安全机制(如Seccomp、Capabilities限制),一些内核漏洞可能较难或无法在默认配置下的容器中成功利用。
    • 因此,我们将基于Metarget验证过能够用于容器逃逸的内核漏洞标记为容器逃逸类型,其他的暂时标记为权限提升类型,后续如果利用该漏洞逃逸成功,则更新为容器逃逸类型。
  • 对于cve-2021-30465来说,在cnv install cve-2021-30465(安装了Docker)之后,
    • 你需要手动安装一个K8s(利用Metarget执行cnv install cve-2018-1002105gadget install k8s --version 1.16.5),从而实现漏洞利用。
  • 对于以下内核漏洞,需要在Ubuntu 21.10上运行Metarget(测试成功):
    • cve-2022-0995
    • cve-2022-25636
    • cve-2022-27666

4.2 云原生应用脆弱场景

应用脆弱场景主要集成自开源社区中的其他项目:

真诚感谢以上开源项目为安全社区做出的贡献!

Metarget将以上项目中的靶机统一转化为Kubernetes中的Deployment和Service资源,使管理更加方便(感谢kompose)。

可执行以下命令查看Metarget支持构建的应用脆弱场景:

./metarget appv list

注意:

5 DEMO

6 开发计划

  • 实现基本云原生组件安装部署
  • 实现经典云原生漏洞场景集成
  • 实现容器内RCE脆弱场景集成
  • 实现多节点云原生靶场集群自动化生成
  • 实现其他云原生脆弱场景集成(长期更新)

7 主要维护者

8 参与项目

Metarget的初衷之一是方便安全研究人员在漏洞出现的第一时间快速搭建漏洞环境(进一步地,随时随地搭建已集成的任意漏洞环境)。

为了保持靶场的“新鲜性”,Metarget的漏洞列表将持续更新。Metarget采用YAML文件的形式描述并集成漏洞环境,目前提供“云原生组件漏洞”和“云原生应用漏洞”两个层次的环境,对应描述文件分别位于vulns_cnvulns_app目录下。

我们希望并鼓励大家参与维护Metarget,一起推进项目,借助Metarget沉淀、分享我们的研究所得,共同促进云原生安全发展。

目前来说,您可以通过以下两种方式参与到项目中:

  1. 提交“云原生组件漏洞”的YAML描述文件。
  2. 提交“云原生应用漏洞”的YAML描述文件。

参与方式详见CONTRIBUTING-zh.md

9 合作(欢迎联系 [email protected]

我们非常欢迎高校、科研院所等单位共同参与进来!我们相信云原生安全是未来网络安全领域的重要研究方向,而Metarget正是为这样的研究提供了理想的实验平台。通过我们强大而灵活的框架,您可以深入研究云原生环境中的安全挑战,探索创新的解决方案,并为行业发展贡献您的智慧和发现。

Metarget将为合作者提供了以下特色支持:

  1. 丰富的实验场景: 利用Metarget,您可以轻松构建各种脆弱云原生靶机环境,涵盖从简单到复杂的多样实验场景。
  2. 多版本Kernel、Kubernetes等云原生组件支持: Metarget持续更新以支持最新版本的组件,确保您在实验中能够使用最新的技术。
  3. Ubuntu版本定制: 我们将根据您的实验需求定制Ubuntu版本,使您获得更灵活的实验环境配置。
  4. 多节点云原生集群自动生成: Metarget将为您提供了自动创建多节点云原生靶场集群的功能,使得研究更加真实、深入。
  5. ...

加入Metarget,您将获得全面的技术支持和合作机会,探索云原生安全的前沿,为未来网络安全的发展添砖加瓦。我们期待您的参与,共同开创网络安全研究的新篇章!

10 关于Logo

Metarget logo的灵感来源于Kubernetes的logo,我们将Kubernetes的舵作为齿轮,三个齿轮组成一个正在运转的基础设施系统。然而,如果仔细观察,会发现齿轮的方向是矛盾的,系统无法正常运转(vulnerable)。

11 开源许可证

Metarget采用的开源许可证是Apache License 2.0,阅读LICENSE文件了解更多。

11 相关事件

KCon 2021 兵器谱

OpenInfra Days Asia 2021

OpenInfra Days China 2021

CCF BDTC 2021

  • 议题:构建云原生基础设施靶场

论文引用(IEEE TPS-ISA 2021)

  • 论文:Security Challenges in the Container Cloud
  • PDF:TPS21.pdf

CSDN云原生安全技术峰会 2022

论文引用(IC2E 2022)

  • 论文:PACED: Provenance-based Automated Container Escape Detection
  • PDF:IC2E-2022.PACED.pdf

CIS 2022

Metarget加入CNCF Landscape