Hashcat教程:利用“规则”破解密码

iso60001  1842天前

22.jpg

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@ssW0rdp@ssW0rd
Lowercasel字母全部小写lp@ssW0rdp@ssw0rd
Uppercaseu字母全部大写up@ssW0rdP@SSW0RD
Capitalizec首字母大写cp@ssW0rdP@ssw0rd
Invert CapitalizeC首字母小写Cp@ssW0rdp@SSW0RD
Toggle Caset互换所有字符的大小写tp@ssW0rdP@SSw0RD
Toggle CaseTN切换位置n处字符的大小写T3p@ssW0rdp@sSW0rd

请注意其中的大写规则,如果字符串为!spring!SPRING,处理后仍然是!spring,因为这个规则对数字或特殊字符(第一个字符)没有任何作用。

Nothing:do nothing:p@ssW0rdp@ssW0rd
Append Character$X在末尾添加字符$1p@ssW0rdp@ssW0rd1
Prepend Character^X在首部添加字符^1p@ssW0rd1p@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@ssW0rdp@ssW0rd
Duplicated字符串重复一次$1p@ssW0rdp@ssW0rdp@ssW0rd
Duplicate NpN字符串重复N次p2p@ssW0rdp@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@ssW0rdp@ssW0rd
ReplacesXY字符X替换为Yss$p@ssW0rdp@$$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

33.png44.png

我不会在此深入代码的工作原理,你只需知道它能构建一个复杂的规则文件,使得最后生成的密码既包含日期,又有指定的字符串。

以上这些只需要一点创造力和编程能力即可完成。如果你不擅长编程,那就从现在开始锻炼吧。

规则生成器——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/

最新评论

昵称
邮箱
提交评论