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命名空间。受用户网络环境、ubuntu版本、Docker版本的影响,通过自动化脚本一键安装漏洞环境偶尔还是会失败,因此我们首次提供漏洞环境镜像。
执行以下命令build 漏洞环境镜像
sudo docker build -t vuln-docker-24.0.7 -f vuln-docker-24.0.7 .
执行以下命令运行目标漏洞环境镜像:
docker run vuln-XXX
正在开发,暂不支持。
如果某个脆弱场景名称的末尾带了星号(*),你还需要关注表格下面提供的关于此场景的其他说明。
| 场景名称 | 涉及组件 | 场景类型 | 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
$ claude mcp add metarget \
-- python -m otcore.mcp_server <graph>