Metarget is a framework providing automatic constructions of vulnerable infrastructures.
APACHE-2.0 License
Metarget的名称来源于meta-
(元)加target
(目标,靶机),是一个脆弱基础设施自动化构建框架,主要用于快速、自动化搭建从简单到复杂的脆弱云原生靶机环境。
「绿盟科技研究通讯」上发布了一篇阐述Metarget的设计理念和技术目标的文章,见Metarget:云原生攻防靶场开源啦!。
在研究漏洞时,我们经常会发现“环境搭建”这一步骤本身就会占用大量的时间,与之相比,真正测试PoC、ExP的时间可能非常短。由于许多官方镜像在国内的网络环境下并不方便获得,加上云原生组件自身的复杂性,在云原生安全领域,前述问题尤为明显。
与此同时,我们也能看到,开源社区涌现出一些优秀的安全项目,如Vulhub、VulApps等,将漏洞场景打包成镜像,方便研究人员开箱即用。
然而,这些项目主要针对应用程序漏洞。那么,如果我们需要研究的是Docker、Kubernetes、操作系统内核等底层基础设施自身的漏洞呢?这又回到了前面的环境搭建问题。
我们希望Metarget能够在一定程度上解决这个问题,致力于底层基础设施的脆弱场景自动化构建。在此之上,我们还希望Metarget实现对云原生环境多层次脆弱场景的自动化构建。
在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 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)的安全性,不推荐将本项目用于正常业务组件、集群的安装和部署。
拉取仓库,安装必要库文件:
git clone https://github.com/brant-ruan/metarget.git
cd metarget/
pip3 install -r requirements.txt
使用Metarget,搭建脆弱场景,例如:
./metarget cnv install cve-2019-5736
暂不支持。
Metarget需要以root权限运行。
建议在执行命令时加上--verbose
参数,方便调试。
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
了解当前支持的云原生组件。
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
执行以下命令:
./metarget gadget install docker --version 18.03.1
执行成功后,版本为18.03.1的Docker将被安装在当前Linux系统上。
执行以下命令:
./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
脚本复制到每个工作节点上执行即可。
执行以下命令:
./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将自动使用已下载的包。
执行以下命令:
./metarget gadget install kernel --version 5.7.5
执行成功后,版本为5.7.5的内核将被安装在当前Linux系统上。
注意:
当前Metarget采用两种方法安装内核:
内核安装成功后需要重新启动系统以生效,Metarget会提醒是否自动重启系统。
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
了解当前支持的云原生组件脆弱场景。
执行以下命令:
./metarget cnv install cve-2019-5736
执行成功后,存在CVE-2019-5736漏洞的Docker将被安装在当前Linux系统上。
执行以下命令:
./metarget cnv install cve-2018-1002105
执行成功后,存在CVE-2018-1002105漏洞的Kubernetes单节点集群将被安装在当前Linux系统上。
考虑到特殊的网络环境,国内的朋友如果无法访问Kubernetes官方镜像源,可以指定以下参数,以顺利完成Kubernetes的部署:
--domestic
:当使用该选项时,Metarget将自动从国内源(阿里云)下载Kubernetes系统组件镜像,无需代理(偶尔会下载失败,需多次尝试)如果主机能够直接访问Kubernetes官方镜像源,则不必指定该参数。
执行以下命令:
./metarget cnv install kata-escape-2020
执行成功后,存在CVE-2020-2023/2025/2026等漏洞的Kata-containers将被安装在当前系统上。
考虑到特殊的网络环境,国内的朋友如果无法下载Kata-containers安装包,可以通过--https-proxy
参数指定代理,也可以预先从Github上下载Kata-containers压缩包放置在data/
目录下,Metarget将自动使用已下载的包。
执行以下命令:
./metarget cnv install cve-2016-5195
执行成功后,存在CVE-2016-5195漏洞的Linux内核将被安装在当前系统上。
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相关命令来完成。
执行以下命令:
./metarget appv install dvwa
执行成功后,DVWA将以Deployment和Service资源的形式被部署在当前集群中。
注意:
--external
选项让服务以Nodeport
形式暴露出来,这样一来,你就能够通过工作节点的IP访问到该服务(默认情况下,服务类型为ClusterIP
)。--host-net
选项,这样一来,该脆弱应用将共享宿主机网络命名空间。--host-pid
选项,这样一来,该脆弱应用将共享宿主机PID命名空间。正在开发,暂不支持。
如果某个脆弱场景名称的末尾带了星号(*),你还需要关注表格下面提供的关于此场景的其他说明。
注意:
--verbose
参数,方便调试。权限提升
,有的则是容器逃逸
。本质上来说,这两者的区别主要在于攻击载荷(获得一个高权限shell还是先逃逸)。
cnv install cve-2021-30465
(安装了Docker)之后,
cnv install cve-2018-1002105
或gadget install k8s --version 1.16.5
),从而实现漏洞利用。应用脆弱场景主要集成自开源社区中的其他项目:
真诚感谢以上开源项目为安全社区做出的贡献!
Metarget将以上项目中的靶机统一转化为Kubernetes中的Deployment和Service资源,使管理更加方便(感谢kompose)。
可执行以下命令查看Metarget支持构建的应用脆弱场景:
./metarget appv list
注意:
cve-2019-3396-db
(Vulhub中为db
)。Metarget的初衷之一是方便安全研究人员在漏洞出现的第一时间快速搭建漏洞环境(进一步地,随时随地搭建已集成的任意漏洞环境)。
为了保持靶场的“新鲜性”,Metarget的漏洞列表将持续更新。Metarget采用YAML文件的形式描述并集成漏洞环境,目前提供“云原生组件漏洞”和“云原生应用漏洞”两个层次的环境,对应描述文件分别位于vulns_cn
和vulns_app
目录下。
我们希望并鼓励大家参与维护Metarget,一起推进项目,借助Metarget沉淀、分享我们的研究所得,共同促进云原生安全发展。
目前来说,您可以通过以下两种方式参与到项目中:
参与方式详见CONTRIBUTING-zh.md。
我们非常欢迎高校、科研院所等单位共同参与进来!我们相信云原生安全是未来网络安全领域的重要研究方向,而Metarget正是为这样的研究提供了理想的实验平台。通过我们强大而灵活的框架,您可以深入研究云原生环境中的安全挑战,探索创新的解决方案,并为行业发展贡献您的智慧和发现。
Metarget将为合作者提供了以下特色支持:
加入Metarget,您将获得全面的技术支持和合作机会,探索云原生安全的前沿,为未来网络安全的发展添砖加瓦。我们期待您的参与,共同开创网络安全研究的新篇章!
Metarget logo的灵感来源于Kubernetes的logo,我们将Kubernetes的舵作为齿轮,三个齿轮组成一个正在运转的基础设施系统。然而,如果仔细观察,会发现齿轮的方向是矛盾的,系统无法正常运转(vulnerable)。
Metarget采用的开源许可证是Apache License 2.0,阅读LICENSE文件了解更多。