众所周知,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提供了一种动态的“自我描述”格式(又称动态表达式编译器)。这其实就是一种模式,在这种模式下,用户无需通过编程,就可以描述计算密码哈希值的公式。
比方说,我们得到了密码的哈希值:
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”。
在这个例子中,我们是用自己的公式来计算哈希值的,但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