StasonJatham/fritzbox-forensic-analyzer

GitHub: StasonJatham/fritzbox-forensic-analyzer

一个本地优先的FRITZ!Box取证SIEM工具,用于路由器证据收集、解析和分析以支持安全事件响应。

Stars: 0 | Forks: 0

# FRITZ!Box Forensik SIEM

FRITZ!Box Forensik SIEM logo

本地优先的FRITZ!Box Forensik SIEM,用于AVM路由器取证、保留的FRITZ!OS日志、WiFi取证、TR-064/Web界面工件、主机历史记录和事件响应分诊。该工具收集FRITZ!Box仍暴露的证据,保留原始工件,将解析器输出规范化为SQLite,使用全文搜索为所有内容建立索引,并通过清晰的SOC分析师仪表板呈现,以便进行时间线审查、实体透视、关联和证据验证。 该项目专为本地事件响应、家庭网络取证和小规模SOC式路由器调查而构建。它不是云SIEM,也不需要tcpdump进行历史分析。 该项目针对的搜索词:FRITZ!Box SIEM、FritzBox forensics、FRITZ!Box Forensik、FRITZ!OS incident response、AVM router logs、WiFi forensics、TR-064 evidence、local SIEM、router forensic analyzer、home network security investigation。 ## 文档 [文档](docs/README.md)目录包含详细的FRITZ!Box取证参考: - [数据源](docs/data-sources.md):从FRITZ!Box接口到原始工件、解析表、取证价值和注意事项的端点级映射。 - [架构与流程图](docs/architecture.md):可视化证据管道、存储模块图、SIEM规范化流程、分析师工作流和来源信任模型。 - [证据模型](docs/evidence-model.md):原始工件如何成为SQLite行、FTS记录、调查结果和置信度标签。 - [Python示例](docs/python-examples.md):用于TR-064、AVM导出路径、`query.lua`、`data.lua`、支持数据和SQLite FTS的小脚本。 - [局限性](docs/limitations.md):从保留的FRITZ!Box数据中可以证明什么和不能证明什么。 示例脚本: ``` python docs/examples/tr064_device_log.py python docs/examples/avm_export_paths.py python docs/examples/webui_lua_sources.py python docs/examples/support_data_download.py python docs/examples/sqlite_full_text_search.py "failed login" ``` ## 重要限制 FRITZ!Box并非总为每个客户端保留精确的WiFi关联和断开关联行。如果保留的原始日志不包含精确的连接行,此工具无法证明精确的WiFi加入或断开时间。 低置信度行(如`mesh_last_observed`)是上下文观察结果,而非精确连接时间戳的证明。保留日志中缺少某项事件并不能证明该事件未发生。数据包级广播流量归属超出了FRITZ!Box API导出数据的范围。 FRITZ!Box Web界面设备状态值(如`firstused`和`lastused`)可提供有价值的“首次出现”和“最后连接/使用”时间戳。这些值是保留的路由器状态,而非完整的每会话连接日志。仪表板会显示来源覆盖范围,以便分析师查看运行期间是否收集了该内部LAN设备工件。 收集器还会尝试选定的非官方FRITZ!Box Lua端点,例如`query.lua`、`data.lua`以及`support.lua`背后的隐藏支持数据工作流。这些很有价值,因为它们反映了路由器界面和诊断包的部分内容,但它们并非稳定的公共API。原始响应被保留,并与官方TR-064证据分开标记。 最大采集模式还会尝试依赖固件的电话、AHA/智能家居、配置备份以及动态发现的只读TR-064操作。这些工件可能很敏感,并且可能包含通话元数据、电话簿条目、智能家居设备标识符、路由器设置、内部服务状态、公共IP信息和拓扑标识符。分析器首先将它们作为原始证据保留,然后仅解析可标记来源和置信度的字段。 ## 快速开始 将项目移至`/Users/karl/Code/fritzforensic`后,有关最小本地运行手册,请参阅[LOCAL_START.md](LOCAL_START.md)。 ``` git clone https://github.com/StasonJatham/fritzbox-forensic-analyzer.git cd fritzbox-forensic-analyzer python3 -m venv .venv . .venv/bin/activate pip install -e ".[dev]" cp .env.example .env # 在本地编辑 .env 文件。切勿提交真实凭证。 fritzbox-forensics-dashboard --host 127.0.0.1 --port 8765 ``` 打开 `http://127.0.0.1:8765`。 界面仅需要FRITZ!Box的IP地址和管理员密码。在可能的情况下,它会自动检测其余连接设置。 使用**取证包**导出完整的分析包。使用**导入包**加载该ZIP文件或CLI JSON数据集,稍后作为单独的配置文件加载,然后从头部的路由器/配置文件选择器切换配置文件。 采集是一个后台管道,而非单个阻塞式Web请求。仪表板一次将一个采集作业排入队列,报告阶段进度,立即将每个成功的端点响应写入`output/raw-acquisition-*`目录,将失败的端点记录为本地`.error.txt`文件加上清单行,然后解析/导入到SQLite中。糟糕的`data.lua`、`query.lua`、支持数据或TR-064操作应减少来源覆盖范围,而不是导致整个运行失败。 ## CLI导出 ``` fritzbox-wifi-export \ --dataset \ --hours 10000 \ --include-disconnects \ --format json \ --output fritzbox-export.json ``` 凭证可来自CLI标志、环境变量或本地的`.env`/`.fritzbox.env`文件: ``` FRITZBOX_ADDRESS=192.168.178.1 FRITZBOX_USER= FRITZBOX_PASSWORD=change-me FRITZBOX_PORT=49000 FRITZBOX_TLS=0 FRITZBOX_REQUEST_TIMEOUT=20 FRITZBOX_WEBUI_TIMEOUT=12 FRITZBOX_ACQUISITION_DELAY=0.75 FRITZBOX_HARD_TIMEOUT=30 FRITZBOX_SUPPORT_HARD_TIMEOUT=180 FRITZBOX_DYNAMIC_TR064_MAX_ACTIONS=220 FRITZBOX_MAX_HOSTS=512 FRITZBOX_MAX_PORT_MAPPINGS=512 FRITZBOX_MAX_WLAN_ASSOCIATIONS=256 FRITZBOX_LOG_LEVEL=INFO FRITZBOX_LOG_FILE=logs/fritzforensic.log ``` 运行时日志默认写入`logs/fritzforensic.log`并进行轮换。使用`FRITZBOX_LOG_LEVEL=DEBUG`进行端点级采集调试。类似秘密的值(如SID、密码、令牌和密钥)在写入日志文件之前会被隐藏。 ## DynDNS + WireGuard 规划器 该项目包含一个可重复FRITZ!Box远程访问设置规划的干运行辅助工具: ``` fritzbox-vpn-provision --env-example fritzbox-vpn-provision --output vpn-plan.json ``` 该规划器读取当前路由器状态,检查自定义DynDNS和现有WireGuard/VPN条目,然后报告幂等步骤。默认情况下,它**不会**更改路由器设置。`--apply`功能已被有意禁用,直到为特定固件版本的FRITZ!OS映射并测试了Web界面写入工作流。 为何首先干运行:FRITZ!Box通过TR-064和内部Lua页面公开有用的只读状态,但添加WireGuard单设备连接是一个Web界面向导流程,可能需要路由器确认。除非配置了明确的替换标志,否则该辅助工具拒绝替换现有的DynDNS域或匹配的WireGuard客户端名称。 ## Docker ``` cp .env.example .env # 在本地编辑 .env 文件。 docker compose up --build ``` 仪表板默认绑定到 `127.0.0.1:8765`。SQLite数据库存储在Docker卷中。 ## 仪表板安全 除非你处于受信任的网络并了解证据暴露风险,否则请将仪表板绑定到`127.0.0.1`。非本地绑定需要`FRITZBOX_ALLOW_PUBLIC_BIND=1`;当启用公共绑定时,`/api/*` 端点需要通过`X-API-Token`或`Authorization: Bearer`提供`FRITZBOX_API_TOKEN`。 ## 数据模型 本地SQLite数据库存储: - `export_runs`:采集元数据、路由器元数据、时间戳假设和源端点清单。 - `raw_artifacts`:带有SHA-256哈希的原始FRITZ!Box响应。 - `event_log`:解析后的保留路由器事件日志行。 - `siem_events`:从保留日志和类型化证据派生的规范化本地SIEM事件。 - `siem_correlations`:用于突发、会话、暴露和实体汇总的本地关联发现。 - `wifi_connections`:精确或推断的WiFi相关观察,带有置信度标签。 - `hosts`:采集时的主机表上下文。 - `record_observations`:用于跨运行比较的不可变观察快照。 - `records_fts`:用于后端搜索的SQLite FTS5索引。 ## 隐私与证据处理 真实的路由器数据可能暴露个人设备、位置、账户名、公共IP地址、MAC地址和本地网络拓扑。请将这些文件保密: - `.env` - `.fritzbox.env` - `fritzbox-analysis.sqlite3` - 原始工件存档 - 采集包 - `support_data_txt`原始工件 - `call_list_xml`、`phonebooks_xml_json`、`config_export_file`和AHA智能家居原始工件 - 来自真实网络的JSON、CSV或截图导出 本仓库故意不包含真实截图、示例导出或捕获的路由器数据。 ## 开发 ``` python3 -m venv .venv . .venv/bin/activate pip install -e ".[dev]" pytest ``` ## 许可证 MIT
标签:请求拦截, 逆向工具