John the Ripper 与硬件加速 (GPU)

Kali LinuxBeginner
立即练习

引言

在本实验中,你将探索 John the Ripper (JtR) 与图形处理单元 (GPU) 结合使用的强大功能,以加速密码破解。传统的基于 CPU 的破解可能非常缓慢,尤其是对于复杂密码。GPU 凭借其海量的并行处理能力,可以显著缩短破解密码所需的时间。

你将从理解 GPU 破解的基本原理开始,然后进行环境设置的实际步骤。这包括安装必要的 GPU 驱动程序和框架,如 CUDA 或 OpenCL。接下来,你将配置 John the Ripper 以利用你的 GPU,对其性能进行基准测试,并学习常见的故障排除技巧。通过本实验的结束,你将对如何有效地使用 John the Ripper 的 GPU 加速功能有扎实的理解。

理解 GPU 破解原理

在本步骤中,你将学习使 GPU 加速密码破解的基本原理。

GPU 专为并行处理而设计,这意味着它们可以同时执行大量计算。这种架构非常适合密码破解等任务,在这些任务中,需要对相同的操作(例如,哈希一个密码候选)执行数百万甚至数十亿次。

关键概念:

  • 并行性 (Parallelism): 与擅长顺序任务的 CPU 不同,GPU 拥有数千个较小的核心,可以并发处理问题的独立部分。在密码破解中,每个核心都可以测试一个不同的密码候选。
  • 哈希算法 (Hashing Algorithms): 密码破解涉及重复地哈希候选密码,并将结果与已知哈希进行比较。许多哈希算法(如 MD5、SHA-1、bcrypt、scrypt)计算量很大,因此非常适合 GPU 加速。
  • CUDA/OpenCL: 这些是并行计算平台和编程模型,允许软件开发人员使用 GPU 进行通用处理。
    • CUDA (Compute Unified Device Architecture): 由 NVIDIA 开发,是 NVIDIA GPU 的专有平台。
    • OpenCL (Open Computing Language): 一个开放标准,用于跨不同供应商的异构平台(CPU、GPU、FPGA 等)进行并行编程。John the Ripper 支持两者。

工作原理:

  1. 加载哈希 (Load Hashes): John the Ripper 将目标密码哈希加载到 GPU 的内存中。
  2. 生成候选 (Generate Candidates): GPU 生成大量密码候选(例如,从字典或通过暴力破解)。
  3. 哈希与比较 (Hash and Compare): 每个 GPU 核心同时哈希其分配的候选密码,并将其生成的哈希与目标哈希进行比较。
  4. 报告破解结果 (Report Cracks): 如果找到匹配项,则报告已破解的密码。

这种并行执行大大缩短了找到匹配密码所需的时间。

安装 GPU 驱动程序和 CUDA/OpenCL

在本步骤中,你将通过安装必要的驱动程序和 OpenCL 框架来准备你的 LabEx 环境以实现 GPU 加速。由于 LabEx 环境是虚拟化的,可能无法直接访问物理 GPU,我们将通过安装 OpenCL 开发库来模拟设置,这些库对于 John the Ripper 的 GPU 模块至关重要。

首先,更新软件包列表,以确保你获得最新版本的软件。

sudo apt update

接下来,安装 ocl-icd-opencl-dev 包。此包提供了 OpenCL 可安装客户端驱动程序 (ICD) 加载器和开发文件,这对于像 John the Ripper 这样的应用程序与 OpenCL 兼容设备进行交互至关重要。

sudo apt install -y ocl-icd-opencl-dev

安装完成后,你可以验证 OpenCL 库是否存在。虽然你没有物理 GPU 可以使用 clinfo 进行查询,但开发文件的存在表明系统已设置为编译和运行 OpenCL 应用程序。

ls -l /usr/lib/x86_64-linux-gnu/libOpenCL.so

你应该会看到类似以下的输出,确认库已存在:

lrwxrwxrwx 1 root root 19 Mar 28  2023 /usr/lib/x86_64-linux-gnu/libOpenCL.so -> libOpenCL.so.1.0.0

此步骤确保 John the Ripper 可以检测和使用的基础 OpenCL 组件已可用。

配置 John the Ripper 以使用 GPU

在本步骤中,你将安装 John the Ripper 并验证其检测 OpenCL 的能力。虽然 LabEx 环境可能没有物理 GPU,但 John the Ripper 的 OpenCL 模块仍然会存在,并且可以进行配置。

首先,安装 John the Ripper。

sudo apt install -y john

安装完成后,你可以检查 John the Ripper 的功能,特别是查找 OpenCL 支持。John the Ripper 的 john --list=opencl-devices 命令用于列出检测到的 OpenCL 设备。在没有物理 GPU 的虚拟化环境中,它可能不会列出任何实际设备,但该命令本身确认了 OpenCL 模块已编译到 John the Ripper 中。

john --list=opencl-devices

你可能会看到类似“No OpenCL devices found”或类似的输出,这在当前虚拟环境中是符合预期的。重要的是该命令能够无错误地运行,确认 JtR 的 OpenCL 功能已存在。

No OpenCL devices found.

接下来,让我们创建一个虚拟哈希文件来准备破解。我们将使用一个简单的 MD5 哈希作为演示。

echo "testuser:5d41402abc4b2a76b9719d911017c592" > ~/project/hashes.txt

这将在你的 ~/project 目录中创建一个名为 hashes.txt 的文件,其中包含密码 "hello" 的哈希。

现在,尝试使用 John the Ripper 破解哈希。即使没有物理 GPU,John the Ripper 也会尝试使用其启用了 OpenCL 的模块(如果可用),如果没有找到设备则回退到 CPU。

john --format=raw-md5 ~/project/hashes.txt --wordlist=/usr/share/john/password.lst

你应该会看到输出表明 John the Ripper 正在处理哈希。如果密码 "hello" 存在于默认字典中,它将被破解。

Using default input encoding: UTF-8
Loaded 1 password hash (Raw-MD5 [MD5])
Cost 1 (iteration count) is 1 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
hello            (testuser)
1g 0:00:00:00 DONE (2024-01-01 12:00) 100.0% 1000000g/s 1000000p/s 1000000c/s 1000000C/s testuser
Session completed.

此步骤确认 John the Ripper 已安装,其 OpenCL 组件已被识别,并且它可以处理哈希。

基准测试 GPU 破解性能

在本步骤中,你将学习如何基准测试 John the Ripper 的性能。虽然我们处于没有物理 GPU 的虚拟化环境中,但了解基准测试过程对于实际场景至关重要。John the Ripper 具有内置的基准测试工具,可以测试各种哈希类型。

要基准测试 John the Ripper,请使用 --test 选项。此命令将针对不同的哈希算法运行一系列测试,显示每种算法的破解速度(每秒猜测次数)。

john --test

输出内容将非常详尽,显示各种哈希类型的性能。查找描述中包含“OpenCL”的行,前提是检测到了任何 OpenCL 设备。即使没有物理 GPU,John the Ripper 也可能根据其编译的模块报告理论上的 OpenCL 性能。

示例输出(为简洁起见已截断):

Benchmarking: Raw-MD5 [MD5]... DONE
Many salts:     1000000 c/s real, 1000000 c/s virtual

Benchmarking: bcrypt ($2*$, $2a$, $2x$, $2y$, $2b$) [Blowfish OpenCL]... DONE
Many salts:     1000000 c/s real, 1000000 c/s virtual
Only one salt:  1000000 c/s real, 1000000 c/s virtual

c/s(每秒候选次数)或 p/s(每秒密码次数)值表示破解速度。在具有强大 GPU 的真实环境中,与仅 CPU 的基准测试相比,GPU 加速算法的这些数字会显著更高。

你也可以基准测试特定的哈希类型,例如 raw-md5,以获得更集中的结果:

john --test=0 --format=raw-md5

此命令专门对 raw-md5 格式进行基准测试。--test=0 选项会运行一个简短的基准测试,这对于快速检查很有用。

理解这些基准测试结果是评估你的 GPU 设置有效性并比较不同硬件配置的关键。

故障排除 GPU 破解问题

在本步骤中,你将学习 John the Ripper 和 GPU 加速的常见故障排除技术。虽然 LabEx 环境没有物理 GPU,但了解这些步骤对于实际应用至关重要。

常见问题及解决方案:

  1. “No OpenCL devices found”或“CUDA error”:

    • 原因: GPU 驱动程序不正确或缺失,或者 OpenCL/CUDA SDK 未正确安装。
    • 解决方案: 确保你的 GPU 驱动程序是最新的并且已正确安装。对于 NVIDIA GPU,请安装 CUDA Toolkit。对于 AMD/Intel GPU,请确保已安装 OpenCL 驱动程序。在虚拟环境中,如果未暴露虚拟 GPU,则出现此消息是符合预期的。
    • 检查: 运行 john --list=opencl-devicesnvidia-smi(适用于 NVIDIA)来验证设备检测。
  2. 性能不佳:

    • 原因: 驱动程序过时、GPU 内存不足,或在 GPU 上使用了 CPU 优化的哈希类型。
    • 解决方案: 更新驱动程序。确保你的 GPU 具有足够的内存来处理所选的哈希类型和字典。某些哈希类型(例如 bcrypt、scrypt)被设计为故意缓慢且内存密集型,因此与 MD5 等简单哈希相比,在 GPU 上的效率较低。
    • 检查: 使用 john --test 来基准测试性能,并与你的 GPU 的预期值进行比较。
  3. 崩溃或冻结:

    • 原因: 过热、超频不稳定或驱动程序冲突。
    • 解决方案: 监控 GPU 温度。如果进行了超频,请降低超频设置。干净地重新安装驱动程序。
    • 检查: 使用 watch -n 1 nvidia-smi(适用于 NVIDIA)来监控 GPU 使用率和温度。
  4. John the Ripper 未使用 GPU:

    • 原因: JtR 未使用 GPU 支持进行编译,或者 GPU 模块不支持特定的哈希格式。
    • 解决方案: 确保你安装了正确的 JtR 版本(例如,如果可用,则为 john-opencljohn-cuda,或者从源代码构建并带有 GPU 标志)。验证你正在破解的哈希格式在 JtR 中具有 OpenCL/CUDA 实现。
    • 检查: 运行 john --list=formats 并查找描述中包含 OpenCLCUDA 的格式。

模拟故障排除步骤:

假设你遇到了一个问题,需要检查 John the Ripper 的版本以确保它支持 OpenCL。

john --version

此命令将输出已安装的 John the Ripper 的版本,这有助于识别你是否拥有包含 GPU 支持的版本。

John the Ripper 1.9.0-jumbo-1 (linux-gnu)
Copyright (c) 1996-2023 by Solar Designer and others
...

理解这些常见问题及其解决方案将帮助你在实际场景中使用 John the Ripper 进行 GPU 加速时,有效地排除故障。

总结

在本实验中,你全面了解了如何利用 John the Ripper 的 GPU 硬件加速来加快密码破解速度。你首先探索了 GPU 并行处理的基本原理以及 OpenCL 等框架的作用。

随后,你进行了环境设置的实际步骤,包括安装必要的 OpenCL 开发库。你学习了如何安装 John the Ripper,验证其 OpenCL 功能,并执行基本的哈希破解。此外,你还探索了 John the Ripper 内置的基准测试工具来评估性能,并讨论了 GPU 破解问题的常见故障排除技术。

通过完成本实验,你现在已掌握了在实际场景中有效利用 John the Ripper 的 GPU 加速的知识,从而显著增强你的密码破解能力。