Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
limeyard — 一个故意存在漏洞的 Docker 实验环境,具有可路由的 DNS 资产和每个目标对应的机器可读答案密钥,可在本地对扫描器的精确率、召回率和范围进行评分。 | Kitploit
工具/GitHubGitHub/clickswave/limeyard
漏洞扫描器容器安全网络映射漏洞分析DNS和子域名枚举安全虚拟化Web安全渗透测试DevSecOps学习与教育实验室与实践
GitHub
1144天前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
clickswave/limeyard

limeyard

一个故意存在漏洞的 Docker 实验环境,具有可路由的 DNS 资产和每个目标对应的机器可读答案密钥,可在本地对扫描器的精确率、召回率和范围进行评分。

查看仓库
分享

limeyard

一个安全测试实验室。一组刻意设计为存在漏洞的目标、一个可路由的网络资产环境(带有用于资产发现的权威 DNS 以供枚举)、每个目标的机器可读答案密钥,以及一个用于驱动这一切的控制面板。

这里的一切都是刻意设计为存在漏洞的。仅供本地测试。 不要将其暴露到互联网或不受信任的网络。发布的端口绑定到 127.0.0.1;实验室目标完全不绑定任何端口。

我们自己的扫描器会故意在这些容器内获得 RCE,因此容器被视为安全边界:每个镜像都通过摘要固定,每个服务都丢弃所有能力并仅添加最低限度的能力,./lime audit 会强制执行这一点。首次运行前请阅读 SECURITY.md,包括关于容器隔离无法覆盖哪些内容的部分。

limeyard 控制面板,列出每个目标的类型、状态、地址和上游

位于 http://127.0.0.1:7000 的控制面板,显示实验室运行时的状态。

limeyard 以前叫 vuln_apps。它被重命名是因为它不再是一个应用程序文件夹:它现在包含裸服务、一个 DNS 区域、一对 WAF、一个精确目标和 APK 测试夹具,这些都不是应用程序。

为什么改变

旧的目标集得分 9/9,零漏报,零误报。一个不可能失败的基准测试无法检测回归。结构上有三个问题:

  • 五个引擎中有三个没有基准真值。 每个应用都是 127.0.0.1:70xx,因此子域枚举没有任何东西可枚举,端口扫描被直接给出了答案,服务指纹识别从未见过非 HTTP 守护进程。
  • 101 个检测模板中只有 11 个曾经触发过。 其余 90 个发布时没有任何类型的实时目标。
  • 没有任何东西衡量精确度。 每个目标都确实存在漏洞,因此“零误报”是无法证伪的。

快速开始

你需要 Docker(带 compose 插件)和 git。仅此而已。

root@kitploit:~
curl -fsSL https://raw.githubusercontent.com/clickswave/limeyard/main/install.sh | bash

这会将实验室克隆到 ./limeyard,用新的 API 令牌写入其 .env,构建并启动控制平面,然后询问要运行什么。在启动任何东西之前,它会显示所选内容在参考机器上空闲时测得的成本,并与你机器的可用资源进行对比:

root@kitploit:~
This selection, idle, on the box it was measured on:
  17 targets, 1 scenarios, 45 containers
  RAM  about 2.9 GB resident  (host has 22.4 GB available)
  disk about 11.0 GB of images to pull  (host has 111 GB free)
  CPU  near idle once up (3% of one core); pulling and first boots are the busy part
Start it? [y/N]

非交互式:curl ... | bash -s -- --light --yes(或 --all、--none、--pick dvwa,juice-shop,estate)。用 LIMEYARD_DIR=/path 将检出目录放到别处。

然后面板位于 http://127.0.0.1:7000,手动执行相同操作:

root@kitploit:~
./lime setup                  # 再次运行向导,随时可用
./lime start --all            # 每个轻量目标
./lime start crapi --heavy    # 一个重量级目标,显式指定
./lime scenario-up estate     # 网络资产环境:DNS、虚拟主机、服务
./lime status                 # 当前运行状态
./lime stop --all --heavy     # 全部停止;镜像和卷保留
./lime credits                # 每个目标的作者,以及许可协议
./lime doctor                 # 环境、归属和磁盘检查
./lime doctor --fix           # 应用每个检查的自动修复,然后重新检查
./lime audit                  # 容器加固 + 供应链不变量
./lime pin                    # 报告镜像相对于注册表的漂移

不使用安装程序,手动操作:

root@kitploit:~
git clone https://github.com/clickswave/limeyard && cd limeyard
cp .env.example .env
echo "LIMEYARD_DIR=$PWD"                 >> .env
echo "LIME_TOKEN=$(openssl rand -hex 24)" >> .env   # 必需,见 SECURITY.md
docker compose up -d --build  # 控制平面 + UI 位于 http://127.0.0.1:7000
./lime setup

每个清单都带有一个实测的 resources 块(容器、空闲 RAM、镜像磁盘、空闲 CPU)。向导、面板的选择条和每个目标的页面都从中汇总,因此估算在任何地方都一致。

分支

两个,且仅有两个。

  • main 是安装程序克隆的分支,也是你不做任何操作时得到的分支。它通过拉取请求推进,绝不通过直接推送。
  • dev 是默认分支,也是工作落地的分支。针对它提交拉取请求。

概念

target一个被测对象,具有声明的 kind。拥有一个 compose 文件、可选的 setup 以及自己的答案密钥。作为自己独立的 compose 项目运行,因此两个使用 Postgres 的目标永远不会共享一个
scenario多个目标连接成一个带有权威 DNS 的网络拓扑。资产发现据此评分
truth机器可读的答案密钥。见 truth/schema.md
doctor一个检查列表,每个检查都有裁决:环境、归属、供应链、加固。具有明确修复方法的检查在面板(/doctor)和 CLI 的 --fix 中带有一键修复:创建网络、回收磁盘、固定镜像、获取源、重新验证运行中的目标、重写非回环绑定。归属、端口冲突和加固需要人工处理

类型:web api bench cve service estate edge control mobile。

布局

root@kitploit:~
targets/<kind>/<slug>/     target.yml, compose.yml, setup.sh, truth.yml
scenarios/<slug>/          scenario.yml, compose.yml, zones/
control/limed/             the daemon: CLI + HTTP API + scorer
control/ui/                the SvelteKit control panel
truth/                     the contract, and dated scorecards

控制面板

docker compose up -d 启动两个容器,仅此而已:limeyard_control(limed 守护进程,持有 Docker socket)和 limeyard_ui(SvelteKit 面板)。两者都仅绑定回环。面板位于 http://127.0.0.1:7000,原始 API 位于 http://127.0.0.1:7099。两者都需要 .env,其中的 LIME_TOKEN 是必需的:面板在服务端持有令牌,浏览器永远看不到它。

页面用途
Targets每个目标,按类型和状态过滤、排序、多选并支持 Start、Stop、Restart。点击一行进入目标
Target事实(地址、凭据、技术栈、上游、验证、镜像摘要)、实时日志,以及答案密钥及其否定项
Scenarios资产环境:解析器、区域、子网,以及带每个容器状态的主机表。启动、停止、重启
Scorecard最新运行及其增量、按类别和按目标的覆盖率、遗漏的 id、可查看的历史记录,以及两次运行的差异
Ports什么绑定在 localhost 上,什么仅存在于实验室网桥上
Doctor一个检查列表,每个检查都有裁决。Fix 和 Fix all 首先显示确切的命令和文件编辑(根据实验室当前状态计算),并在确认后运行它们。一个修复如果让其检查仍然失败,会如实说明
Credits每个目标的作者以及许可协议

面板会自我更新:limed 通过 SSE 流式传输状态转换,因此从 CLI 启动的目标无需刷新即可显示。页头从同一流中携带主机的 CPU、RAM 和可用磁盘,仅在值得注意时着色。每个表格都可通过点击列标题排序;再次点击会翻转方向。

在更改面板或守护进程后,重新构建这一对:

root@kitploit:~
docker compose up -d --build

要在不重新构建镜像的情况下针对运行中的守护进程开发面板:

root@kitploit:~
cd control/ui && npm install
LIMED_URL=http://127.0.0.1:7099 LIME_TOKEN=<from .env> npm run dev   # :7000

API

除 /api/health 外的每个调用都需要 X-Lime-Token。

root@kitploit:~
GET  /api/targets                    list, with state and attribution
GET  /api/targets/<slug>             plus truth, images, lab addresses
GET  /api/targets/<slug>/logs        SSE, docker compose logs -f
POST /api/targets/<slug>/<action>    start | stop | restart | pull | setup
POST /api/targets/bulk               {action, slugs}: a pool of three, per-slug refusals
GET  /api/scenarios                  with per-host container state
POST /api/scenarios/<slug>/<action>  up | down | restart
GET  /api/scorecards                 newest first, by_class carries false positives
GET  /api/scorecards/<id>            one card
POST /api/score                      {tool, findings, save?, targets?}
GET  /api/doctor                     checks with verdict, reason, value, items, fix
POST /api/doctor/fix                 {ids}: those checks, or every fixable one when empty
GET  /api/ports  /api/credits  /api/truth  /api/status
GET  /api/events                     SSE: state, scenario, tick

网络

三个层级,因为单一层级正是最初的问题。

  • lime-web 网桥。Web 和 API 目标,发布在 127.0.0.1:70xx。
  • lime-lab 网桥,10.66.0.0/16,静态 IP,无主机绑定。扫描器作为容器加入此网络,看到的是具有真实主机和真实端口的真实子网,而不是回环端口列表。
  • lime-edge WAF 层级,源站可达但不在 DNS 中。

DNS 是 .test 区域上的权威 BIND(RFC 6761 保留了它)。Docker 网络别名刻意不作为事实来源:它们永远不会出现在区域传输中,并且会使拓扑与答案密钥不一致。

端口

范围用途
7000UI
7099limed API
7001-7099web 和 api 目标
7100-7199基准测试套件
7200-7299CVE 实验室
7300-7399edge 和 control 目标
5353实验室 DNS
无service 和 estate 目标,仅 lime-lab 地址

评分

每个目标都附带一个 truth.yml。评分器将发现结果转化为精确度、召回率和 F1,按目标和按类别:

root@kitploit:~
curl -s -XPOST localhost:7099/api/score -H 'Content-Type: application/json' \
  -d '{"tool":"crossfyre","save":true,"findings":[...]}'

统计三件事,而不是一件。召回率:我们是否找到了存在的东西。精确度:我们是否避免了报告不存在的东西,依据每个答案密钥都携带的 negative 条目来衡量。范围:我们正确地没有尝试什么,记录下来以免每个季度都有人重新争论。

mirage 目标仅为第二项而存在。其中没有任何东西存在漏洞,而其中一切看起来都像是有漏洞的,因此针对它的任何发现从构造上就是误报。

贡献

CONTRIBUTING.md 包含了全部内容:贡献通常是什么、./lime audit 强制执行的不变量,以及为什么在这里修正答案密钥比新增功能更有价值。规则的简短版本如下。所有参与者都受行为准则约束。

添加目标

root@kitploit:~
targets/<kind>/<slug>/
  target.yml    manifest, including a REQUIRED upstream block
  compose.yml   the containers. 127.0.0.1 binds only
  setup.sh      optional one-time init, run after start
  truth.yml     the answer key

保持实验室整洁的规则:

  • 仅绑定目标端口,绑定到 127.0.0.1。
  • 单容器目标仅加入 [lime-web]。不要添加每个项目的网络:网络太多会导致 Docker 地址池耗尽。
  • 带数据库的目标加入 [default, lime-web],并将数据库仅放在 [default] 上。每个目标获得自己的数据库服务和卷。
  • 为被发现而非被浏览而存在的目标加入 [lime-lab],使用静态 IP,不发布任何主机端口。
  • upstream 是必需的。 lime doctor 会让没有它的目标失败,管理器拒绝注册这样的目标。见下文。
  • limeyard 不内置任何第三方源代码。将 repo: 和 compose: 放入清单,源代码会在运行时获取到 <target>/src。
  • 记录它的成本。启动它,让它稳定下来,然后 ./lime measure <slug> 打印出要粘贴的 resources 块。安装程序和面板会将这些加起来,以便在有人启动之前发出警告,所以这里的猜测就是那里的谎言。

信任与隔离

目标是别人的刻意设计为存在漏洞的软件,因此来源是被记录而非假设的,运行时是被约束而非信任的。SECURITY.md 有完整的情况;简短版本:

  • 每个镜像都通过摘要固定,而不是浮动标签,固定到在此处拉取和测试的摘要。./lime pin 报告漂移。
  • 发布者按镜像记录:Docker 官方镜像、项目组织账户(OWASP、ISC、Traefik、Prometheus),或作者自己的命名空间。两个最薄弱的环节,raesene/bwapp(已归档,最后重建于 2022 年,无许可证)和 delfer/alpine-ftp-server(个人),被如此标明。
  • 每个服务都以 no-new-privileges、cap_drop: ALL 加上每个镜像最低限度的 cap_add、pid 上限和内存上限运行。数据库层级位于 internal: true 网络上,没有对外路由。
  • limed 持有 Docker socket,即主机上的 root,因此它在每次调用时都需要共享密钥。被攻陷的目标可以访问它但学不到任何东西。
  • ./lime audit 会在 privileged、主机网络、目标中的 socket 挂载、非回环绑定、未固定镜像或缺失令牌时失败。

这里没有任何东西能防御内核级容器逃逸。为此,请使用一次性 VM。

归属

这里几乎所有东西都是别人写的,而且有几个目标完全没有声明许可证。因此,署名作者是硬性门槛,而非惯例:

  • target.yml 带有一个必需的 upstream 块:作者、仓库、许可证,以及我们最后验证其可构建的日期。当容器化者与作者不同时,packager 记录容器化者。
  • 每个仪表板卡片都在目标名称下显示作者,链接到源,旁边是许可证。许可证为 none declared 会渲染为警告,这也是禁止再分发的信号。
  • 每个目标的详情视图以署名块开头,位于漏洞列表之上,我们的答案密钥与上游自己的文档清晰分开。
  • UI 中的 /credits 和 ./lime credits 列出每个目标、作者和许可证。./lime credits --markdown 重新生成下面的部分。

致谢

limeyard 运行别人的作品。下面的每个目标和场景都是别人构建的,除非它标明 Clickswave。

api

目标作者许可证来源
OWASP crAPIOWASP crAPI projectApache-2.0repo
DVGADolev FarhiMITrepo
VAmPIerev0sMITrepo

bench

目标作者许可证来源
CrawlgroundZAP project (zaproxy)Apache-2.0repo
Security Crawl MazeGoogleApache-2.0repo
OWASP VulnerableAppSasanLabs (OWASP VulnerableApp project)Apache-2.0repo
XSSMazehahwul (author of dalfox)MITrepo

control

目标作者许可证来源
mirageClickswaveMITrepo

cve

目标作者许可证来源
Log4Shell labChristophe Tafani-Dereeper (christophetd)Apache-2.0repo

edge

目标作者许可证来源
ModSecurity CRS pairOWASP Core Rule Set project (coreruleset)Apache-2.0repo

mobile

目标作者许可证来源
AndroGoatSatish Patnayaknone declaredrepo

scenario

场景作者许可证来源
estateClickswaveMIT-

service

目标作者许可证来源
Open servicesClickswave (composition of upstream official images)mixed, per-image-

web

目标作者许可证来源
bWAPPMalik Mesellem (pkg: Rory McCune (raesene))none declaredrepo
DVWARobin Wood (digininja)GPL-3.0repo
FaultLine ISPClickswaveMITrepo
OWASP Juice ShopBjoern Kimminich (OWASP Juice Shop project)MITrepo
OWASP Mutillidae IIJeremy Druin (webpwnized), OWASP Mutillidae IIGPL-3.0repo
OWASP RailsGoatOWASP RailsGoat projectMITrepo
OWASP WebGoat + WebWolfOWASP WebGoat projectGPL-2.0repo
下载工具