破解与/ - 使用GPU破解密码,第二部分:开始破解

作者:Kyle Rankin

您的硬件已准备就绪。现在,让我们加载一些软件并开始破解。

本系列的第一部分中,我解释了密码破解的一般原理,并描述了我用于密码破解的特定硬件。在本文中,我将深入探讨软件方面,并描述如何利用该硬件来破解密码。我还会讨论两种主要的攻击类型:字典攻击和暴力破解攻击。在描述每种攻击时,我还会给出具体的例子,说明我是如何使用该软件来攻击 phpass 的,phpass 是当前用于基于 PHP 的软件(如 WordPress)的哈希算法。

为了本文的目的,我在我的服务器上创建了一个示例 WordPress 博客,并创建了一些自定义帐户——一些帐户使用弱密码,另一些帐户使用真正随机的密码。然后,我进入该网站的数据库,提取了每个帐户的 phpass 密码哈希值,并将它们放入一个如下所示的文件中


$P$BpgwVqlfEwuaj.FlM7.YCZ6GQMu15D/
$P$BGMZP8qAHPjTTiTMdSxGhjfQMvkm2D1
$P$BOPzST0vwsR86QfIsQdspt4M5wUGVh.
$P$BjAZ1S3pmcGOC8Op808lOK4l25Q3Ph0
$P$BPlIiO5xdHmThnjjSyJ1jBICfPkpay1
$P$BReStde51ZwKHVtiTgTJpB2zzmGJW91

上面的哈希值是从六个字符的密码生成的合法 phpass 哈希值。我可以告诉你密码,但这会破坏你自己破解它们的乐趣。

专有视频驱动程序

对于像我一样相信开源软件的你们来说,接下来的部分可能会有点令人失望。要让硬件加速的密码破解软件在您的系统上运行,您需要安装来自 AMD 或 NVIDIA 的专有视频驱动程序。也就是说,如果您已经在使用您的系统进行比特币挖矿,您已经拥有了您需要的驱动程序和库,因此您可以跳到关于 Hashcat 的下一节。老实说,您也可以直接按照比特币挖矿的操作指南进行操作,它会描述如何获取您需要的所有驱动程序和库。

许多现代桌面使得下载和安装专有视频驱动程序相对容易。例如,Ubuntu 桌面会提示您可以安装 AMD 和 NVIDIA 显卡的受限驱动程序。大多数其他流行的发行版也提供了关于如何下载专有驱动程序的良好文档。在最坏的情况下,您可能需要直接从 AMD 或 NVIDIA 下载软件并以这种方式安装它——它们都提供了清晰的说明和适用于 Linux 的软件,就像适用于其他操作系统一样。

安装专有驱动程序后,您还需要 AMD APP SDK 及其 OpenCL 库或 NVIDIA CUDA 库,具体取决于您的显卡制造商。您可能需要直接从 AMD 或 NVIDIA 网站获取这些库。但是安装过程很简单。在我的例子中,我从 AMD 下载了 AMD-APP-SDK-v2.5-lnx32.tgz 文件,解压缩后,以 root 身份运行了提供的 Install-AMD-APP.sh shell 脚本。

Hashcat

存在许多不同的密码破解套件,既有基于 CPU 的破解套件,也有基于 GPU 的破解套件。在审查了所有选项后,我决定使用 Hashcat 系列破解工具,可在 http://hashcat.net 上找到。在该网站上,您会看到有许多不同的工具可用。乍一看,它可能会有点令人困惑,因为您可以从 hashcat、oclHashcat、oclHashcat-plus、oclHashcat-lite 甚至名为 maskprocessor 的软件中进行选择。但是,每个程序都有其用途,具体取决于您打算做什么。

hashcat

  • 基于 CPU,因此比基于 GPU 的软件慢。

  • 支持最广泛的哈希算法。

oclHashcat

  • 基于 GPU 的密码破解程序。

  • 支持适度数量的哈希算法。

  • 内置支持字典、暴力破解和掩码攻击。

oclHashcat-plus

  • 基于 GPU。

  • 在基于 GPU 的 hashcat 破解程序中,支持最多的哈希算法。

  • 针对多个哈希值的字典攻击进行了优化。

  • 可以支持来自管道的字典输入,因此可以进行暴力破解。

oclHashcat-lite

  • 基于 GPU。

  • 针对单个密码哈希值的攻击进行了优化。

  • Hashcat 系列中最快的,但密码哈希支持最有限。

maskprocessor

  • 根据您提供的模式生成字典。

  • 本身不是密码破解程序,但可以将输出通过管道传输到 oclHashcat-plus 以进行暴力破解。

即使有上面的列表,也可能并不总是清楚该使用哪个软件。基本上,这取决于您想要破解哪种类型的密码以及您想要使用哪种类型的攻击。hashcat.net 上专门针对每款软件的页面提供了它们支持的哈希算法列表,以及它们在不同类型硬件上每秒可以进行的比较次数的基准速度。对于给定的密码哈希值,请浏览这些页面,看看哪种类型的 Hashcat 软件支持您的哈希值并且具有最高的基准。除此之外,使用 oclHashcat 对多个哈希值进行掩码或暴力破解攻击,oclHashcat-lite 用于单个哈希值,或者 oclHashcat-plus,如果像我的情况一样,它是唯一支持您的哈希值的 GPU 加速版本。

一旦您决定使用哪种类型的 Hashcat 软件,安装就相对简单,如果有点老派的话。只需下载与该软件对应的 .7z 包,然后使用 7za 命令行工具(应该为您的发行版打包)解压缩它。该软件将解压缩到其自己的目录中,该目录为 Linux 和 Windows 提供 32 位和 64 位版本。如果您有 NVIDIA 硬件,您将使用以 cuda 开头的二进制文件;否则,您将使用以 ocl 开头的版本。该目录还将包含许多示例哈希值和字典以及示例 shell 脚本,您可以使用这些脚本来确保您的库和驱动程序已安装到位。例如,这是 oclHashcat-plus 软件提供的用于破解 64 位系统上的 phpass 哈希的示例


cat example.dict | ./oclHashcat-plus64.bin -m 400 example400.hash

这是我在我的测试平台上对 32 位版本运行该示例时命令输出的样子


cat example.dict | ./oclHashcat-plus32.bin -m 400 example400.hash
oclHashcat-plus v0.06 by atom starting...

Hashes: 1
Unique salts: 1
Unique digests: 1
Bitmaps: 8 bits, 256 entries, 0x000000ff mask, 1024 bytes
Rules: 1
GPU-Loops: 128
GPU-Accel: 16
Password lengths range: 1 - 15
Platform: AMD compatible platform found 
Watchdog: Temperature limit set to 90c  
Device #1: Cayman, 2048MB, 0Mhz, 22MCU
Device #1: Allocating 52MB host-memory
Device #1: Kernel ./kernels/4098/m0400.Cayman.32.kernel (274238 bytes)
                                                                    
Starting attack in wordlist stdin mode...

$H$9y5boZ2wsUlgl2tI6b5PrRoADzYfXD1:hash234
                                    
Status.......: Cracked
Input.Mode...: Piped
Hash.Target..: $H$9y5boZ2wsUlgl2tI6b5PrRoADzYfXD1
Hash.Type....: phpass, MD5(Wordpress), MD5(phpBB3)
Time.Running.: 1 sec
Time.Util....: 1008.2ms/0.0ms Real/CPU, 0.0% idle
Speed........:    65009 c/s Real,   619.7k c/s GPU
Recovered....: 1/1 Digests, 1/1 Salts   
Progress.....: 65543
Rejected.....: 0
HW.Monitor.#1:  0% GPU, 47c Temp

Started: Mon Dec  5 21:12:03 2011
Stopped: Mon Dec  5 21:12:04 2011

在这种情况下,密码是 hash234。对于所有的 hashcat 命令,只需打开一个终端并切换到您解压缩的目录,然后从那里本地运行命令即可。在命令输出的开头,您将能够看到该软件可以检测到哪些 GPU。如果您正在使用多个 GPU(即使它们没有链接),它应该会自动找到它们。如果它找不到您的 GPU,您将需要重新检查您安装专有驱动程序和额外库的方式。

字典攻击

您应该尝试的第一个攻击是字典攻击。通过字典攻击,您向破解软件提供一个包含可能密码的字典,例如英语词典中的所有单词。然后,破解软件会尝试每个字典单词,直到找到与您的哈希值匹配的单词。由于字典攻击中的组合数量比暴力破解攻击少得多,因此字典攻击完成得更快。例如,当我第一次研究这篇文章时,我让暴力破解攻击针对一组示例哈希值运行了几天,而没有破解其中一个。我能够在一分钟内通过字典攻击破解五个哈希值中的三个。

要使用 oclHashcat-plus 运行字典攻击,首先使用 --help 参数运行该命令。这将为您提供与您要破解的哈希算法相对应的数字。就 phpass 而言,该数字是 400。然后,再次运行该命令,并使用 -m 选项指定要使用的密码哈希值,使用 -o 选项指定存储恢复的密码的文件,然后列出包含您的哈希值的文件以及您要用作字典的文件。这是针对 phpass 哈希值的示例字典攻击


/path/to/oclHashcat-plus32.bin -m 400 -o recovered_hashes 
 ↪example400.hash example.dict

如果我有多个字典,我可以在命令行上列出所有字典,甚至可以使用 shell glob。字典攻击的质量取决于它的字典,但是在网上有很多好的密码字典可供使用,您可以通过快速搜索“密码破解词表”来找到它们。

计算破解速度

在我详细讨论暴力破解攻击之前,重要的是要学习如何估计特定的暴力破解攻击需要多长时间。通过暴力破解攻击,您不仅仅是浏览单词字典,您实际上是在尝试一组字符的所有可能组合。在研究这篇文章时,我浪费了几天时间尝试对一个八个字符的密码进行暴力破解攻击,直到我最终进行了计算并意识到这是完全不切实际的。

第一步是弄清楚您的硬件可以多快地破解特定类型的哈希值。您会发现,您的硬件每秒可以执行的比较次数会因哈希类型而异,因此启动一个示例暴力破解攻击,使其运行足够长的时间以获得一些进度输出,然后按 Ctrl-c 退出。在我的例子中,因为我使用的是 oclHashcat-plus,所以我需要从 hashcat.net 下载并解压缩 maskprocessor 软件,以便它与 oclHashcat-plus 结合使用,可以对 phpass 进行暴力破解(现在不用担心命令语法,我稍后会讨论具体细节)


/path/to/mp32.bin -1 ?d?l?u ?1?1?1?1?1?1 | \
/path/to/oclHashcat-plus32.bin -m 400 \
-o recovered_hashes phpass-hashes

oclHashcat-plus v0.06 by atom starting...

Hashes: 6
Unique salts: 6
Unique digests: 6
Bitmaps: 8 bits, 256 entries, 0x000000ff mask, 1024 bytes
Rules: 1
GPU-Loops: 128
GPU-Accel: 16
Password lengths range: 1 - 15
Platform: AMD compatible platform found 
Watchdog: Temperature limit set to 90c  
Device #1: Cayman, 2048MB, 0Mhz, 22MCU  
Device #1: Allocating 264MB host-memory 
Device #1: Kernel ./kernels/4098/m0400.Cayman.32.kernel (274238 bytes)

Starting attack in wordlist stdin mode...

Status.......: Running
Input.Mode...: Piped
Hash.Type....: phpass, MD5(Wordpress), MD5(phpBB3)
Time.Running.: 10 secs
Time.Util....: 10001.4ms/180.8ms Real/CPU, 1.8% idle
Speed........:   315.3k c/s Real,   351.4k c/s GPU
Recovered....: 0/6 Digests, 0/6 Salts   
Progress.....: 3153920
Rejected.....: 0
HW.Monitor.#1: 96% GPU, 54c Temp

需要注意的输出行是以 Speed 开头的行。从该输出中可以看出,我的 GPU 每秒可以进行大约 350,000 次比较,因此我将在其余的计算中使用这个数字。

我发现一个用于进行破解估计的好网站是 http://www.lockdown.co.uk/?pg=combi。该网站描述了各种不同的字符集和密码长度,它描述了从单个 Pentium CPU 到神话般的政府超级计算机可能需要多长时间才能暴力破解所有组合。否则,计算非常简单。只需取出字符集中的字符数(例如,所有小写字母等于 26),然后算出您想要暴力破解的密码长度,然后将第一个数字提高到第二个数字的幂。

例如,所有混合大小写的字母数字字符 (A–Za–z0–9) 等于 62 个字符。如果我想暴力破解一个六个字符的密码,那就是 626 = 570 亿种组合。

如果您将 570 亿种组合除以一个每秒可以进行 350,000 次比较的系统,您将得到大约 45 个小时才能完成暴力破解攻击。这还不错,但是让我们对八个字符的密码进行相同的计算:628 = 218 万亿种组合。

以每秒 350,000 次比较的速度,我需要大约 7,200 天或 19 年才能完成攻击。从好的方面来说,再花 250 美元,我就可以在不到 10 年的时间内完成攻击!如果您将符号添加到您的暴力破解攻击中,该数字将跃升至 7.2 千万亿种组合,或大约 652 年。

暴力破解攻击

一旦您确定暴力破解攻击是否会在您的有生之年完成,下一步就是运行 maskprocessor 并告诉它要生成哪种类型的单词列表。默认情况下,maskprocessor 命令支持许多常见的字符集,带有以下符号

  • ?d = 所有十进制数字 (0–9)。

  • ?l = 小写字符 (a–z)。

  • ?u = 大写字符 (A–Z)。

  • ?s = 符号。

您还可以使用 -1 (或 -2, -3) 定义自定义字符集,然后使用 ?1 来使用该自定义集合。例如,如果我想枚举所有由小写字符和数字组成的三字符密码,我可以输入


/path/to/mp32.bin -1 ?d?l ?1?1?1
000
001
. . .
zzy
zzz

在我的暴力破解攻击示例中,我想遍历六字符密码中大写字母、小写字母和数字的所有组合。生成的 maskprocessor 命令将是


/path/to/mp32.bin -1 ?d?l?u ?1?1?1?1?1?1

然后,我会将该命令的输出通过管道传递给 oclHashcat-plus


/path/to/mp32.bin -1 ?d?l?u ?1?1?1?1?1?1 | \
/path/to/oclHashcat-plus32.bin -m 400 \
-o recovered_hashes phpass-hashes

与我的字典攻击一样,-m 选项指定我要破解 phpass 哈希,-o 列出我要存储恢复的哈希的文件,最后,我指定包含要破解的 phpass 哈希的文件。在我的硬件上,完全运行上述暴力破解攻击大约需要两天时间。

现在你应该准备好开始破解了,但你会发现,密码破解的世界可能会变得非常密集,非常迅速。在本系列的下一篇也是最后一篇文章中,我将讨论如何调整上述攻击以获得更好的性能,以及如何将字典攻击和暴力破解攻击结合起来,以获得两全其美的效果。

资源

Hashcat: http://hashcat.net

密码恢复速度: http://www.lockdown.co.uk/?pg=combi

密码照片 via Shutterstock.com

Kyle Rankin 是 Linux Journal 的技术编辑和专栏作家,也是 Purism 的首席安全官。 他是 Linux Hardening in Hostile Networks, DevOps Troubleshooting, The Official Ubuntu Server Book, Knoppix Hacks, Knoppix Pocket Reference, Linux Multimedia HacksUbuntu Hacks 的作者,也是其他 O'Reilly 书籍的撰稿人。 Rankin 经常在 BsidesLV、O'Reilly Security Conference、OSCON、SCALE、CactusCon、Linux World Expo 和 Penguicon 等会议上发表关于安全和开源软件的演讲。 您可以在 @kylerankin 关注他。

加载 Disqus 评论