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 计数器,以使产品表面在进行操作演示时具有实时感。 ## 产品截图 ![NexusFlow 主页](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/c8de0480ad053950.png) 在此处查看完整图库: - [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: ``` ]> &xxe; ``` ## 测试 本项目包含完整的 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, 基础设施监控, 安全教育, 安全演示, 无后门, 服务器端请求伪造, 模拟攻击, 漏洞修复, 漏洞演练平台, 网络安全培训, 蓝队分析, 调试辅助, 逆向工具, 靶场