使用Hashcat破解外国字符构成的密码的终极指南

翻译: shan2666

原文:http://www.netmux.com/blog/ultimate-guide-to-cracking-foreign-character-passwords-using-has

0x00 问题描述

最近,在与一位新客户的合作过程中,我们在破解密码的哈希值的时候遇到了很大的麻烦。不久之后,我们获悉这些哈希值是从一些员工的工作站上面收集来的,而某些员工安装了外语输入键盘。无论是基于字典或基于规则的攻击,我们都试过了,但是仍然无法破解这些哈希值,所以,我们只好开始研究如何破解外国字符编码的哈希值。这篇文章是利用hashcat破解外国字符散列值的最终指南,希望当你碰到类似的挑战的时候,本文能给你带来帮助。

0x01 关于Hashcat

那么,Hashcat是什么呢?Hashcat是当前最强大的开源密码恢复工具,你可以访问Hashcat.net网站来了解这款工具的详细情况。本质上,Hashcat 3.0是一款高级密码恢复工具,可以利用CPU或GPU资源来攻击160多种哈希类型的密码。对于它来说,即使使用普通的CPU或GPU,每秒也能够生成1.35亿个哈希值,例如我们测试的Mac Mini机器也能达到这个速度。当然,一些怪兽级的密码破解设备,像Sagitta提供的Brutalis,每秒可以产生350亿个哈希值,当然这是针对Md4而言的。关于Hashcat的基础用法,请参考Hashcat.net网站的维基和论坛,那里有许多入门性质的介绍文章。相反,本文将着重介绍外国字符编码密码的破解方法。

0x02 关于外国字符的背景知识

对于大多数英语国家的人们来说,他们都很熟悉ASCII,因为它是原始的字符编码方法。我们知道,ASCII是使用单字节编码技术来表示各种拉丁/英文字符的,由于所有256种位组合(0000 0000 – 1111 1111)都被用于ASCII拉丁/英文字符了,所以又创建了一个新的外部字符集UTF-8来表示外国字符。我们为什么会选择UTF-8呢?因为它是Web应用程序/页面中应用最为广泛的字符编码(接近87%),并且UTF-8采用的技术同样适用于任何其他字符编码。

UTF-8字符编码技术用1到4个字节进行编码(0000 0000 – 0000 0000 0000 0000 0000 0000 0000),它将ASCII字符封装到单字节(0000 0000)中,因此在使用hashcat来猜解密码的时候,必须考虑到这种区别。举例来说,当我们处理由西里尔文字母组成的密码时,必须让hashcat使用两个字节的HEX来生成密码。在阅读下文之前,我们不妨先来观察一些ASCII字符表和UTF-8 HEX字符表,从而更清楚地了解这种区别。

ASCII HEX字符表

001

请注意观察上面“Hx”列中的大写字母“A”,它的十六进制表示形式为“41”。对于这个单字节十六进制值”41″来说,如果使用二进制表示的话,就是0100 0001。

UTF-8 HEX字符表

002

请注意观察UTF-8字符表中第三列的西里尔字母“A”,它的十六进制形式为“d0 90”,这是一个两字节的十六进制代码,如果转换为二进制的话,就是1101 0000 1001 0000。现在,你明白字符编码的区别以及在hashcat中做出相应的区别的重要性了吗? ASCII编码的字符A = 41(0100 0001),而UTF-8编码的西里尔字符A = d0 90(1101 0000 1001 0000)。如果仔细观察西里尔字母A的十六进制表示的话,你会注意到它分为两部分,d0(基本编码)和90(字符编码)。基本编码范围为d0-d4(即d0,d1,d2,d3,d4),而字符代码范围则是从a0-9f(即a0,a1,a2,a3 … 9c,9d,9e, 9f)。所以,当你利用蛮力方式破解密码时,你需要考虑到表示西里尔字符的十六进制值需要的字节数量,并覆盖相应字节内的所有的可能取值。看一下这个UTF-8 Hex字符表就会发现,表示西里尔字符的编码起始于d0 80,结束于d4 af。看到这里,许多读者可能会昏昏欲睡了,那好,在你完全睡着之前,让我们先来了解一下测试环境和hashcat的具体用法。实际上,你只要记住这里介绍的西里尔字符表示方法,同样适用于所有其他UTF-8外国字符集就行了。

0x03 搭建测试环境

步骤:1)安装外语输入法,2)创建示例密码,3)计算这些密码的MD5哈希值,4)将哈希值转换为文本文件,以及5)使用hashcat破解哈希值。

接下来,让我们搭建一个测试环境,以便通过几个简单的例子来演示如何破解UTF-8字符编码。首先,要根据你自己的操作系统,例如Windows,Mac或Linux,安装一些最常见的外语输入法和相应的键盘布局。对于Windows系统来说,具体配置方法见这里;对于Mac系统来说,具体配置方法见这里;对于Kali Linux系统来说,具体配置方法见这里。

003

在上图中,我们已经将俄语、阿拉伯语和简体中文添加到了我们的Mac键盘首选项。这样的话,在破解密码的时候,我们就能够根据密码的组成字符,在不同的键盘首选项之间轻松切换了。

004

从上图中可以看到,我们能够轻松地在任务栏的键盘输入语言之间切换。这样一来,在需要频繁切换的时候,会更加方便。启用多种语言后,Windows和Linux的任务栏也具有类似的功能。

此外,我们还可以使用HashMaker程序。有了它,我们能够将外国字符密码输入到字符串字段中,然后快速生成许多散列算法的输出,就本例来说,我们需要的是MD5值。Windows系统用户可以使用HashTab程序,而Linux用户则可以在命令行环境下面使用内置的MD5sum工具。

005

从上面的HashMaker截图中可以看到,我们输入了一个由四个西里尔字符组成的简单密码“фыва”,然后我们计算了这个字符串的MD5值,并将其放入一个名为“ru_charset.txt”的文件中。注意,我们这里将使用非常简单的、由一到四个西里尔字符组成的密码,这样能够确保在30秒到30分钟内就能破解这些哈希值。

006

从上面可以看到,我们已经创建了两个文本文件。第一个文件包含两个单字符密码(大写和小写),两个双字符密码(大写和小写),两个三字符密码(小写和大写)和两个四字符密码(大写和小写)。这里的字符你可以随意挑选,只要确保它们足够简单就行,毕竟这是我们的第一道练习题。对于第二个文件来说,你可能已经注意到了,我们这里是按照它们出现在左边的顺序将这些MD5哈希值输入到“ru_charset.txt”文件中的。将这个存放哈希值的文件“ru_charset.txt”保存到一个你可以记住的地方,因为在破解阶段我们会用到它。接下来,我们将演示如何使用正确hashcat命令行参数,通过取自UTF-8 hex字符表的定制字符集来暴力破解这些哈希值。

0x04 Hashcat用法举例

Hashcat具有良好的可扩展性,例如可以自定义字符集等。下面,让我们利用这个可定制的特性,来传递针自定义的西里尔 hex字符集,这个字符集取自我们见面介绍的字符表。 虽然Hashcat 3.0在参数要求进行了一些扩展,允许在命令行中最多使用四个自定义字符集,但我们这里只需创建两个即可。 请记住,对于UTF-8字符集中的西里尔字符来说,在使用十六进制表示的时候,实际上可以分为两部分——基本编码和字符编码,所以我们需要表示该范围所有可能的组合。这里,我们的”基本编码”定制字符集为d0d1d2d3d4,而“字符编码”定制字符集为808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf。这个字符范围将涵盖西里尔字符的所有可能的代表性组合。

下面,我们给出完整的hashcat命令行,它将对我们的UTF-8 西里尔字母组成的密码的MD5哈希值进行蛮力攻击:

./hashcat –potfile-disable -m 0 -a 3 ../ru_charset.txt –hex-charset -1 d0d1d2d3d4 -2 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf -i ?1?2?1?2?1?2?1?2

下面对Hashcat的参数进行相应的说明:

–pot-disable(我们不希望将破解的哈希值添加到hashcat的potfile中)

-m 0(设置哈希值类型,对于MD5算法来说,将其设置为0)

-a 3(设置攻击模式,这里设为3表示暴力破解)

../ru_charset.txt (保存MD5哈希值的文本文件的路径)

–hex-charset(假设字符集以十六进制值表示)

-1 d0d1d2d3d4(设置我们的第一个字符集的基本编码)

-2 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf(设置字符编码的范围)

-i ?1?2?1?2?1?2?1?2 (让hashcat根据掩码1?2?1?2?1?2?1?2对1-4个字符可能组合进行暴力猜解)

对于上面的设置来说,关键要记住将掩码设置为?1?2?1?2?1?2?1?2是针对双字节字符的,它的作用是告诉hashcat首先从1号自定义字符集和2号自定义字符集中取值,然后将它们合并。 例如,在进行暴力破解的时候,根据当前的自定义字符集来看,尝试的第一个组合很可能是“d080”(?1?2)。 下一次将会尝试“d081”,依此类推,hashcat将逐次遍历所有可能组合,直到尝试了四个字符(双字节字符)的UTF-8十六进制编码d4bcd4bdd4bed4bf(?1?2?1?2?1?2?1?2)为止。

007

从上面你可以看到,hashcat正在猜解第一个字符,并且已经成功破解了我们放入“ru_charset.txt”文件中的两个单字符密码的哈希值。这里的“ATTENTION!”警告说明这里的配置无法发挥hashcat软件强大的并行化能力, 如果你想更多地了解如何优化hashcat的配置的话,请参阅这里。

008

如上图所示,hashcat已经完成了暴力攻击,成功破解了8个哈希值,并且只花了1分30秒。需要注意的是,hashcat是以$ HEX [d0a4d0abd092d090]的格式来显示结果的。你需要将“d0a4d0abd092d090”放到编码器/解码器中,才能查看实际的西里尔字符结果。此外,如果你认为自己的终端/环境能够处理这种文本编码并能正确显示它们的话,也可以在命令行选项中启用hashcat“–outfile-autohex-disable”。我们更喜欢$ HEX […]格式,因为它可以处理任何输出形式,换句话说,这样做不容易出错。使用–outfile-autohex-disable选项的结果如下所示:

009

0x05 其他优秀文章

下面推荐一些介绍Hashcat的优秀文章:

http://blog.bitcrack.net/2013/09/cracking-hashes-with-other-language.html

https://www.troyhunt.com/our-password-hashing-has-no-clothes/

https://labs.mwrinfosecurity.com/blog/a-practical-guide-to-cracking-password-hashes/

0x06 结束语

本文到此结束,希望这篇介绍如何使用hashcat破解外国字符密码的文章能够给您带来帮助。

《使用Hashcat破解外国字符构成的密码的终极指南》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注