BitCracker 是首个开源存储设备(硬盘、USB 闪存盘、SD 卡等)密码破解工具,针对使用 BitLocker 加密的设备。BitLocker 是 Windows Vista、7、8.1 和 10(旗舰版、专业版和企业版)提供的加密功能。它支持多种身份验证方法来加密存储设备,例如受信任平台模块 (TPM)、智能卡、恢复密码、用户提供的密码。
通过字典攻击,BitCracker 尝试找到正确的用户密码或恢复密码来解密加密的存储设备。该工具基于 CUDA 和 OpenCL 实现。
多本期刊延迟了我们的 BitCracker 论文的发表(将近 3 年,经过多次修订后最终被拒),该论文详细介绍了我们的攻击方法、BitLocker 驱动器加密(BDE)卷格式以及加密/解密过程中可能存在的弱点。 最终,我们将论文发表在这里:https://arxiv.org/abs/1901.01337。欢迎评论和分享。
运行 BitCracker-CUDA 的最低要求:
运行 BitCracker-OpenCL 的最低要求:任何支持 OpenCL 的 GPU 或 CPU(你可以在这里找到一些帮助)。
BitCracker 至少需要 260 MB 的设备内存。
出于性能原因,我们强烈建议在 GPU 而非 CPU 上运行攻击(参见性能部分)。
运行 build.sh 脚本会在 build 目录下生成 4 个可执行文件:bitcracker_hash、bitcracker_rpgen、bitcracker_cuda、bitcracker_opencl。
为了根据你的 NVIDIA GPU 和 CUDA 版本正确构建 bitcracker_cuda,你需要修改 src_CUDA/Makefile 并选择正确的 SM 版本。作为参考,可以使用下表:
你需要使用 BitLocker 加密的存储设备的镜像,例如使用 dd 命令:
sudo dd if=/dev/disk2 of=/path/to/imageEncrypted.img conv=noerror,sync
4030464+0 records in
4030464+0 records out
2063597568 bytes transferred in 292.749849 secs (7049013 bytes/sec)
然后,你需要在 imageEncrypted.img 上运行 bitcracker_hash 可执行文件,以:
如果执行成功,bitcracker_hash 会生成 1 个或 2 个输出文件:
BDE 加密卷可能因不同的身份验证方法而具有不同格式。如果 bitcracker_hash 无法在你的加密镜像上找到恢复密码,请创建一个问题或联系我。
示例:
/build/bitcracker_hash -o test_hash -i ./Images/imgWin7
---------> BitCracker 哈希提取器 <---------
正在打开文件 ./Images/imgWin7
....
在 0x02208000 处找到签名
版本: 2 (Windows 7 或更高版本)
在 0x022080bc 处找到 VMK 条目
找到使用用户密码加密的 VMK!
使用 AES-CCM 加密的 VMK
在 0x0220819c 处找到 VMK 条目
找到使用恢复密钥加密的 VMK!
使用 AES-CCM 加密的 VMK
用户密码哈希:
$bitlocker$0$16$89a5bad722db4a729d3c7b9ee8e76a29$1048576$12$304a4ac192a2cf0103000000$60$24de9a6128e8f8ffb97ac72d21de40f63dbc44acf101e68ac0f7e52ecb1be4a8ee30ca1e69fbe98400707ba3977d5f09b14e388c885f312edc5c85c2
恢复密钥哈希:
$bitlocker$2$16$8b7be4f7802275ffbdad3766c7f7fa4a$1048576$12$304a4ac192a2cf0106000000$60$6e72f6ef6ba688e72211b8cf8cc722affd308882965dc195f85614846f5eb7d9037d4d63bcc1d6e904f0030cf2e3a95b3e1067447b089b7467f86688
用户密码攻击输出文件: "hash_user_pass.txt"
恢复密码攻击输出文件: "hash_recv_pass.txt"
如果存储设备使用用户提供的密码加密(如下图所示),你可以使用此类型攻击。
BitCracker 执行字典攻击,因此你需要提供一个可能的用户密码字典。
要启动攻击,你需要:
hash_user_pass.txt 文件命令行示例:
./build/bitcracker_cuda -f hash_user_pass.txt -d wordlist.txt -t 1 -b 1 -g 0 -u
其中:
-f:hash_user_pass.txt 文件的路径-d:你的字典文件路径-t:每个 CUDA 线程处理的密码数量-b:CUDA 块的数量-g:NVIDIA GPU 设备 ID-u:指定你想要进行用户密码攻击所有可用选项请键入 ./build/bitcracker_cuda -h。
为了获得最佳性能,请参考性能部分的表格,根据你的 NVIDIA GPU 正确设置 t 和 b 选项。
同样的注意事项也适用于 bitcracker_opencl 可执行文件。
输出示例:
====================================
选择设备: GPU Tesla K80 (ID: 0)
====================================
....
读取哈希文件 "hash_user_pass.txt"
$bitlocker$0$16$0a8b9d0655d3900e9f67280adc27b5d7$1048576$12$b0599ad6c6a1cf0103000000$60$c16658f54140b3d90be6de9e03b1fe90033a2c7df7127bcd16cb013cf778c12072142c484c9c291a496fc0ebd8c21c33b595a9c1587acfc6d8bb9663
====================================
攻击
====================================
攻击类型: 用户密码
CUDA 线程数: 1024
CUDA 块数: 1
每线程密码数: 1
每次内核最大密码数: 1024
字典: wordlist.txt
严格检查 (-s): 否
MAC 比较 (-m): 否
CUDA 内核执行:
流 0
有效密码数: 12
密码范围:
abcdefshhf
.....
blablalbalbalbla12
时间: 28.651947 秒
每秒密码数: 0.42 pw/sec
================================================
....
找到密码: paperino
================================================
目前 BitCracker 能够处理的输入密码长度在 8 到 55 个字符之间。
在存储设备加密期间(无论使用哪种身份验证方法),BitLocker 都会要求用户将恢复密码存储在某处,以便在她/他无法正常解锁驱动器时恢复对加密存储设备的访问。 因此,恢复密码是一种所有身份验证方法的“万能钥匙”,它由如下所示的 48 位密钥组成:
236808-089419-192665-495704-618299-073414-538373-542366
有关更多详细信息,请参见 Microsoft 文档。
与用户密码一样,BitCracker 能够执行字典攻击来找到 BitLocker 用于加密存储设备的正确恢复密码。请注意,目前我们只能攻击存储设备未使用 TPM 加密时的恢复密码。
要启动攻击,你需要:
hash_recv_pass.txt 文件生成并存储所有可能的密码是一个难题。为此,我们创建了一个名为 bitcracker_rpgen 的恢复密码生成器。使用此工具,你可以创建一系列恢复密码字典文件,用于攻击。例如:
./build/bitcracker_rpgen -n 300 -p 10000000 -s 000000-000011-000022-000033-000044-000055-008459-015180
这会生成:
-n:字典文件数量-p:每个字典文件中的恢复密码数量-s:从此恢复密码开始生成你也可以不加选项运行,使用默认配置:
./build/bitcracker_rpgen
************* BitCracker 恢复密码字典文件生成器 *************
使用以下配置运行:
### 创建 100 个字典文件
### 每个字典文件包含 5000000 个恢复密码
### 允许重复=否
### 从 000000-000011-000022-000033-000044-000055-000066-000077 开始生成
正在创建字典文件 "bitcracker_wlrp_0.txt",包含 5000000 个密码
第一个密码=000000-000011-000022-000033-000044-000055-000066-000077
最后一个密码= 000000-000011-000022-000033-000044-000055-000902-217822
...
请注意,-s 选项可用于从上次生成的恢复密码继续生成(而不是每次都从头开始)。
-d 选项允许在同一恢复密码中出现重复。例如:
000000-000011-000055-000055-000044-000055-000902-217822
所有可用选项请键入 ./build/bitcracker_rpgen -h。
注意: 请注意,可能的恢复密码数量巨大:
恢复密码 = 65536 x 65536 x 65536 x 65536 x 65536 x 65536 x 65536 x 65536
根据我们的研究,密码分布是均匀的,无法找到“更可能”的数字。到目前为止,我们没有找到任何规则来减少可能的候选数量。这意味着恢复密码攻击可能会耗时无限长(用户密码攻击始终是首选)。我们很快就会修改 bitcracker_rpgen 工具,使其以随机方式生成恢复密码,而不是按顺序生成。
命令行示例:
./build/bitcracker_cuda -f hash_recv_pass.txt -d bitcracker_wlrp_0.txt -t 1 -b 1 -g 0 -r
选项与用户密码情况相同,但需要指定 -r 而不是 -u。输出示例:
====================================
选择设备: GPU Tesla K80 (ID: 0)
====================================
...
读取哈希文件 "hash_recv_pass.txt"
$bitlocker$2$16$432dd19f37dd413a88552225628c8ae5$1048576$12$a0da3fc75f6cd30106000000$60$3e57c68216ef3d2b8139fdb0ec74254bdf453e688401e89b41cae7c250739a8b36edd4fe86a597b5823cf3e0f41c98f623b528960a4bee00c42131ef
====================================
攻击
====================================
攻击类型: 恢复密码
CUDA 线程数: 1024
CUDA 块数: 1
每线程密码数: 8
每次内核最大密码数: 8192
字典: wordlist.txt
严格检查 (-s): 否
MAC 比较 (-m): 否
CUDA 内核执行:
有效密码数: 6014
密码范围:
390775-218680-136708-700645-433191-416240-153241-612216
.....
090134-625383-540826-613283-563497-710369-160182-661364
时间: 193.358937 秒
每秒密码数: 31.10 pw/sec
================================================
CUDA 攻击完成
评估密码数: 6014
找到密码: 111683-110022-683298-209352-468105-648483-571252-334455
================================================
默认情况下,BitCracker 执行快速攻击(适用于用户密码和恢复密码模式),可能会返回一些误报。在这种情况下,你可以使用 -m 选项重新运行攻击,该选项启用 MAC 验证(速度较慢)。
为了在开始实际攻击前测试 BitCracker,我们提供了几个加密存储设备的镜像。
你可以使用 Dictionary 文件夹中存储的字典文件,以用户密码和恢复密码模式攻击这些镜像。
以下报告了在快速攻击(默认)下针对用户密码(-u 选项)的最佳性能。
性能:
注意:每个密码大约需要 2.097.152 次 SHA-256 运算
我们将 BitCracker 作为 OpenCL-BitLocker 格式集成到了 John The Ripper 中(--format=bitlocker-opencl)。
由 bitcracker_hash 生成的哈希文件(参见如何使用部分)与 John 格式完全兼容。
在 GTV100 上,密码速率为约 3150 p/s。JtR 团队开发了此攻击的 CPU 版本(--format=bitlocker);在 Intel(R) Xeon(R) v4 2.20GHz CPU 上,密码速率约为 78 p/s。
此功能正在开发中...
2021 年 11 月:更新代码以支持使用 CUDA 11.x 在 NVIDIA GPU Ampere 上运行
请分享并测试我们的项目:我们需要你的反馈!
特别感谢 John The Ripper 团队、Dislocker 和 LibBDE 项目。
这是一个与意大利国家研究委员会合作的研究项目,以 GPLv2 许可证发布。
版权所有 (C) 2013-2021 Elena Ago (elena dot ago at gmail dot com) 和 Massimo Bernaschi (massimo dot bernaschi at gmail dot com)
我们将在未来的论文中提供关于 BitCracker 攻击的更多信息。
尽管我们使用 GPLv2 许可证,但我们欢迎合作。 如需了解更多信息、寻求合作或报告错误,请与我们联系或提出问题。
| GPU 架构 | 建议 CUDA 版本 | Makefile 配置 |
|---|
| Kepler | CUDA 7.5 | arch=compute_35,code=sm_35 |
| Maxwell | CUDA 8.0 | arch=compute_52,code=sm_52 |
| Pascal | CUDA 9.0 | arch=compute_60,code=sm_60 |
| Volta | CUDA 9.0 | arch=compute_70,code=sm_70 |
| GPU 简称 | GPU | 架构 | CC | # SM | 核心时钟 | CUDA 版本 |
|---|
| GFT | GeForce Titan | Kepler | 3.5 | 14 | 835 | 7.0 |
| GTK80 | Tesla K80 | Kepler | 3.5 | 13 | 875 | 7.5 |
| GFTX | GeForce Titan X | Maxwell | 5.2 | 24 | 1001 | 7.5 |
| GTP100 | Tesla P100 | Pascal | 6.1 | 56 | 1328 | 8.0 |
| GTV100 | Tesla V100 | Volta | 7.0 | 80 | 1290 | 9.0 |
| AMDM | Radeon Malta | - | - | - | - | - |
| 版本 | GPU | -t | -b | 每次内核密码数 | 密码/秒 | 哈希/秒 |
|---|
| CUDA | GFT | 8 | 13 | 106.496 | 303 | 635 MH/s |
| CUDA | GTK80 | 8 | 14 | 114.688 | 370 | 775 MH/s |
| CUDA | GFTX | 8 | 24 | 106.608 | 933 | 1.957 MH/s |
| CUDA | GTP100 | 1 | 56 | 57.344 | 1.418 | 2.973 MH/s |
| CUDA | GTV100 | 1 | 80 | 81.920 | 3.252 | 6.820 MH/s |
| OpenCL | AMDM | 32 | 64 | 524.288 | 241 | 505 MH/s |
| OpenCL | GFTX | 8 | 24 | 196.608 | 884 | 1.853 MH/s |