asaix/chrdmp

GitHub: asaix/chrdmp

一款用于在 Linux 上离线解密 Google Chrome 浏览器保存的密码和 Cookies 的命令行工具。

Stars: 0 | Forks: 0

# chrdmp chrdmp 是一款用于 Google Chrome 浏览器的离线配置文件解密工具。它可以解密包含用户密码的 `Login Data` 文件以及包含浏览器 cookie 的 `Cookies` 文件。该工具专门针对使用 keyring 来加密浏览器机密的系统(即适用于所有 Linux 发行版,而不适用于使用 DPAPI 的 Windows)。 **重要功能:** - 自动检测并处理随数据库版本而变化的格式特性。 - 将整数列值转换为文本,使其含义更加清晰。 - 支持使用默认机密的非 keyring 设置。 ### 快速开始 要进行安装,请选择以下任一方式: 1. Linux:从 releases 页面下载最新的二进制文件。 2. 其他平台:克隆源代码,从 `requirements.txt` 安装所需的包,并使用 Python 3 运行脚本。 `chrdmp` 是一个包含两个子命令的 CLI 工具:`logins` 和 `cookies`。 **解密密码** ``` ./chrdmp logins -d "Login Data" -o logins.csv -s ``` **解密 cookie** ``` ./chrdmp cookies -d "Cookies" -o cookies.csv -s ``` **选项(两个命令通用)** | 标志 | 默认值 | 含义 | | ----------------- | ------------------------ | ------------------------------------------------------------------------- | | `-d`, `--db` | `Login Data` / `Cookies` | 输入的 SQLite 文件路径(必须存在) | | `-s`, `--secret` | `peanuts` | "Chrome Safe Storage" 的 keyring 机密。对于非 keyring 设置,请保持默认值 | | `-o`, `--outfile` | — | 必填项。输出的 CSV 路径(如果存在则会覆盖) | **获取机密** "Chrome Safe Storage" 的 keyring 机密可以通过以目标用户身份运行的 API 调用(或通过其他离线/提权技术)轻易地从目标系统中获取,并可作为命令行参数传递给程序。如果目标系统上未设置 keyring,则无需提供机密,程序将使用默认值 "peanuts"。 **输出中的占位符** 某些条目无法解密为正常的值。在这些情况下,输出将显示一个占位符: - ``:该条目没有可解密的值(空的 BLOB)。 - ``:该条目解密失败。已包含原始值。 - ``:该条目被跳过,因为它需要您未提供的非默认机密(见下文)。已包含原始值。 **被跳过的条目** 使用随机生成的 keyring 机密的条目只能在您提供该机密时才能被解密。如果您将机密保留为默认值(`peanuts`),这些条目将被跳过而不会被解密,并标记为 ``。最后的摘要会将它们计入 "Skipped (no secret provided but uses non-default secret)"(已跳过:未提供机密但使用了非默认机密)。要解密它们,请通过 `-s` 使用正确的机密再次运行该工具。 ### 许可与免责声明 此代码在 MIT License 下分发。请注意,本工具仅供在法律允许范围内的授权使用,开发者不对任何非法或有害的使用承担责任。 ### 演示 ``` ≻ ./chrdmp cookies -d data/Cookies -s "REDACTED" -o cookies.csv Extracting cookies using: Database: data/Cookies Secret: REDACTED Output File: cookies.csv Loading database... 1630 entries loaded. DB version: 24 Summary: Successfully decrypted: 1630 entries (0/1630 empty) Skipped (no secret provided but uses non-default secret): 0 Decryption failures: 0 ≻ ./chrdmp logins -d data/Login\ Data -s "REDACTED" -o psw.csv Extracting passwords using: Database: data/Login Data Secret: REDACTED Output File: psw.csv Loading database... 125 entries loaded. Summary: Successfully decrypted: 125 entries (5/125 empty) Skipped (no secret provided but uses non-default secret): 0 Decryption failures: 0 ``` ## 解密过程详解 在 Linux 上,Chrome 使用 keyring 来保护 cookie 和密码等敏感文件。任何以用户身份运行的进程都可以访问 "Chrome Safe Storage" 的 keyring 机密,进而利用该机密来解密文件。 本指南将引导您完成对 `Login Data`(用户名和密码)以及 `Cookies` 文件的解密。获取 keyring 机密非常简单,可以通过标准的系统 API 调用来完成。 这种解密机制在 Cookies 和 Login Data 中是通用的,唯一的区别在于过程中引用的表和列。 在深入了解这些具体案例之前,先详细了解加密算法会有所帮助。 `Login Data` 和 `Cookies` 文件是 SQLite 数据库。这些文件本身并未加密,可以使用 SQLite 查看器打开。事实上,大多数字段并不包含加密值。然而,用户名、密码和 cookie 的值是使用 keyring 机密进行加密的。 该机密是存储在 keyring 中标签为 "Chrome Safe Storage" 下的 16 个随机字节。如果系统上没有可用的 keyring,Chrome 会使用硬编码的值 "peanuts"(不带引号)作为机密。如果 BLOB 以 "v10" 开头,则机密是 "peanuts"。如果以 "v11" 开头,则使用随机生成的 keyring 机密。 这些 BLOB 使用 AES-128-CBC 进行加密/解密,其密钥是使用 PBKDF2-HMAC-SHA1 生成的,参数包括 keyring 机密、固定盐值 "saltysalt"(不带引号)、1 次迭代以及 16 的密钥长度。 更准确地说, ``` KEY = PBKDF2-HMAC-SHA1(SECRET, "saltysalt", ITERATIONS=1, DKLEN=16) ``` 为了解密 BLOB,我们运行 AES-128-CBC-DECRYPT,其中 key=KEY 且 `IV=" " * 16`。IV 始终是相同的。在解密之前,必须从 BLOB 中去除版本号前缀(v10 或 v11)。用伪代码表示如下: ``` PLAINTEXT = AES-128-CBC-DECRYPT(KEY, IV=" " * 16, DATA=blob[3:]) ``` 注意:在上述伪代码中,AES-DECRYPT 函数同时执行了解密和 PKCS#7 去填充操作。 ### 解密 Login Data 文件 Chrome 将保存的登录凭据存储在 `Login Data` 文件的 `logins` 表中。该表包含有关已保存密码的大量有用信息: | 列名 | 类型 | | ------------------------------- | ------- | | origin_url | VARCHAR | | action_url | VARCHAR | | username_element | VARCHAR | | username_value | VARCHAR | | password_element | VARCHAR | | password_value | BLOB | | submit_element | VARCHAR | | signon_realm | VARCHAR | | date_created | INTEGER | | blacklisted_by_user | INTEGER | | scheme | INTEGER | | password_type | INTEGER | | times_used | INTEGER | | form_data | BLOB | | display_name | VARCHAR | | icon_url | VARCHAR | | federation_url | VARCHAR | | skip_zero_click | INTEGER | | generation_upload_status | INTEGER | | possible_username_pairs | BLOB | | id | INTEGER | | date_last_used | INTEGER | | moving_blocked_for | BLOB | | date_password_modified | INTEGER | | sender_email | VARCHAR | | sender_name | VARCHAR | | date_received | INTEGER | | sharing_notification_displayed | INTEGER | | keychain_identifier | BLOB | | sender_profile_image_url | VARCHAR | | date_last_filled | INTEGER | | actor_login_approved | INTEGER | `password_value` 是唯一的加密字段,可以使用上述方法进行解密。 密码类型字段存储的整数映射如下: | 值 | 含义 | | ----- | --------------------- | | 0 | 表单提交 | | 1 | 自动生成 | | 2 | Credential API | | 3 | 手动添加 | | 4 | 导入 | | 5 | 通过共享接收 | | 6 | 通过凭据交换导入 | | 7 | 更改提交 | 日期字段存储的是自 1601-01-01以来的微秒数。 其他字段不言自明且未加密。 ### 解密 Cookies 文件 cookie 数据存储在 `Cookies` 文件的 `cookies` 表中。 该表列出了 Chrome 存储的有关 cookie 的所有信息: | 列名 | 类型 | | ---------------------- | ------- | | creation_utc | INTEGER | | host_key | TEXT | | top_frame_site_key | TEXT | | name | TEXT | | value | TEXT | | encrypted_value | BLOB | | path | TEXT | | expires_utc | INTEGER | | is_secure | INTEGER | | is_httponly | INTEGER | | last_access_utc | INTEGER | | has_expires | INTEGER | | is_persistent | INTEGER | | priority | INTEGER | | samesite | INTEGER | | source_scheme | INTEGER | | source_port | INTEGER | | last_update_utc | INTEGER | | source_type | INTEGER | | has_cross_site_ancestor| INTEGER | `encrypted_value` 是唯一的加密字段,用于存储 cookie 的值。 日期字段存储的是自 1601-01-01以来的微秒数。 可以使用上述描述的方法对其进行解密。但需要注意一点:在版本 24 及以上的数据库中,明文值前面会加上一个 32 字节的元数据字段。 即,要获取 cookie 的值, ``` if db_version >= 24: plaintext = plaintext[32:] ``` 几个未加密的整数列是枚举或布尔标志。它们映射到以下易读的值: | 列名 | 值 | 含义 | | ------------------------------------------------------------------------------------- | ----- | ----------- | | `is_secure`, `is_httponly`, `is_persistent`, `has_expires`, `has_cross_site_ancestor` | 0 | 否 | | | 1 | 是 | | `priority` | 0 | 低 | | | 1 | 中 | | | 2 | 高 | | `samesite` | -1 | 未设置 | | | 0 | 无 | | | 1 | lax | | | 2 | strict | | `source_scheme` | 0 | 未设置 | | | 1 | http | | | 2 | https | | `source_type` | 0 | 未知 | | | 1 | http header | | | 2 | script | | | 3 | 其他 |
标签:Chrome, Python, 凭据提取, 数据解密, 文档结构分析, 无后门, 逆向工具