verebes1/NexusFlow
GitHub: verebes1/NexusFlow
一个模拟SaaS监控平台的故意漏洞Flask应用,用于安全意识培训和SSRF、XXE漏洞演示。
Stars: 0 | Forks: 0
# NexusFlow
一个故意设置漏洞的 Flask 应用程序,用于安全意识演示。它被设计成一个完善的基础设施监控 SaaS 平台外观,同时暴露出真实的漏洞利用路径。
NexusFlow 在一个连贯的产品叙事中演示了三个核心漏洞类别:
- 通过 URL 获取工具实现的 SSRF
- 通过数据导入实现的 XML XXE
- 通过头像解析实现的 SVG XXE
## 为什么会有这个项目
大多数存在漏洞的应用程序让人感觉很假。而 NexusFlow 则刻意避免了这一点。
它呈现了一个令人信服的工作区 UI、熟悉的业务工作流以及在真实产品中看似正常的功能。这让安全课程更具说服力:危险行为通常隐藏在“有用”的功能之中。
公共主页刻意模仿现代可观测性供应商网站,使得在进行演示时感觉非常真实,然后再转向 `/dashboard` 处的易受攻击的内部工具。
主页的主视觉区现在包含了动画模拟的 KPI 计数器,以使产品表面在进行操作演示时具有实时感。
## 产品截图

在此处查看完整图库:
- [docs/screenshots.md](docs/screenshots.md)
## 漏洞一览
| 区域 | 路由 | 演示内容 |
| --- | --- | --- |
| URL 获取器 | /tools/fetch | 具有未过滤协议的 SSRF |
| XML 导入 | /tools/import | 启用了外部实体解析的 XML XXE |
| 个人头像 | /profile | 通过服务器端 XML 解析和提取文本反射实现的 SVG XXE |
| 原始获取 API | /api/v1/fetch | 通过后端代理渲染的远程 HTML |
| 资源代理 | /api/v1/fetch/resource | 渲染预览使用的子资源直通 |
| 活动动态 | /api/v1/activity | 用于演示场景叙述的实时时间线事件 |
| 场景运行器 | /api/v1/scenario/run | API 驱动的引导式攻击序列 |
## 架构
- 单一 Flask 应用:[app.py](app.py)
- 引导式场景配置入口点:[config.py](config.py)
- 专注的配置模块:[config_sections](config_sections)
- Jinja 模板:[templates](templates)
- 无需数据库
- 无需真实身份验证
- 专为本地实验室和受控演示环境构建
## 快速入门
### 1. 一键安装(推荐)
```
make install
```
`make install` 的作用:
- 检测 macOS 与 Linux
- 在 Linux 上,检测发行版系列:
- 类 Ubuntu/Debian 通过 `apt`
- 类 RHEL 通过 `dnf`/`yum`
- 在 Linux 上:安装所需的工具(Python、pip、venv 支持、make、zip、curl、Caddy)
- 在 macOS 上:**不会**自动安装 Homebrew 包;它仅验证工具并在缺少命令时发出警告
- 在 `venv` 中创建 virtualenv
- 从 `requirements-dev.txt` 安装所有 Python 依赖项
### 2. 运行应用
```
make run
```
默认运行时环境:
- Host: 0.0.0.0
- Port: 3000
- IMDS 模拟: 127.0.0.1:1338
`make run` 同时启动 Flask 和 IMDSv1 模拟服务器。按一次 `Ctrl+C` 可干净地停止这两个进程。
您可以覆盖变量:
```
make run PORT=3000 FLASK_DEBUG=1 IMDS_PORT=1338
```
### 3. 在浏览器中打开
- 落地页:
- 仪表板:
## 构建与生产
### 构建可部署的 zip 包
```
make build
```
创建:
- `dist/` 中的带时间戳存档
- `dist/nexusflow-latest.zip` 便捷副本
- 存档内容仅从跟踪的文件生成(确定性发布打包)
### 构建发布包 + 校验和
```
make package-release
```
创建/更新:
- `dist/nexusflow-latest.zip`
- `dist/nexusflow-latest.zip.sha256`
### 检查环境就绪情况
```
make doctor
```
对所需命令、virtualenv 状态、Caddy 配置存在情况、端口就绪情况以及 `nexusflow.io` 的 DNS 可见性运行快速诊断。
### 启动生产级本地堆栈 (Flask + Caddy)
```
make production
```
此操作将:
- 在后台启动 Flask(绑定到 `127.0.0.1`,仅供反向代理访问)
- 在 `127.0.0.1:1338` 上启动本地 IMDSv1 模拟器
- 使用 `deploy/caddy/Caddyfile` 启动 Caddy
- 将 Flask 日志写入 `.run/flask.log`
- 打印端口 `443`、`3000` 和 `1338` 的监听器快照
默认情况下,脚本管理的 Caddy 状态持久化在 `.run` 下,以便本地 CA 在重启后保持稳定:
- Caddy 数据目录:`.run/caddy-data`
- Caddy 本地 CA:`.run/caddy-data/caddy/pki/authorities/local/root.crt`
如有需要,覆盖 IMDS 模拟器端口:
```
make production IMDS_PORT=1338
```
覆盖 Caddy 状态位置(如需要):
```
CADDY_DATA_DIR=/var/lib/caddy CADDY_CONFIG_HOME=/etc/caddy make production
```
停止所有内容:
```
make production-stop
```
## 手动设置(备用方案)
### 创建虚拟环境并安装依赖
```
python3 -m venv venv
source venv/bin/activate
pip install -r requirements-dev.txt
```
### 运行应用
```
python3 app.py
```
默认运行时环境:
- Host: 0.0.0.0
- Port: 3000
您可以使用环境变量进行覆盖:
```
export PORT=3000
export FLASK_DEBUG=1
python3 app.py
```
### 在浏览器中打开
- 落地页:
- 仪表板:
## 本地 HTTPS + 自定义域名 (nexusflow.io)
如果您使用 Pi-hole 和本地 DNS,请将 nexusflow.io 映射到您的实验室主机/容器,并在 Flask 前运行反向代理。
此存储库使用单一的 Caddy 配置源:
- [deploy/caddy/Caddyfile](deploy/caddy/Caddyfile)
典型流程:
1. 在 Pi-hole 中将 nexusflow.io 指向您的主机/容器 IP。
2. 在 127.0.0.1:3000 上运行 Flask。
3. 在 :443 上运行 Caddy,并设置反向代理到 127.0.0.1:3000。
4. 如果使用内部 TLS,请信任本地 CA。
详细分步指南:
- 本地 CA 分发和信任:[docs/local-ca-distribution-and-trust.md](docs/local-ca-distribution-and-trust.md)
- 使用 Pi-hole 和 hosts 文件覆盖进行域名映射:[docs/domain-mapping-for-demos.md](docs/domain-mapping-for-demos.md)
快速入门(演示操作员):
1. 在 Pi-hole 中为 `nexusflow.io` 和 `www.nexusflow.io` 配置 DNS 映射。
2. 如果 Pi-hole 不可用,请在演示客户端上添加 hosts 文件覆盖。
3. 使用 `make production` 启动堆栈。
4. 从服务器下载本地 CA 并在客户端计算机上信任它。
5. 打开 `https://nexusflow.io` 以验证受信任的 HTTPS。
## 演示演练
### 自定义演示 Payload
引导式场景 payload 和默认值组织在 [config_sections](config_sections) 下的专注模块中,其中 [config.py](config.py) 作为兼容性入口点保留。
最有用的调整项:
- `SCENARIO_DEFAULT_TARGET`
- `SCENARIO_DEFAULT_CHAIN`
- `SCENARIO_CHAIN_PRESETS`
- `SCENARIO_ANIMATION_OPTIONS`
- `SCENARIO_DEMO_VIEW_OPTIONS`
- `SCENARIO_STAGE_PAYLOAD_PRESETS`
- `SCENARIO_STAGE_DEFAULT_PAYLOAD_KEYS`
- `XML_XXE_SCENARIO_PAYLOAD`
- `SVG_XXE_SCENARIO_PAYLOAD`
- `COMMAND_SHOWCASE_OUTPUT_TEMPLATE`
- `FETCHER_PRESET_TARGETS`
- `FETCHER_DEMO_PAYLOADS`
- `XXE_IMPORT_DEMO_PAYLOADS`
- `SVG_PROFILE_DEMO_PAYLOAD`
- `BRANDING_CONFIG`
- `THEME_CONFIG`
- `PRESENTER_PERSONA`
- `LANDING_COPY_CONFIG`
其他有用的演示控件:
- `ACTIVITY_LOG_MAX_ENTRIES` 用于更长/更短的时间线历史记录
- `FETCH_TIMEOUT_SECONDS` 和 `FETCH_USER_AGENT` 用于特定环境的获取行为
- `SCENARIO_PREVIEW_CHAR_LIMIT` 用于更短或更丰富的场景步骤预览
更新这些值并重新运行应用;无需修改路由代码。
### SSRF
打开:
/tools/fetch?load=file:///etc/passwd
然后尝试内部目标:
-
-
-
本地 IMDS 端点是一个用于培训演示的安全模拟器,不会返回真实的云凭证。
### XML XXE
使用类似于以下的 payload 导入 /tools/import:
```
]>
&xxe;
```
### SVG XXE
上传至 /profile:
```
]>
```
## 测试
本项目包含完整的 pytest 测试套件,涵盖路由、解析器、活动动态、获取代理行为和场景执行。
### 安装测试依赖
```
source venv/bin/activate
pip install -r requirements-dev.txt
```
### 运行测试
```
pytest -q
```
### 运行严格覆盖率关卡
```
make coverage
```
这将对主要 Python 模块强制执行 100% 的语句/分支覆盖率。
主要测试文件:
- [tests/test_app.py](tests/test_app.py)
## 仓库结构图
- 核心应用:[app.py](app.py)
- 基础布局:[templates/base.html](templates/base.html)
- 仪表板:[templates/dashboard.html](templates/dashboard.html)
- URL 获取器:[templates/fetch.html](templates/fetch.html)
- XML 导入:[templates/xml_import.html](templates/xml_import.html)
- 个人资料/SVG 上传:[templates/profile.html](templates/profile.html)
- 公共落地页:[templates/landing.html](templates/landing.html)
## 重要警告
NexusFlow 在设计上故意存在不安全性。
请勿将此项目部署到公共或生产环境。
仅在隔离的实验室、演示网络、CTF 练习或受控教育环境中使用。
## 使用说明
请根据您的组织或培训环境要求进行使用。
如果您在内部进行分发,请醒目地包含上述警告。
标签:API安全, CISA项目, Flask, JSON输出, OPA, Python, SaaS平台模拟, SSRF, SVG XXE, Web安全, XML外部实体注入, XXE, 基础设施监控, 安全教育, 安全演示, 无后门, 服务器端请求伪造, 模拟攻击, 漏洞修复, 漏洞演练平台, 网络安全培训, 蓝队分析, 调试辅助, 逆向工具, 靶场