-
-
[原创]把 vulhub 的 500 个漏洞环境变成可检索的知识库:解析、匹配、验收全流程
-
发表于: 2天前 86
-
技术分享向帖子。工具是自研的 CVE 沙盒编排脚本集,文末有获取方式,觉得有用可以私信交流。
背景:环境搭建的重复劳动
做漏洞复现的人都知道:查 NVD 描述、CVSS、CWE → 找对应版本的漏洞应用 → 手写 compose、端口映射 → 启动、验证、重置。单个环境半小时起步,攒一批就是几天。开源社区其实早就解决了"环境有没有"的问题——vulhub 提供了 500+ 个 docker-compose 漏洞环境。但 vulhub 是人肉维护的静态目录:想用的时候要 clone 整个仓库自己翻目录,想批量复现几十个 CVE 就要一个个手动 up,新 CVE 环境只能等维护者更新。
我的思路是:不重复造轮子,把 vulhub 生态自动化——写一个解析器,把 vulhub 的目录结构变成可检索、可匹配、可批量部署的"知识库"。
一、怎么拿到 vulhub 的目录结构
最开始的方案是 git clone,但 GitHub 直连在部分网络环境下 git 协议会卡死(HEAD 请求通、git-upload-pack 不通)。绕开方案:
- GitHub API 拉文件树:
/repos/vulhub/vulhub/git/trees/master?recursive=1,一次拿到全部 2879 个文件路径 - 只下载需要的东西:
README.md+docker-compose.yml,667 个文件,总共才 4.1MB(完整仓库含截图是几百 MB) - 并发下载踩坑:20 并发限流丢文件,重试补齐(慢速双源:raw + jsdelivr)
二、无依赖的 compose 解析器
知识库只需要 compose 里的四个字段:镜像名、端口映射、启动命令、环境变量。不想为这一个功能引入 PyYAML 依赖,写了个 ~100 行的缩进解析器,覆盖 vulhub 的常见写法:
ports的四种写法(8080:8080/"8080:8080"/127.0.0.1:8080:8080/8080/udp)command的字符串和列表两种形态environment的 map 和 list 两种形态- 多 service 环境(如 victim + attacker)
解析不了的就优雅降级(字段留空 + notes 标注),绝不崩。
三、CVE 提取与多环境合并
每个环境的 README 里正则提取 CVE 编号。vulhub 里同一个 CVE 常有多个环境(不同版本),合并成一条知识库条目、多个 variant——部署时按需选。336 个环境最终得到 250 条 CVE 映射(97 个环境没有 CVE 编号,跳过并记录在报告里)。
四、验收:真正动手才算数
知识库导入只是开始,每条映射都要能真部署。抽样验收 4 个高价值 CVE:
- CVE-2016-4437(Shiro)→ 源码模板本地构建 → HTTP 200 PASS
- CVE-2017-5638(Struts2 S2-045)→ 源码模板本地构建 → HTTP 200 PASS
- CVE-2021-44228(Log4Shell)→ 源码模板本地构建 → HTTP 200 PASS
- CVE-2014-0160(Heartbleed)→ vulhub 镜像类,测试机 Docker Hub 不可达,未能实测
结论:源码模板路径(本地构建)链路完整可用,镜像类环境映射有效但依赖网络可达。验收通过的条目才标 verified: true,其余保持待验收——宁可标注未验证,不假装全都能跑。
五、产出
image-registry.json:251 条 CVE 映射(234 个镜像/模板、273 个 variant)- 命令行:输入 CVE 编号 → 自动拉 NVD → 知识库精确匹配 → 生成可部署沙盒;未匹配生成接入计划
- 批量:多环境同时映射、批量部署、HTTP 验收、一键重置
- 增量:新 CVE 可以用自动接入引擎(NVD 画像 → Maven/PyPI/Packagist 定位 → 脚手架 → 构建验收)半自动接入
获取
工具整理为版本化发布包(AI 工作流版:填 VM 信息和 CVE 列表即可自动部署验收;Linux 工具版:命令行操作)。仅限授权环境使用,不附带攻击载荷。感兴趣私信交流。
附:合规说明——本文分享的是环境编排技术,不包含任何攻击载荷和漏洞利用代码;vulhub 环境仅供授权研究使用。