Hashcat教程:利用“规则”破解密码
Hashcat号称是世界上最快的密码破解软件,可调用GPU进行密码破解,早在Hashcat 4.x版本就宣称可破解256个字符长度的密码,而且支持上百种算法,基本市面上所有的算法都支持。
Hashcat中有一种很强大的基于规则的攻击方式,利用不同的“规则”,可产生大量用来破解的密码,大大扩充破解字典,而且这些“规则”可以交叉利用,利用一些简单的字典就可衍生出大量复杂但规律的密码以方便破解。
如果你还不知道Hashcat的基础知识,可以看看我以前写过的Hashcat Tutorial – The basics of cracking passwords with hashcat。这篇文章将介绍一些hashcat规则编写知识。
规则编写基础知识
只要有效利用Hashcat的规则,就可对长度超过8个字符的密码进行高效破解,但是,尝试编写自己的规则可能会令人生畏。因为它太过灵活,可配置性很高,需要了解很多知识。官方提供了一些规则的说明,在此我也会提供一些自己的总结。
基础和调试
我们要做的第一件事就是学习如何测试我们自己编写的规则。首先,创建一个包含spring
的简单字典:
echo spring> dict.txt
创建一个新文件,这将是我们的规则文件(我命名为test.rule)。在规则文件中输入c
并保存。注意,c
规则将单词的第一个字母大写,其余字母小写,因此spring应该成为Spring。测试如下:
hashcat64.exe -r test.rule --stdout dict.txt
Spring
以下是某些规则的基本说明:
基础
Nothing | : | do nothing | : | p@ssW0rd | p@ssW0rd |
---|---|---|---|---|---|
Lowercase | l | 字母全部小写 | l | p@ssW0rd | p@ssw0rd |
Uppercase | u | 字母全部大写 | u | p@ssW0rd | P@SSW0RD |
Capitalize | c | 首字母大写 | c | p@ssW0rd | P@ssw0rd |
Invert Capitalize | C | 首字母小写 | C | p@ssW0rd | p@SSW0RD |
Toggle Case | t | 互换所有字符的大小写 | t | p@ssW0rd | P@SSw0RD |
Toggle Case | TN | 切换位置n处字符的大小写 | T3 | p@ssW0rd | p@sSW0rd |
请注意其中的大写规则,如果字符串为!spring
或!SPRING
,处理后仍然是!spring
,因为这个规则对数字或特殊字符(第一个字符)没有任何作用。
Nothing | : | do nothing | : | p@ssW0rd | p@ssW0rd |
---|---|---|---|---|---|
Append Character | $X | 在末尾添加字符 | $1 | p@ssW0rd | p@ssW0rd1 |
Prepend Character | ^X | 在首部添加字符 | ^1 | p@ssW0rd | 1p@ssW0rd |
可能我们最有用的规则是将字符附加到单词的开头或结尾。让我们看看以下这个规则,它会对字典中的密码先全部小写,再在末尾追加2019:
c $2$0$1$9
其中c
和$
之间的空格只是为了便于阅读。如果在我们的test.rule
文件中保存以上规则,然后运行它,将会得到:
hashcat64.exe -r test.rule --stdout dict.txt
Spring2019
将字符添加到字符串的开头则有点不同,乍一眼可能看起来很奇怪。例如,要将123添加到单词的开头,则规则为:
^3^2^1
你需要先反转要附加的字符串。如果你将上述规则添加到规则文件中,然后运行,就可以获得123spring
。如果你想和其他规则结合起来,那么你需要非常小心。因为,如果你的规则是^3^2^1 c
,那么输出仍然是123spring
,因为此时首字符是1
。要获得123Spring
的输出,需要使用规则c ^3^2^1
。
复制
Nothing | : | do nothing | : | p@ssW0rd | p@ssW0rd |
---|---|---|---|---|---|
Duplicate | d | 字符串重复一次 | $1 | p@ssW0rd | p@ssW0rdp@ssW0rd |
Duplicate N | pN | 字符串重复N次 | p2 | p@ssW0rd | p@ssW0rdp@ssW0rdp@ssW0rd |
在需要设定很长的密码时,人们通常会通过复制来解决这个问题。而且我发现这个重复次数经常是2次或是3次,再配合上述的附加规则生成的密码往往非常有效。以下是针对“spring”一词中使用重复规则的一些示例:
c d $2$0$1$9 --> SpringSpring2019
d c $2$0$1$9 --> Springspring2019
c $2$0$1$9 d --> Spring2019Spring2019
$2$0$1$9 d c --> Spring2019spring2019
替换
Nothing | : | do nothing | : | p@ssW0rd | p@ssW0rd |
---|---|---|---|---|---|
Replace | sXY | 字符X替换为Y | ss$ | p@ssW0rd | p@$$W0rd |
你当然也可以使用替换规则替换字符。Hashcat自带的leetspeak.rule
文件有一些简单的例子,而Incisive-leetspeak.rule
文件中有更多的示例。规则ss$
会将password
转换为pa$$word
。
其他规则
还有很多其他规则可以用来构建你的字典,但上述几个应该就能解决你的大部分问题(根据我的经验)。
规则融合
下一步,我们需要对我们的规则有一个明确的要求,它通常涉及某种模式。例如,在某次破解密码的过程中,我们率先知道密码是有一个固定的格式的,例如像Spring2019那种模式,第一个字符大写,后面字符小写,最后以数字结尾,通常是年份或日期。因此,如果我们想要生成这样模式的字典,我们需要将第一个字符大写,然后追加年份。最终规则看起来就像这样:
c $2$0$1$9
运行后,我们会得到:
Spring2019
但是如果我们想要生成很多年份,而不仅仅是2019年呢?好吧,我们必须遍历写出另我们想要的年份所对应规则。它们可能看起来像下面这样:
# Example: spring --> Spring2019
c $1$9$8$1
c $1$9$8$2
c $1$9$8$3
c $1$9$8$4
c $1$9$8$5
c $2$0$1$5
c $2$0$1$6
c $2$0$1$7
c $2$0$1$8
c $2$0$1$9
但后来你又想在最后添加一个特殊字符,因为你记得人们经常也这样做,例如问号和感叹号,于是你写了更多的规则:
# Example: spring --> Spring2019!
c $1$9$8$1$!
c $1$9$8$2$!
c $1$9$8$3$!
c $1$9$8$4$!
c $1$9$8$5$!
c $2$0$1$5$!
c $2$0$1$6$!
c $2$0$1$7$!
c $2$0$1$8$!
c $2$0$1$9$!
此时,你可能会强迫自己停止思考,因为这样下去没完没了。因此,你可能需要一些自动化的方法。在继续下一章自动规则生成
前,如下是我经常使用的一些规则以及示例:
# Example: thanksgiving --> thanksgiving1234
$1$2$3$4
$1$q$a$z
$z$a$q$1
$!$@$#$$
# Example: thanksgiving --> Thanksgiving1234
c $1$2$3$4
c $1$q$a$z
c $z$a$q$1
c $!$@$#$$
# Example: winter --> WinterWinter!
c d $!
# Example: winter --> Winter!Winter!
c $! d
# Example: winter --> Winterwinter!
d $! c
# Example: winter --> Winter!winter!
$! d c
请记住,通常我还会创建上述规则的许多变种,例如在前面添加字符等。
自动生成规则
脚本规则生成 - date_rule.py
利用脚本去生成脚本通常是在明确知道所需的规则类型的情况下,为了减轻手动操作,节约时间而执行的操作。
我自己编写了一个脚本文件,能将各种格式的日期附加到每个规则中,并且还能在每个字符串的开头或结尾添加字符。我能使用包括00-99,0101-13131,010180-12312019甚至01011980-12312019中的所有内容,同时又排除不是日期的数字,最后还拥有足够的灵活性。我把这个脚本放在date_rule.py。
我不会在此深入代码的工作原理,你只需知道它能构建一个复杂的规则文件,使得最后生成的密码既包含日期,又有指定的字符串。
以上这些只需要一点创造力和编程能力即可完成。如果你不擅长编程,那就从现在开始锻炼吧。
规则生成器——Maskprocessor
Hashcat团队中的某个开发人员开发了一个名为maskprocessor
的工具,可以让你轻松创建复杂的规则文件。可以点击这里下载。
我们可以通过Maskprocessor
利用掩码的方式帮助我们编写混合了众多规则的规则文件。下面是如何使用maskprocessor生成规则文件的示例,最后生成的规则文件的具体作用分别是:1.为字典中的每个密码的结尾附加一个任意字符(列出所有情况);2.为字典中的每个密码的结尾附加两个任意字符(列出所有情况);3. 在结尾附加一个任意字符,两个任意字母或特殊字符(列出所有情况)
mp64.exe -o test.rule "$?a"
mp64.exe -o test.rule "$?a $?a"
mp64.exe -o test.rule -1 ?s?d "$?a $?1 $?1"
现在我们执行的基于规则的攻击,相当于同时运行三种不同的攻击。
此时基于规则的攻击:
hashcat64.exe -a 0 -m 0 md5_hashes.txt wordlist.txt -r test_rule.rule
等效于下面的三种攻击:
hashcat64.exe -a 6 -m 0 md5_hashes.txt wordlist.txt ?a
hashcat64.exe -a 6 -m 0 md5_hashes.txt wordlist.txt ?a?a
hashcat64.exe -a 6 -m 0 md5_hashes.txt wordlist.txt -1 ?s?d ?a?1?1
虽然看起来更加简洁了,但它并没有赋予我们新能力。但是,我们还是可以发现它有两种非常重要的能力:
1)我们可以在密码的两侧放置掩码。例如,假设您想要将数字(?d)添加到字符串的开头,将任何字符(?a)添加到结尾,包括所有情况。生成这种规则的命令如下:
mp64.exe -o test1.rule "^?d $?a"
2)你还想让字符串的首字母大写吗?以下是生成规则文件的命令:
mp64.exe -o test1.rule "c ^?d $?a"
也许你还想先首字母大写,再复制一次,然后在开头添加数字,最后在结尾添加任何字符,生成这样的规则文件的命令如下:
mp64.exe -o test1.rule "c d ^?d $?a"
你可以进行你想要的任何操作,当然,产生的规则越多,攻击所需的时间就越长。以下是我最喜欢的几个规则生成命令(注意:可能需要很长时间):
mp64.exe -o jake.rule "c $?a"
mp64.exe -o jake.rule "c $?a $?a"
mp64.exe -o jake.rule -1 ?s?d "c $?a $?1 $?1"
mp64.exe -o jake.rule "c $?d $?d $?d"
mp64.exe -o jake.rule "c $?d $?d $?d $?d"
mp64.exe -o jake.rule "c $?d $?d $?d $?d $?d"
mp64.exe -o jake.rule "c $?d $?d $?d $?d $?d $?d"
mp64.exe -o jake.rule "c $?d $?d $?d $?d $?s"
mp64.exe -o jake.rule -1 ?s?d "c ^?1"
mp64.exe -o jake.rule -1 ?s?d "c ^?1 $?a"
mp64.exe -o jake.rule -1 ?s?d "c $?1 $?d $?d $?1"
mp64.exe -o jake.rule -1 ?s?d "c $?1 $?d $?d $?d $?d"
在接下来的文章中,我将介绍一些优化暴力破解的方法。感谢你的阅读!
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://laconicwolf.com/2019/03/29/hashcat-tutorial-rule-writing/
最新评论