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, 凭据提取, 数据解密, 文档结构分析, 无后门, 逆向工具