secjey/static-firmware-analysis

GitHub: secjey/static-firmware-analysis

基于JSON自定义规则的固件静态分析工具,用于在已解包的文件系统中自动发现敏感信息、配置文件和潜在安全问题。

Stars: 14 | Forks: 0

# 静态固件分析 [![欢迎贡献](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/secjey/static-firmware-analysis/issues) ## 描述 本项目的灵感来源于 “firmwalker”,这是一个由 [Smith](https://github.com/craigz28/firmwalker) 开发的工具,它使用户能够在提取的固件文件系统中搜索感兴趣的文件。遗憾的是,该工具中用于检测文件的规则过于严格,因为它们不支持通配符,这意味着很可能会遗漏重要的文件。此外,有些规则是在脚本中硬编码的,这使得用其他规则扩展它并获得一个灵活的解决方案变得困难。 为了解决这后一个问题,并拥有一个旨在易于通过新规则扩展的健壮工具,我们从头开始实现了一个 Python 工具。由于所有规则都定义在一个 JSON 文件中,用户可以根据自己的需要定制搜索。可以搜索哈希、URL、电子邮件、文件和二进制文件的正则表达式。此外,还预定义了各种参数,例如让用户将项目分组到类别中或在搜索中排除特定文件。在执行文件系统的静态分析时,该工具代表了一个很好的起点。Python 工具将自动查找以下内容: * 与潜在敏感信息相关的关键词,如 root、password、backdoor、shell、WEP。 * IP 地址、电子邮件地址、URL。 * 感兴趣的文件,如 /etc/passwd、/etc/shadow、SSL 和 SSH 密钥、配置文件、脚本、源代码。 * 嵌入式系统和 IoT 设备中感兴趣的二进制文件,如 Web 服务器二进制文件、busybox、FTP 和 SSH 服务器二进制文件。 * 任何类型文件中潜在的 MD5/SHA1 哈希。 ## 安装 ``` $ git clone https://github.com/secjey/static-firmware-analysis $ cd static-firmware-analysis $ pip install -r requirements.txt $ chmod +x static_analysis.py ``` ## 用法 ``` $ python static_analysis.py --help usage: static_analysis.py [-h] [-o OUTPUT_FILE] [--rules JSON_FILE] filesystem DESCRIPTION positional arguments: filesystem Path to the extracted filesystem directory optional arguments: -h, --help show this help message and exit -o OUTPUT_FILE, --output OUTPUT_FILE Path to the output file which contains all information --rules JSON_FILE Path to the file containing the rules in JSON format ``` 使用该工具非常简单:只需提供提取的文件系统根目录的路径,如下所示: ``` ./static_analysis.py /path/to/rootfs ``` 得益于 `rules.json` 中预定义的基本规则,该工具可以直接使用。但是,如果您想定制规则以便在根文件系统中识别更多信息,请查看 [JSON 结构](#id-json-structure)。 默认情况下,输出将显示在控制台中,但对于每个对象它只包含 X 个匹配项(缩短版)。如果有更多结果,将添加一个 `...`。这对于快速概览很有用。如果您想查看所有信息(完整版),则需要按如下方式提供输出文件的路径: ``` ./static_analysis.py /path/to/rootfs -o output.txt ``` ### 输出 输出信息将以表格形式显示如下: | 类别 | 数据类型 | 名称 | 输出 | :---: | --- | --- | --- | | [`category`](#id-category) | "patterns" \| "binaries" \| "files" | [`name`](#id-name) (如果已定义) 和 [`value`](#id-value) | 与 [`value`](#id-value) 定义的规则匹配的文件或数据 | * | ... | ... | 第 1 个匹配项
第 2 个匹配项
第 3 个匹配项 | 其他 [`category`](#id-category) | ... | ... | ... | * | ... | ... | ... ## 演示 [![asciicast](https://asciinema.org/a/131575.png)](https://asciinema.org/a/131575) ## 规则 得益于以 JSON 格式定义的规则,用户可以根据自己的需要定制搜索。您可以使用 [JSON 编辑器](http://www.jsoneditoronline.org) 轻松编辑 `rules.json` 文件。 ### JSON 结构 当前用于描述用户定义规则的 JSON 结构如下: ![JSON 结构](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/365443abcb124112.png) 在每个类别(即 `patterns`、`binaries` 和 `files`)中,都有一个对象列表,这些对象可以包含多个 [键](#id-keys),例如 `category` 和 `value`: ![JSON 对象](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/67936cd888124113.png) ### * 对于 `patterns`、`binaries` 和 `files` 对象: * `category` (**必填**):其值描述对象所属的类别(例如 script、sensitive info、webserver 等)。 * `value` (**必填**):这是您要查找的字符串、正则表达式或文件。 * `name` (可选):这是为您的正则表达式添加有意义名称的键。如果定义了此键,它将连同 `value` 一起显示在输出中。 * 本地定义的 `exclude` (可选):其值将在搜索中仅针对特定对象被排除。例如,在一个对象中定义 `"exclude": "html,js"` 和 `"value": "admin"` 将排除所有可能包含值 “admin” 的 html *和* js 文件。 * 全局定义的 `exclude` (可选):其值将在搜索中针对对象列表中的每个对象被排除。 * 本地定义的 `include` (可选):其值将被包含在搜索中。如果您想全局排除某种文件类型,但仍为特定对象包含它,这很有用。如果一个值同时被本地排除和本地包含,该值将被 *包含*。 * 仅对于 `patterns` 对象: * `print_match` (可选):默认情况下,输出将只显示包含数据的文件。您可以通过添加键 `"print_match": true` 来更改此行为,以显示精确的匹配项。这对于您想要提取 URL、电子邮件等信息的正则表达式特别有用。 ### 值 在 `patterns` 中为键 `exclude` 或 `include` 使用值 “binary” 将在搜索中排除/包含二进制文件。 ## 贡献 非常感谢您的所有错误报告和功能想法,提前致谢!如果您喜欢这个仓库的内容,请添加一颗 star!对这个内容感兴趣的人越多,不久的将来就会添加越多的功能。 如果您想做出贡献但不知道实现什么,这里是任务列表: ### 任务 - [ ] 添加对键 `exclude-dir` 和 `include-dir` 的支持以排除/包含目录 - [ ] 使用 pytest 编写单元测试 - [ ] 添加其他 `rules.json` 模板以满足特定要求(例如特定供应商) - [ ] 如果发现证书或 ssh 配置文件等文件,则执行进一步分析 - [x] 更新 README ## 许可证 本项目根据 **GPLv3** 许可证的条款授权。
标签:CyberSec, DevSecOps, Homebrew安装, IOT, PE 加载器, Python, 上游代理, 二进制分析, 云安全监控, 云安全运维, 云计算, 云资产清单, 固件分析, 固件解包, 域名收集, 多包管理, 密码提取, 对抗攻击, 嵌入式系统, 敏感信息检测, 文件系统, 无后门, 物联网安全, 规则引擎, 逆向工具, 逆向工程, 配置审计, 静态分析