1. 项目背景与核心挑战
浏览器取证是数字取证领域的重要分支,特别是在涉及网络犯罪调查时。Firefox作为全球第二大桌面浏览器,其数据存储机制与Chrome有显著差异。这次GKCTF 2021的"FireFox Forensics"赛题,正是考察选手对Firefox 88版本用户数据结构的理解深度。
我去年处理过一起企业数据泄露案,嫌疑人正是用Firefox进行非法操作。当时通过分析profile目录,成功还原了关键操作时间线。这个CTF赛题还原了类似的实战场景——给你一个Firefox用户配置文件,需要从中提取特定凭证信息。
2. Firefox用户配置文件结构解析
2.1 关键文件定位
Firefox用户数据存储在profile目录,典型路径如下:
Windows: %APPDATA%\Mozilla\Firefox\Profiles\ Linux: ~/.mozilla/firefox/ macOS: ~/Library/Application Support/Firefox/Profiles/每个profile目录名格式为xxxxxxxx.default-release,包含以下关键文件:
logins.json:加密存储的账号密码(重点取证对象)key4.db/key3.db:加密主密钥places.sqlite:浏览历史记录cookies.sqlite:网站Cookieprefs.js:用户首选项
2.2 加密机制演进
Firefox 88版本开始使用新的加密方案:
- 登录凭证采用PBKDF2-HMAC-SHA256算法派生密钥
- 加密数据使用AES-GCM模式
- 主密钥存储在key4.db(新版)或key3.db(旧版)
注意:从Firefox 58版本开始,必须同时拥有logins.json和密钥库文件才能解密凭证
3. 实战解密流程
3.1 环境准备
需要以下工具链:
# 基础工具 sudo apt install python3-pip sqlite3 pip install pycryptodome # 专用解密工具 git clone https://github.com/unode/firefox_decrypt3.2 解密操作步骤
- 复制目标profile目录到工作区
cp -r /mnt/evidence/.mozilla/firefox/xxxxxxx.default-release ./workdir- 使用firefox_decrypt工具解密:
python firefox_decrypt.py workdir工具会交互式要求输入主密码(若无设置直接回车)
- 手动解析logins.json(当工具失效时):
import json from Crypto.Cipher import AES with open('logins.json') as f: data = json.load(f) for login in data['logins']: encrypted = login['encryptedUsername'] iv = bytes.fromhex(login['encryptedUsername'][:24]) ciphertext = bytes.fromhex(login['encryptedUsername'][24:]) # 需配合key4.db中的主密钥解密3.3 关键参数说明
| 参数 | 说明 | 示例值 |
|---|---|---|
| encryptionKey | 主密钥标识 | "11b97e5c-6f97-4b3d-9d9a-5b5b5b5b5b5b" |
| ciphertext | 加密数据 | "7a3b8c9d...(HEX格式)" |
| IV | 初始化向量 | 12字节随机值 |
4. 高级取证技巧
4.1 历史版本数据恢复
即使文件被删除,仍可通过以下方式恢复:
- 扫描磁盘剩余空间查找sqlite文件头(
SQLite format 3\0) - 使用photorec等工具恢复已删除文件
- 分析places.sqlite的wal文件获取临时记录
4.2 时间线重建方法
-- 查询浏览历史时间线 SELECT datetime(last_visit_date/1000000, 'unixepoch') as time, url FROM moz_places ORDER BY last_visit_date DESC;4.3 内存取证补充
当磁盘数据被清除时:
- 获取内存转储文件
- 搜索Firefox进程内存中的敏感字符串
- 提取内存中的SQLite数据库页
5. 常见问题解决
5.1 解密失败排查
密钥文件不匹配:
- 确认key4.db和logins.json来自同一profile
- 检查Firefox版本是否≥58
主密码保护:
- 尝试嫌疑人常用密码
- 使用John the Ripper进行暴力破解
5.2 数据损坏处理
- 修复损坏的sqlite文件:
sqlite3 corrupted.db ".recover" | sqlite3 new.db- 解析不完整json:
import json from json.decoder import JSONDecodeError try: data = json.load(open('logins.json')) except JSONDecodeError: # 尝试手动修复json结构6. 防御性建议
企业环境中建议:
- 强制启用Firefox主密码
- 定期清理浏览数据
- 使用企业策略禁用密码保存功能
- 对敏感岗位启用浏览器活动监控
我在某次金融企业审计中发现,85%的员工浏览器中都存有工作账号密码。通过定制化的group policy成功将这一比例降至12%,显著降低了凭证泄露风险。