Icex0/OpenFirebase
GitHub: Icex0/OpenFirebase
一款专注于 Firebase 安全的自动化扫描工具,从 APK 中提取配置并检测 Realtime Database、Firestore、Storage 和 Remote Config 的未授权访问风险。
Stars: 45 | Forks: 2
[](https://github.com/Icex0/OpenFirebase/stargazers)
[](LICENSE)
[](https://www.python.org)
[](https://github.com/Icex0/OpenFirebase/issues)
自动化 Firebase 安全扫描器,从 APK 文件中提取 Firebase 配置,并对常见的 Firebase 服务(Realtime Database、Firestore、Storage、Remote Config)进行未经身份验证和/或经过身份验证的读取和/或写入扫描,支持所有已知的服务 URL 格式。检测意外嵌入的服务账号凭据,这些凭据可绕过安全规则获得管理员级别的访问权限。
支持多种输入方式,包括通过 JADX 反编译提取 APK、快速提取、单个或多个 Project ID。
[>> 更多信息请参阅我的博客:https://ice0.blog/docs/openfirebase <<](https://ice0.blog/docs/openfirebase)
## 环境要求
- Python 3.8+
- Java 11+(JADX 反编译和 apksigner 工具需要)
## 安装说明
### 步骤 1:安装 Java
JADX 反编译(默认模式)和 apksigner 需要 Java。
#### macOS
```
# 使用 Homebrew(推荐)
brew install openjdk
echo 'export PATH="/opt/homebrew/opt/openjdk/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
```
#### Linux (Ubuntu/Debian)
```
# 使用 package manager
sudo apt update
sudo apt install default-jre
```
#### Windows
```
# 使用 Chocolatey(如已安装)
choco install openjdk
# 或从以下地址下载并安装:
# https://www.oracle.com/java/technologies/downloads/
```
**验证 Java 安装:**
```
java -version
```
### 步骤 2:安装 OpenFirebase
#### 推荐方式:使用 pipx
```
# 如果没有 pipx,请先安装
python -m pip install --user pipx
python -m pipx ensurepath
# 通过 cloning repository 安装
git clone https://github.com/Icex0/OpenFirebase.git
cd OpenFirebase
pipx install .
```
#### 默认字典和 Payload
OpenFirebase 包含内置的 Firestore 集合字典和用于写入测试的示例 payload。必须在命令行参数中明确指定这些文件。您也可以随意使用自己的文件:
- 使用 `--fuzz-collections openfirebase/wordlist/firestore-collections.txt` 进行集合模糊测试
- 使用 `--write-rtdb-file openfirebase/payloads/openfirebase.json` 进行 RTDB 写入测试
- 使用 `--write-storage-file openfirebase/payloads/openfirebase_storage_write_check.txt` 进行 Storage 写入测试
## 工作原理
JADX 反编译(默认)
OpenFirebase 默认使用 JADX 反编译进行源代码分析。此 *使用 JADX 反编译 APK* 阶段可能需要一段时间,具体取决于 APK 和您的系统(尤其是在资源有限的虚拟机上): - **自动安装**:如果未找到 JADX,OpenFirebase 将自动下载并安装 JADX。 - **快速替代方案**:使用 `--fast-extract` 跳过 JADX 反编译,并从所有 `/res/values-*` 目录(包括特定于语言环境的变体)中提取字符串资源 - **为什么使用 JADX?**:JADX 反编译通过搜索实际源代码、检测 Firestore 集合以及查找仅靠 strings.xml 分析会遗漏的其他 Firebase 模式来提供更深入的分析 - JADX 处理有 30 分钟的超时限制以防止挂起(在 config.py 中更改)。注意:在某些情况下,JADX 进程在 30 分钟后不会被终止,提取阶段将无法完成。请手动终止挂起的正确 JADX 进程,它将完成提取阶段(我会修复此问题!) - 文件按大小顺序处理(最小的先处理),因此最后阶段会花费更多时间Firebase Realtime Database 扫描
当使用 `--read-rtdb` 或 `--write-rtdb` 选项时,脚本将扫描所有唯一的 Firebase Project ID 以检查数据库可访问性和安全状态。扫描器: - 测试标准 Firebase Realtime Database URL: - `https://PROJECT_ID.firebaseio.com/.json` - `https://PROJECT_ID-default-rtdb.firebaseio.com/.json` - 自动处理区域重定向(例如 europe-west1) - 支持同一项目中的多个 Realtime Database。如果没有手动更改,第二个数据库会自动拥有与项目相同的名称。 - **读取测试 (`--read-rtdb`)**:评估响应状态码: - **200**:公开数据库访问 - **403**:权限被拒绝(受保护) - **404**:未找到数据库 - **423**:数据库锁定/停用 - **写入测试 (`--write-rtdb`)**:尝试从指定文件写入 JSON 数据以测试写入权限 - **仅开放文件**:当发现公开数据库时,自动创建 `*_database_open_only.txt` 文件Firebase Storage 扫描
当使用 `--read-storage` 或 `--write-storage` 选项时,脚本将扫描所有唯一的 Firebase Project ID 以检查存储桶的可访问性: - 测试 Firebase Storage 桶 URL: - `https://firebasestorage.googleapis.com/v0/b/PROJECT_ID.appspot.com/o` - `https://firebasestorage.googleapis.com/v0/b/PROJECT_ID.firebasestorage.app/o` - **读取测试 (`--read-storage`)**:评估响应状态码: - **200**:公开 Storage 访问。 - **400**:Storage 规则版本 1 - 不允许列出。 - **403**:权限被拒绝。 - **412**:服务账号缺少权限。 - **404**:未找到 Storage 桶。 - **写入测试 (`--write-storage`)**:尝试上传指定文件以测试写入权限 - **仅开放文件**:当发现公开 Storage 桶时,自动创建 `*_storage_open_only.txt` 文件Firebase Firestore 扫描
当使用 `--read-firestore` 或 `--write-firestore` 选项时,脚本将扫描 Firestore(默认)数据库以检查可访问性: - **提取的集合**:使用在 JADX 反编译期间从每个 APK 源代码中找到的 Firestore 集合 - **集合模糊测试**:当 `--fuzz-collections` 与字典路径一起使用并发现公开 Firestore 数据库时,自动对常见集合名称进行模糊测试:`users`、`posts`、`messages`、`products`、`orders` 等 - 使用 Firestore REST API 端点: - `https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases/(default)/documents/COLLECTION_NAME` - **读取测试 (`--read-firestore`)**:评估响应状态码: - **200**:包含数据的公开 Firestore 集合。 - **200 (empty)**:公开数据库但集合不存在。 - **403**:权限被拒绝。 - **404**:未找到数据库。 - **写入测试 (`--write-firestore`)**:尝试写入指定的字符串值以测试文档创建权限 - **仅开放文件**:当发现公开 Firestore 数据库时,自动创建 `*_firestore_open_only.txt` 文件Firebase Remote Config 扫描
当使用 `--read-config` 选项时,脚本将使用提取的 Google API Key 和 App ID 扫描 Firebase Remote Config 的可访问性。扫描器: - 从所有 `/res/values-*` 目录中的字符串资源中提取 Google API Key 和 App ID - 使用 Firebase Remote Config API: - `https://firebaseremoteconfig.googleapis.com/v1/projects/{PROJECT_ID}/namespaces/firebase:fetch?key={API_KEY}` - 评估响应状态码: - **200**:Remote Config 可访问。 - **401/403**:权限被拒绝。可能存在其他 Google API 限制。 - **404**:未找到 Remote Config。 - **仅开放文件**:当发现可访问的配置时,自动创建 `*_config_open_only.txt` 文件经过身份验证的扫描和 Google API 限制绕过
当使用 `--check-with-auth` 选项时,OpenFirebase 尝试向 Firebase 服务进行身份验证,以访问在未经身份验证的扫描期间返回 401/403 错误的受保护资源: - **账号创建和登录**:自动尝试使用 Identity Toolkit API 和提取的 API Key 创建 Firebase 用户账号,并获取 Access Token。 - **匿名登录**:如果使用邮箱/密码创建账号失败,自动重试匿名登录。 - **Android 限制绕过**:使用提取的 Android 包名和证书 SHA-1 哈希绕过“限于 Android 应用”的 API 限制 - **多 Key 测试**:测试多个提取的 API Key 和证书组合以找到有效的身份验证方法 - **身份验证重试**:使用获取的身份验证 Token 重试先前失败的读/写操作 - **身份验证持久化**:将成功的身份验证数据保存到 `auth_data.json`,以便将来使用 `--resume-auth-file`服务账号身份验证
OpenFirebase 检测意外嵌入在 APK 文件中的 Firebase 服务账号凭据(`client_email` + `private_key`)。具有管理员级别角色(例如 `firebase-adminsdk`)的服务账号绕过所有 Firebase 安全规则,授予不受限制的访问权限。 #### 检测 - **JADX 反编译**:解析包含 `"type": "service_account"` 以及 `client_email` 和 `private_key` 字段的 JSON 文件。还会扫描 Java/Kotlin 源代码中的硬编码 PEM 私钥和 `@*.gserviceaccount.com` 邮箱 - **快速提取**:直接从 APK 读取 `assets/`、`res/raw/` 和根级 JSON 文件以查找服务账号 JSON 文件 #### 身份验证流程 当找到凭据(或通过 `--service-account` 和 `--private-key` 手动提供)时,OpenFirebase 使用 Google OAuth2 服务对服务 JWT 流程进行身份验证: 1. 使用服务账号的 RSA 私钥签名 JWT 2. 在 `oauth2.googleapis.com/token` 交换短期 Bearer Token 3. 将 Bearer Token 用于所有 RTDB、Firestore 和 Storage 扫描 —— 始终作为默认未经身份验证请求的补充 使用服务账号 Token 的结果标记为 `PUBLIC_SA`,以区别于常规身份验证结果(`PUBLIC_AUTH`)。 #### 服务账号可以访问什么 管理员级别的服务账号不仅绕过读/写的安全规则 —— 它还授予对完整 Firebase Admin SDK 的访问权限,包括: - **Realtime Database**:读/写任何路径,无论安全规则如何 - **Firestore**:读/写任何集合/文档,无论安全规则如何 - **Storage**:读/写任何桶中的任何文件,无论安全规则如何 - **Firebase Auth Admin API**:列出所有用户账号,读取用户数据(邮箱、电话、显示名称、提供商、MFA 状态、自定义声明),创建/删除用户,生成用于用户模拟的自定义 Auth Token,以及禁用 MFA从先前结果恢复
当您已经运行过提取并希望完全跳过提取阶段(JADX 反编译)时,可以使用: - `--resume`:从包含 `*_firebase_items.txt` 文件的现有结果目录恢复,并直接进入扫描 - `--resume-auth-file`:使用结果目录中 `auth_data.json` 文件里先前保存的身份验证数据恢复,跳过试错式身份验证过程直接 Project ID 扫描
当您已经提取了 Firebase Project ID 并希望跳过提取阶段,或者您拥有来自其他来源(如 Web)的 Project ID 时,可以使用: - `--project-id`:扫描以逗号分隔值提供的特定 Project ID - `--project-id-file`:从文件扫描 Project ID(每行一个 ID)标签:APK分析, Firebase, Firestore, GraphQL安全矩阵, JADX, JS文件枚举, Python, Realtime Database, StruQ, URL提取, 云存储安全, 反编译, 图计算, 安全扫描器, 对称加密, 无后门, 服务账号泄露, 未授权访问, 白盒测试, 目录枚举, 移动安全, 网络扫描, 自动化审计, 谷歌云, 逆向工具, 配置错误检测