MCPcopy Index your code
hub / github.com/Metarget/metarget

github.com/Metarget/metarget @v1.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v1.0 ↗ · + Follow
232 symbols 596 edges 61 files 50 documented · 22%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

metarget-logo

中文 | 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发行版
    • 可以阅读对应漏洞的提示来选择合适的发行版(后面列表中名字后面带星号的部分漏洞)
  • 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 漏洞环境镜像

受用户网络环境、ubuntu版本、Docker版本的影响,通过自动化脚本一键安装漏洞环境偶尔还是会失败,因此我们首次提供漏洞环境镜像。

执行以下命令build 漏洞环境镜像

sudo docker build -t vuln-docker-24.0.7 -f vuln-docker-24.0.7 .

执行以下命令运行目标漏洞环境镜像:

docker run vuln-XXX

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

正在开发,暂不支持。

4 场景列表

4.1 云原生组件脆弱场景

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

场景名称 涉及组件 场景类型 CVSS 3.x Writeup ATT&CK映射
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-2024-21626|docker/runc|容器逃逸|8.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|| |cve-2023-3269*|kernel|权限提升|[7.8](https://nvd.nist.gov/vuln/detail/C

Core symbols most depended-on inside this repo

uninstall
called by 14
core/env_managers/installer_template.py
install_by_version
called by 9
core/env_managers/installer_template.py
_create_k8s_resources
called by 7
core/env_managers/installer.py
_pull_domestic_images
called by 6
core/env_managers/installer.py
allocation_helper
called by 5
vulns_app/glibc/cve-2023-4911/exp/exploit.c
_add_apt_repository
called by 5
core/env_managers/installer.py
xmkdir
called by 5
writeups_cnv/kernel-cve-2021-3493/poc.c
debug
called by 4
utils/color_print.py

Shape

Function 147
Method 58
Class 26
Route 1

Languages

Python58%
C41%
TypeScript1%

Modules by API surface

writeups_cnv/kernel-cve-2017-1000112/poc.c50 symbols
writeups_cnv/kernel-cve-2017-7308/poc.c29 symbols
core/env_managers/installer.py20 symbols
core/env_managers/kubernetes_installer.py15 symbols
core/env_managers/kernel_installer.py11 symbols
utils/checkers.py10 symbols
vulns_app/openssl/CVE-2014-0160/exp/ssltest.py6 symbols
writeups_cnv/kernel-cve-2021-3493/poc.c5 symbols
vulns_app/glibc/cve-2023-4911/exp/exploit.c5 symbols
utils/color_print.py5 symbols
core/env_managers/cni_plugin_installer.py5 symbols
cmds/target.py5 symbols

Datastores touched

(mysql)Database · 1 repos
(mongodb)Database · 1 repos
localDatabase · 1 repos
rocketchatDatabase · 1 repos

For agents

$ claude mcp add metarget \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact