John the Ripper使用指南,第6部分:如何破解非标准的哈希值(上)

2021-04-26 13,243

如何破解基于MD5、SHA1和其他原始哈希算法的迭代、盐化和任意哈希值

众所周知,John the Ripper和Hashcat能够破解使用各种密码哈算法生成的哈希值。其中,John the Ripper支持的哈希值类型列表,可以通过下面的命令进行查看:  

john --list=formats

要查看Hashcat软件所支持的哈希值类型,请参阅http://en.kali.tools/?p=155页面中的相关介绍,或者参考该程序自身提供的帮助信息:  

hashcat -h

如您所见,这两个程序所支持的哈希算法都非常的丰富。

哈希算法分类

哈希算法的类型可以分为以下几组:  

  • 原始算法(md2, md4, md5, sha1, sha224, sha256, sha384, sha512, tiger, sha3_224, sha3_256, sha3_384, sha3_512, keccak_256, keccak_512, ripemd128, ripemd160, ripemd256, ripemd320, whirlpool, gost, skein224, skein256, skein384, skein512, panama, haval_128_3, haval_128_4, haval_128_5, haval_160_3, haval_160_4, haval_160_5, haval_192_3, haval_192_4, haval_192_5, haval_256_3, haval_256_4, haval_256_5). These are independent hashing algorithms, checksum calculations

  • 加盐算法。这种类型的算法基于原始哈希算法,但会向密码字符串中加入盐,例如:md5($pass.$salt)

  • 迭代算法。这种类型的算法也是基于原始哈希算法,但哈希算法的结果会再次被哈希化,并且这种处理可能会发生多次。例如:  

 md5($salt.sha1($salt.$pass))

除了这些主要类型外,哈希算法还可以根据其应用领域来进行分类:

  • 身份验证

  • 网络协议

  • 操作系统

  • 数据库服务器

  • FTP、HTTP、SMTP、LDAP服务器

  • 企业应用软件(EAS)

  • 全磁盘加密

  • 文档

  • 密码管理器

  • 归档

  • 网络应用(论坛、CMS、电子商务)

在这些分类中,有些哈希值是独立的,也就是说,它们是用自己的算法计算出来的,但更为常见的情况下,特别是在网络应用中,以哈希值形式存储密码的操作系统中,通常会使用基于原始哈希算法的加盐算法和迭代算法,例如:

  sha1($s.sha1($s.sha1($p)))

 sha1($s.sha1($p))

 sha256(sha256($p).$s)

对于流行的应用程序来说,它们使用的哈希算值类型通常会被添加到John the Ripper和Hashcat软件的支持列表中,因此,我们其实根本就不需要知道它们是用哪种算法来计算哈希值的。

但想象一下这种情况,当我们从一个高度专业化的程序中收到了一个哈希值后,发现这个哈希值是按照以下算法计算的,例如:MD5(md5(md5($p).$s).$s2)。但在John the Ripper和Hashcat软件中,都没有对这种算法(这种类型的哈希值)提供相应的支持,这时候该咋办呢?

实际上,本文就是专门用于回答上述问题的——我们将学习如何破解用原始算法、加盐算法和迭代算法计算的哈希值。

下面是与本文关系较为密切的一些文章:  

  • l How to identify hash types

  • l Hash-generation software

John the Ripper的动态格式

John the Ripper提供了一种动态的“自我描述”格式(又称动态表达式编译器)。这其实就是一种模式,在这种模式下,用户无需通过编程,就可以描述计算密码哈希值的公式。

比方说,我们得到了密码的哈希值:  

838c9416a8d094b7e660a0f3b12e3e543c71f7f4

以及用于这个哈希值的盐:  

mial

通过逆向工程,发现哈希值是用以下公式计算得到的:  

sha1(md5(sha512($p.$s).$p).$s)

我们需要把该哈希值写到一个文件中,其格式如下所示:  

HASH$SALT

也就是说,哈希值和盐是用美元符号($)分隔开来的。

下面,让我们来创建一个名为hash.txt的文件,并写入如下所示的内容:

838c9416a8d094b7e660a0f3b12e3e543c71f7f4$mial

现在,让我们创建一个小型的词典,将其命名为wordlist.txt,并向其中写入下列信息:

123

hackware

123567890

123456

111111111111111111

通过下面所示的命令,我们就能利用这个字典来进行蛮力破解:  

john -form=dynamic='sha1(md5(sha512($p.$s).$p).$s)' --wordlist=wordlist.txt hash.txt

掩码攻击:  

john -form=dynamic='sha1(md5(sha512($p.$s).$p).$s)' --mask='?l?l?l?l?l?l?l?l' hash.txt

最后,密码被成功破解了,它就是“hackware”。

1.png

在这个例子中,我们是用自己的公式来计算哈希值的,但John the Ripper其实提供了许多内置的动态格式。此外,您还可以在配置文件中写入自己的动态格式,并通过指定的名称来使用它,而不是每次都要输入公式。接下来,我们将为读者介绍该软件内置的各种格式,以及编写动态格式的相关语法。

为了理解内置格式的记号,我们需要了解相关的语法——所以,我们不妨先从编写自定义动态格式的语法开始讲起。

动态格式语法

该表达式必须是单个加密哈希计算表达式。这意味着最后一步是计算一次哈希值,而不是串联在一起的多个哈希计算。也就是说,md5($p)是合法的,但md5($p).md5($p)是非法的。

此外,串联字符串时,其间必须有一个“.”(点)字符。因此,md5($p.$p)是合法的,而md5($p$s)是非法的。

变量:

  • 变量$p或$pass表示候选密码。

  • 变量$s或$salt用作“盐”常量。

  • 变量$s2用于第二个盐常量。

  • 变量$u用于用户ID(这是输入文件的第一个字段)

  • 变量$c1到$c8。这些变量表示“常数”。请记住,它们必须按顺序使用,也就是说,如果想创建常数$c2,那么你必须已经创建了常数$c1。因此,对于md5($s.$c1.$p.$c1),如果c1=x,那么我们将得到md5($s."x".$p."x")。

改变字母的大小写(注意:改变字母的大小写只适用于某些情况)。

  • lc($u) 表示小写的用户名(正确的小写Unicode)

  • uc($u) 表示大写的用户名(同样,正确的大写Unicode)

  • lc($p) 和 uc($p) 用于小写/大写密码。

重要提示:如果一个表达式中使用了uc($u)或lc($u),那么所有的$u必须以同样的方式进行处理。这条规定也适用于密码。因此,md5($u.$p.$)是合法的,但md5(uc($u).$p.$u)是非法的。这是一般动态格式的一个限制。

当使用常量时,它们必须被添加到表达式的末尾,并用逗号分隔。重要的是:如果在常量中使用符号":"(冒号),那么它们必须以十六进制形式书写。例如:md5($c1.$p),如果c1=test\x3a_test,则得到md5("test:_test".$p)。

下面一节将专门讨论容易导致问题的符号。现在,我们顺便提一句,实际上有一个叫做raw2dyna的工具(包含在John the Ripper软件包中)。要想将任何字符串转换为十六进制,请使用-2h选项,例如,下面的命令将打印冒号对应的十六进制符号:  

raw2dyna -2h=':'

$HEX$3a

实际上,我们没有必要对整个字符串进行编码;相反,我们可以上面介绍的方法对单个字符进行编码。

同一程序,但是使用-2r选项的话,就可以将十六进制表示形式转换为原始数据:  

raw2dyna -2r='3a'

对于经常导致问题的符号将在下面讨论,关于辅助工具将单独进行讨论。

小结

在本文中,我们为读者详细介绍了如何破解非标准的哈希值,由于篇幅过长,分为上下两部分。更多精彩内容,敬请期待!


(未完待续)


本文作者:mssp299

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/158025.html

Tags:
评论  (0)
快来写下你的想法吧!

mssp299

文章数:51 积分: 662

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号