Johnlloyd17/CybersecurityThreatIntelligence

GitHub: Johnlloyd17/CybersecurityThreatIntelligence

一个基于 PHP + MySQL + Python 的自托管网络威胁情报(CTI)平台,配备 Web 仪表盘和自研扫描引擎,用于集中管理和执行多源 OSINT 扫描与结果分析。

Stars: 0 | Forks: 0

# CTI 平台 Copilot 指南 ## 预览 ![CTI 平台登录页面](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/e3368b76e4225844.png) ## 公共仓库规则 - 绝不提交真实的 API 密钥、密码、token、cookie、会话 ID、数据库转储、下载的报告、浏览器配置文件或私密扫描结果。 - 在文档和测试中使用脱敏示例,例如 `YOUR_API_KEY`、`example.com`、`8.8.8.8` 和 `test@example.com`。 - 除非明确作为本地示例,否则不要将特定机器的绝对路径添加到公共文档中。优先使用从仓库根目录开始的相对路径。 - 不要提交生成的缓存文件,例如 `__pycache__/`、`.pyc`、运行时 SQLite 数据库、临时 payload 或导出下载文件。 ## 项目概述 CTI 平台是一个基于 PHP + MySQL 的 Cyber Threat Intelligence (网络威胁情报) 仪表盘,配备第一方 Python 扫描引擎。 主要应用领域: - `index.php`:公共着陆页和登录表单。 - `dashboard.php`:已认证的仪表盘。 - `newscan.php`:扫描创建 UI 和模块选择。 - `query.php`:扫描列表、批量操作、导出和扫描管理。 - `scaninfo.php`:扫描详情、结果、日志、图表和设置快照。 - `settings.php`:API 密钥和模块配置 UI。 - `php/`:后端 API、持久化、扫描路由和安全辅助工具。 - `assets/`:前端 JavaScript、CSS、图标和 UI 资源。 - `python/cti_service/`:第一方 Python 引擎的 HTTP 服务。 - `python/cti_engine/`:事件驱动型 CTI 引擎、模块、事件和测试。 - `python/spiderfoot_bridge/`:当 CTI 路由到 SpiderFoot 时使用的桥接器。 - `spiderfoot-master/`:Vendored(内嵌的)SpiderFoot 参考/运行时代码。 - `scripts/`:用于测试、服务启动和桥接运行的本地辅助脚本。 - `test/python/`:CTI 引擎和模块的 Python 单元测试。 ## 本地开发快速入门 典型的本地技术栈: - XAMPP Apache + MySQL,用于 PHP 页面和数据库。 - Python 3.12+,用于 CTI Python 服务和单元测试。 - 浏览器访问 `http://localhost:8080/CybersecurityThreatIntelligence/` 或开发者配置的本地 Apache 端口。 从仓库根目录启动 CTI Python 服务: ``` powershell -NoProfile -ExecutionPolicy Bypass -File ".\scripts\run_cti_python_service.ps1" ``` 等效的直接 Python 命令: ``` python -m python.cti_service ``` 预期的服务启动输出: ``` {"service":"cti-python-engine","host":"127.0.0.1","port":8765} ``` 运行 Python 引擎测试: ``` powershell -NoProfile -ExecutionPolicy Bypass -File ".\scripts\run_cti_engine_tests.ps1" ``` 等效的直接测试命令: ``` python -m unittest discover -s test\python -v ``` ## 数据库导入与导出指南 项目数据库 SQL 文件存储在: ``` db_sql/ ``` 当前的本地数据库导出: ``` db_sql/cti_platform.sql ``` 对于 XAMPP: 1. 从 XAMPP 控制面板启动 Apache 和 MySQL。 2. 通过 `http://localhost/phpmyadmin` 打开 phpMyAdmin。 3. 如果尚未存在名为 `cti_platform` 的数据库,则创建它。 4. 选择 `cti_platform` 数据库。 5. 打开“导入”选项卡。 6. 选择 `db_sql/cti_platform.sql`。 7. 点击“导入”并等待 phpMyAdmin 完成。 对于 WAMP: 1. 启动所有 WAMP 服务。 2. 通过 WAMP 托盘菜单或 `http://localhost/phpmyadmin` 打开 phpMyAdmin。 3. 创建或选择 `cti_platform` 数据库。 4. 打开“导入”选项卡。 5. 选择 `db_sql/cti_platform.sql`。 6. 点击“导入”并等待 phpMyAdmin 完成。 要导出全新的本地数据库备份: 1. 打开 phpMyAdmin。 2. 选择 `cti_platform` 数据库。 3. 打开“导出”选项卡。 4. 选择 SQL 格式。 5. 将文件导出为 `cti_platform.sql`。 6. 将更新后的 SQL 文件放入 `db_sql/`。 在提交导出的 SQL 文件之前,请仔细审查并移除私有 API 密钥、真实用户账户、会话数据、扫描目标、下载报告以及任何其他敏感的本地数据。 ## 身份验证流程 本地登录页面: ``` http://localhost:8080/CybersecurityThreatIntelligence/index.php ``` 本地 SQL 种子数据中可能存在演示凭据,但公共文档和示例绝不能包含生产凭据。 登录流程: 1. `index.php` 渲染登录表单。 2. `assets/js/landing.js` 处理着陆页登录提交。 3. `assets/js/auth.js` 从 `php/api/auth.php?action=csrf` 请求 CSRF token。 4. 浏览器将 JSON 数据 POST 到 `php/api/auth.php?action=login`。 5. `php/api/auth.php` 验证 CSRF、对失败尝试进行速率限制、加载用户、验证密码哈希、重新生成会话 ID,并将已认证的用户存储在 `$_SESSION` 中。 6. 经过身份验证的页面调用 `Auth.requireAuth()`,并将未认证的用户重定向回 `index.php#hero-login-panel`。 7. 注销时调用 `php/api/auth.php?action=logout` 并销毁会话。 重要的身份验证/安全文件: - `php/config.php`:应用配置、会话生命周期、CSRF 设置、bcrypt 成本和数据库默认值。 - `php/security-headers.php`:安全的会话启动、安全标头、CSRF 辅助工具和请求保护。 - `php/RateLimiter.php`:登录失败锁定行为。 - `php/db.php`:PDO 连接和密码辅助工具。 ## 扫描后端选择 `php/ScanExecutor.php` 决定由哪个后端运行扫描。 优先顺序: 1. 通过 `php/CtiPythonServiceRunner.php` 的第一方 CTI Python 引擎。 2. 当 CTI Python 不支持选定的模块/目标组合时,通过 `php/SpiderFootBridgeRunner.php` 的 SpiderFoot 桥接。 3. 作为最终后备的本机 PHP CTI 后端。 只有在满足以下条件时,扫描才能使用 CTI Python 引擎: - 每个选定的模块都在 `CTI_TO_SERVICE` 中进行了映射, - 每个选定的模块都支持 `MODULE_QUERY_SUPPORT` 中的扫描目标类型, - 每个选定的模块都已获得该目标类型的 `PARITY_VERIFIED_SUPPORT` 对等验证批准,并且 - Python 服务可访问。 仅应通过 CTI Python 引擎测试已在 CTI 平台中被列为已实现/已迁移的模块。尚未实现的模块不应预期在 CTI Python 中运行;它们必须使用可用的后备后端或等待迁移完成。 后端选择存储在扫描的 `config_snapshot` 中,使用诸如 `engine_backend` 和 `engine_backend_label` 等字段。 ## CTI Python 服务 服务层位于 `python/cti_service/`。 默认本地服务设置: ``` CTI_ENGINE_HOST=127.0.0.1 CTI_ENGINE_PORT=8765 CTI_ENGINE_MAX_WORKERS=4 ``` PHP 连接到 `CTI_PYTHON_ENGINE_URL`,或默认为: ``` http://127.0.0.1:8765 ``` 主要服务路由: - `GET /`:简单的服务索引和路由列表。 - `GET /health`:健康检查。 - `POST /api/v1/scans`:创建异步扫描作业。 - `GET /api/v1/scans/{scan_id}`:作业状态。 - `GET /api/v1/scans/{scan_id}/logs`:扫描日志。 - `GET /api/v1/scans/{scan_id}/results`:扫描结果投影。 - `POST /api/v1/scans/{scan_id}/terminate`:请求取消。 Python 服务返回投影后的 JSON。它不直接写入 MySQL。 PHP 将投影导入 CTI 表中。 ## CTI Python 引擎 引擎层位于 `python/cti_engine/`。 重要文件: - `targets.py`:将原始目标规范化为 CTI 目标类型。 - `settings.py`:包含冻结的全局/模块设置和 API 配置快照。 - `context.py`:定义 `ScanRequest` 和 `ScanContext`。 - `events.py`:定义规范化的 `ScanEvent` 和 `ScanLogEntry`。 - `module_base.py`:Python 模块的基类约定。 - `registry.py`:模块注册和 watcher 查找。 - `queue.py`:事件队列引擎。 - `projector.py`:将引擎输出转换为与 CTI 兼容的结果行。 - `modules/__init__.py`:注册内置 Python 模块。 - `storage/models.py`:共享的投影/存储数据结构。 引擎流程: 1. PHP 在 `CtiPythonServiceRunner.php` 中构建扫描 payload。 2. `python/cti_service/schemas.py` 验证并规范化请求。 3. `python/cti_service/worker.py` 注册模块并启动队列引擎。 4. 队列为目标创建一个根事件。 5. 注册的模块通过 `watched_types` 接收匹配的事件类型。 6. 模块生成子 `ScanEvent` 对象。 7. 引擎对事件进行去重,计算简单的严重性,并继续构建事件图。 8. 投影器将事件/日志/关联转换为 CTI 结果 JSON。 9. PHP 将投影行导入 MySQL。 ## SpiderFoot 关系 SpiderFoot 并非第一方 CTI 引擎的长期应用运行时。它主要用于以下两方面: - 作为尚未在 CTI Python 中迁移或验证的模块的桥接后端。 - 作为在加强 CTI Python 模块对等性时的行为参考。 官方 SpiderFoot 仓库: ``` https://github.com/smicallef/spiderfoot ``` 在研究 SpiderFoot 的 Python 扫描运行器、模块系统、事件路由和模块行为时,请查阅上游仓库。 ## SpiderFoot 版权与归属 不要将此 CTI 项目描述为“由 SpiderFoot 版权所有”。正确的关系是: - CTI 平台是一个独立的项目。 - SpiderFoot 是一个由其作者创建的独立的上游项目。 - SpiderFoot 在上游仓库中采用 MIT 许可证。 - 任何 SpiderFoot 源代码、模块文件或实质上复制的部分均保留其原始的 SpiderFoot 版权和 MIT 许可证声明。 - 专门为本项目编写的 CTI 源代码归 CTI 项目作者所有,除非文件中另有说明。 推荐的公共措辞: ``` This project includes first-party CTI platform code and may reference or bundle SpiderFoot components for compatibility and parity testing. SpiderFoot is a separate MIT-licensed project. See https://github.com/smicallef/spiderfoot. ``` 如果 `spiderfoot-master/` 目录包含在公共发布中,请保留其中的 SpiderFoot `LICENSE` 文件。如果 CTI 代码仅受到 SpiderFoot 行为的启发,而没有复制 SpiderFoot 的源代码,请将 SpiderFoot 提及为参考项目,而不是 CTI 的版权所有者。 在处理 SpiderFoot 对等性时: - 与对应的 `spiderfoot-master/modules/sfp_*.py` 文件进行比较。 - 在可行的情况下,匹配支持的目标类型、监控事件、生成事件、设置、解析行为和错误行为。 - 保持 CTI 模块代码的第一方身份和可维护性。 - 保留归属,不要移除 SpiderFoot 许可证声明。 - 在测试和手动比较完成之前,不要标记对等支持。 ## 添加或更新 CTI Python 模块 在添加或编辑 Python 模块时: 1. 从 `python/cti_engine/module_base.py` 继承 `BaseModule` 子类。 2. 设置 `slug`、`name`、`watched_types`、`produced_types` 和 `requires_key`。 3. 通过 `ctx.module_settings_for(slug)` 读取模块设置。 4. 通过 `ctx.api_config_for(slug)` 读取 API 凭据。 5. 实现 `async def handle(self, event, ctx)` 并生成 (`yield`) `ScanEvent` 值。 6. 在 `python/cti_engine/modules/__init__.py` 中注册该类。 7. 在 `test/python/` 中添加或更新单元测试。 8. 将 CTI UI slug 和服务 slug 添加到 `CTI_TO_SERVICE`。 9. 将目标支持添加到 `MODULE_QUERY_SUPPORT`。 10. 将 API 密钥状态添加到 `MODULE_REQUIRES_KEY`。 11. 在需要时将反向映射添加到 `SERVICE_TO_CTI`。 12. 仅在对等性审查完成后才更新 `PARITY_VERIFIED_SUPPORT`。 模块实现规则: - 保持网络超时有界。 - 清楚地记录提供商节流、无效密钥和空结果日志。 - 除非故障确实是不可恢复的,否则避免因一个提供商的故障而导致整个扫描崩溃。 - 尽可能对发出的事件进行去重。 - 使用稳定的事件类型和值,以便 CTI 结果保持可预测性。 - 不要向测试中添加真实的 API 响应或私密扫描数据。 ## PHP 持久化规则 Python 引擎返回 JSON。`php/CtiPythonServiceRunner.php` 在事务中将该投影导入 MySQL。 投影导入职责: - 结果成为 `query_history` 行。 - 引擎事件成为 `scan_events` 行。 - 日志成为 `scan_logs` 行。 - 关联成为 `scan_correlations` 行。 - 扫描状态、计数和时间戳在 `scans` 上更新。 在编辑 PHP API 时- 保持响应是 JSON 安全的。 - 不要从 API 端点输出调试文本。 - 使用 `DB::query`、`DB::queryOne`、`DB::execute` 和 `DB::insert` 处理 SQL。 - 使用预处理语句和参数绑定。 - 对变更请求保留 CSRF 检查。 - 将扫描快照保留为扫描期间的冻结配置。 ## 前端规则 - 除非任务明确要求重新设计,否则保留现有的 CTI 视觉语言。 - 避免在 DOM 文本、日志、URL、屏幕截图或导出中暴露 API 密钥。 - 保持扫描操作清晰:刷新、终止、删除、导出、克隆和设置应在视觉上有所区分。 - 如果添加模块 UI 过滤器,请尽可能使用来自 PHP 的规范模块元数据,而不是第二个硬编码列表。 - 优先为纯图标控件提供无障碍标签/工具提示。 ## 公共文档规则 在为 GitHub 更新 Markdown 时: - 使用相对路径,而非私有本地机器路径。 - 展示从仓库根目录运行的命令。 - 脱敏处理凭据和敏感的扫描输出。 - 说明某项功能何时需要 Python 服务。 - 说明某个模块何时需要第三方 API 凭据。 - 说明某个模块何时依赖于本地工具,例如 `nmap`、`nuclei`、`wafw00f`、`whatweb` 或类似的可执行文件。 - 除非模块已经过对等性测试,否则不要承诺与 SpiderFoot 的结果完全一致。 ## 常用命令 启动 CTI Python 服务: ``` powershell -NoProfile -ExecutionPolicy Bypass -File ".\scripts\run_cti_python_service.ps1" ``` 运行 Python 测试: ``` powershell -NoProfile -ExecutionPolicy Bypass -File ".\scripts\run_cti_engine_tests.ps1" ``` 运行直接的 unittest 发现: ``` python -m unittest discover -s test\python -v ``` 检查单个文件的 PHP 语法: ``` php -l php\CtiPythonServiceRunner.php ``` 在浏览器中对 Python 服务进行健康检查: ``` http://127.0.0.1:8765/health ``` ## 故障排除说明 如果浏览器在 `http://127.0.0.1:8765` 显示 `{"error":"Not found"}`,请改用 `/health` 或 `/`。根据当前的服务实现,根路由可能只显示服务元数据。 如果 CTI 回退到 SpiderFoot 或 PHP 而不是 CTI Python,请检查: - Python 服务正在运行, - `CTI_PYTHON_ENGINE_URL` 配置正确, - 选定的模块已在 `CTI_TO_SERVICE` 中列出, - 目标类型已在 `MODULE_QUERY_SUPPORT` 中列出, - 目标类型已在 `PARITY_VERIFIED_SUPPORT` 中获得对等验证批准,并且 - 所需的 API 密钥已在 CTI 设置中配置。 如果基于工具的模块未返回结果,请检查本地可执行文件是否已安装并在 `PATH` 中可用,或者是否在该模块的设置中进行了配置。
标签:API管理, CTI平台, GitHub, OpenVAS, PHP, Python, SpiderFoot, XAMPP, 事件驱动架构, 反取证, 威胁情报分析, 安全专业人士, 安全评估, 实时处理, 密码管理, 情报收集, 情报看板, 情报聚合, 扫描引擎, 数据可视化, 无后门, 漏洞研究, 网络信息收集, 网络威胁情报, 网络安全, 网络安全仪表盘, 资产测绘, 逆向工具, 隐私保护