Rule-based Attack
基于规则的攻击是最为复杂的攻击之一。这样说的原因很简单。基于规则的攻击就像是设计用于产生候选密码的编程语言。例如,它有用于修改、切断、扩展单词的函数,有用于跳过某些单词的条件操作。这些特性使它成为最为灵活、精确和有效的攻击模式。
为何要重复造轮子?很简单啊,正则表达式太慢了。通常,我们不得不在赶在hash算法开始之前——10ms内,生成1,000,000,000或更多的新鲜候选密码,而且这一过程要一再重复。只需看一眼你的GPU速度显示就知道该如何决定。
hashcat的规则引擎中,只要函数名和John the Ripper和PasswordsPro规则引擎中的函数名是一样的,那么该函数便是100%兼容的,反之亦然。稍后,我们会介绍一些我们自己和、不兼容的函数。但这些函数有他们自己的名字不会产生冲突。
下列函数100%兼容于John the Ripper和PasswordsPro:
NameFunctionDescriptionExample RuleInput WordOutput WordNoteNothing:什么都不做:p@ssW0rdp@ssW0rdLowercasel将所有字母转为小写lp@ssW0rdp@ssw0rdUppercaseu将所有字母转为大写up@ssW0rdP@SSW0RDCapitalizec大写首字母,小写其余部分cp@ssW0rdP@ssw0rdInvert CapitalizeC小写首字母,大写其余部分Cp@ssW0rdp@SSW0RDToggle Caset改变单词中所有字母的大小写tp@ssW0rdP@SSw0RDToggle @TN改变单词中,第N个字母的大小写T3p@ssW0rdp@sSW0rd*Reverser反转整个单词rp@ssW0rddr0Wss@pDuplicated重复整个单词dp@ssW0rdp@ssW0rdp@ssW0rdDuplicate NpN在单词后再重复N遍此单词p2p@ssW0rdp@ssW0rdp@ssW0rdp@ssW0rdReflectf在单词后重复一遍反转的单词fp@ssW0rdp@ssW0rddr0Wss@pRotate Left{将整个单词循环左移一位{p@ssW0rd@ssW0rdpRotate Right}将整个单词循环右移一位}p@ssW0rddp@ssW0rAppend Character X|在单词后边添加一个字符| 1p@ssW0rdp@ssW0rd1Prepend Character^X在单词前面添加一个字符^1p@ssW0rd1p@ssW0rdTruncate left[删除第一个字符[p@ssW0rd@ssW0rdTrucate right]删除最后一个字符]p@ssW0rdp@assW0rDelete @ NDN删除第N个位置上的字符D3p@ssW0rdp@sW0rd*Extract rangexNM取从N开始的M个字符x04p@ssW0rdp@ss # Omit rangeONM删除从N开始的M个字符O12p@ssW0rdpsW0rd*Insert @ NiNX在位置N插入一个字符i4!p@ssW0rdp@ss!W0rd*Overwrite @ NoNX用X重写位置N的字符o3 |p@ssW0rd|p@s W0rd*Truncate @ N‘N在位置N前截断单词‘6p@ssW0rdp@ssW0*ReplacesXY用Y替换所有Xss$p@ssW0rdp@$$W0rdPurge@X清除所有X@sp@ssW0rdp@W0rd+Duplicate first NzN重复第一个字符N次z2p@ssW0rdppp@ssW0rdDuplicate last NZN重复最后一个字符N次Z2p@ssW0rdp@ssW0rdddDuplicate allq重复每个字符qp@ssW0rdpp@@ssssWW00rrddExtract memoryXNMI在位置I处插入存储在内存中的词的从N开始的长度为M的子串lMX428p@ssW0rdp@ssw0rdw0+Append memory4将保存在内存中的词添加到当前词后面uMl4p@ssW0rdp@ssw0rdP@SSW0RD+Prepend memory6将保存在内存中的词添加到当前词前面rMr6p@ssW0rddr0Wss@pp@ssW0rd+MemorizeM将当前词保存到内存中lMuX084p@ssW0rdP@SSp@ssw0rdW0RD+- *代表N从0开始。超过9的字符位置用A-Z来表示(A-10) - +代表这条规则仅仅在hashcat中实现了 - #在oclHashcat v1.37→v1.38和hashcat v0.51→v0.52之间有所变动
译者注:“改变单词中所有字母的大小写”的“改变大小写”原文为“toggle case”。怎么个改变法?大写变小写,小写变大写,如输入为abCdE,输出则为ABcDe。
译者注:uMl4中包含4个函数:u、M、l、4。u函数将输入的p@ssW0rd转换为P@SSW0RD,M函数将P@SSW0RD存储到内存中,l函数将输入(也即是M函数的输出,为P@SSW0RD)中所有大写字母转为小写,输出为p@ssw0rd,4函数的输入是p@ssw0rd,将内存中的词(P@SSW0RD)添加到当前词(即输入)的后面,输出为p@ssw0rdP@SSW0RD。lMX428、rMr6和lMuX084同理。
注意:丢弃规则仅仅在hashcat-legacy或是使用“-j”、“-k”的hashcat中有效。在hashcat中,丢弃规则不会作为常规规则(在规则文件中的)而发生效力。
译者注:回文字符串是指形如“aaabbcbbaaa”这样正着反着读一模一样的字符串。
下列函数在John the Ripper或是PasswordsPro中是无效的:
*代表N从0开始。超过9的字符位置用A-Z来表示(A-10)+仅仅在John the Ripper中有效?#在测试版或未正式发行版中有效书写规则最重要的事情是搞清楚你想写什么。这通常意味着你必须分析十几个明文密码,而这些明文密码是被习惯设置的,来总结有什么共同之处。例如,人们常常在他们的密码后添加数字以增加密码长度。所以,我们便总结出了一下两个“要素”:
我们想在后边添加些什么想添加在后边的是数字回顾下函数列表,我们会发现在后边添加些什么应该使用函数“$”。所以,如果我们想在密码后添加“1”,我们应该写出这样的规则:
$1这确实很简单。但如果我们想添加1-9的所有数字呢?这就要用到一种叫做混合攻击的模式了。
需要注意:
如果不是被用作参数,空白字符将被忽略。这会使源码看上去整齐些。用字符“#”开头表示注释一行有两种方式自动地生成规则。
使用maskprocessor,这里有专门的文章讨论这一话题:Using maskprocessor to create rules使用随机规则,见下文这是hashcat独有的特性。你可以使用hashcat生成直接作用于当下命令的随机规则。当你已经尝试过作用于你的所有字典的所有规则后若是不知道接下来要干什么,这便是一件好事情。有三种配置参数:
让hashcat生成应用于每个攻击的NUM条规则:
--generate-rules=NUM要指定函数数量(最小值到最大值的一个范围)则应该使用:
--generate-rules-func-min=NUM --generate-rules-func-max=NUM这个数量虽然没有限制但也不推荐设置得过大。当和参数-g一起使用时,超过-g参数指定数目的规则将被忽略。
例如,随机产生的规则可能是:“l r”、“l ^f”和“sa@”,这些都是能够使用的有效的规则。然而,规则“l ^f sa@ r $3”将被忽略,因为它包含了5个函数,而默认情况下,最小值为1,最大值为4。
你可以将随机生成的规则和规则文件中的规则混合。例如,你的规则文件中包含了200条规则,使用参数-g 500,则会生成另外的300条规则。
译者注:这一段是有些莫名其妙的。输入命令:echo p@ssW0rd > word,再输入命令:hashcat –stdout –generate-rules=10 word,看看输出,可能会有所悟。
这一功能和规则生成器结合使用将带来极大的方便,也可用于统计分析你的规则集合。
使用这些参数以保存任意的匹配密码的规则:
--debug-mode=1 --debug-file=matched.rule这将保存每个匹配中相匹配的规则,所以结果规则文件中可能包含许多重复规则。
使用hashcat我们可以容易地调试规则。这意味着可以验证我们写的规则实际上是不是我们想要的。只需使用参数–stdout同时忽略hashlist就行。
这有个例子:
创建一个简单的字典:
$ echo WORd > word生成一个简单的规则,规则“c”将大写第一个字母,小写其余部分。
$ echo c > rule接着便是如何查看规则生成器的调试输出了:
$ ./hashcat-cli64.bin -r rule --stdout word Word这一特性也可用于快速生成候选密码。这意味着如果你有别的支持从标准输入读数据的程序,则可直接将hashcat的输出作为别的程序的输入。
位置码字符“p”(看看Github上的讨论:点这儿)记录指定字符第N次出现的位置,这使得字符串中的位置也可被用在规则中。当使用“%”(丢弃某文本,除非它中出现了指定字符至少X次)和“/”(丢弃不包含指定字符的文本)时,“p”自动生效。
如果你想操作第一次出现的指定字符,你可以使用%1s或者更简单地使用’/’:
$ echo -n 'Odessa77' | hashcat --stdout -j '%1s Dp ip$' Ode$sa77 $ echo -n 'Odessa77' | hashcat --stdout -j '/s Dp ip$' Ode$sa77如果你想操作第二次出现的指定字符:
$ echo -n 'Odessa77' | hashcat --stdout -j '%2s Dp ip$' Odes$a77等等等等。不像替换所有指定字符的“s”规则,这允许你选择替换指定字符中的哪几个。
注意,只有在命令行参数“-j”和“-k”中,位置码字符“p”才有效。
在下面的例子中,规则中的“%2s”的意思是丢弃某文本除非它含有两个“s”,“p”的意思是操作第二次出现的字符“s”。
NameFunctionDescriptionExample RuleInput WordOutput WordNoteToggle @Tp改变位置p字符的大小写%2s Tpp@s.sW0rdp@s.SW0rdDelete @ pDp删除位置p的字符%2s Dpp@s.sW0rdp@s.W0rdExtract rangexpM从位置p开始取M个字符%2s xp4p@s.sW0rdsW0rOmit rangeOpM从位置p开始删除M个字符%2s Op2p@s.sW0rdp@s.0rdInsert @ pipX在位置p插入字符X%2s ip!p@s.sW0rdp@s.!sW0rdOverwrite @ popX用字符X覆盖位置p的原有字符%2s op |p@s.sW0rd|p@s. W0rdTruncate @ p‘p从位置p前截断单词%2s ‘pp@s.sW0rdp@s.Extract memoryXpMI在位置I处插入存储在内存中的词的从p的长度为M的子串%2s lMXp28p@s.sW0rdp@s.sw0rswdSwap @ p*pM交换p与M处的字符%2s *p4p@s.sW0rdp@s.sW0rdBitwise shift leftLp按位循环左移位置p处的字符%2s Lpp@s.sW0rdp@s.▒W0rdBitwise shift rightRp按位循环右移位置p处的字符%2s Rpp@s.sW0rdp@s.9W0rdASCII increment+p位置p处的字符的ascii码值加1%2s +pp@s.sW0rdp@s.tW0rdASCII decrement-p位置p处的字符的ascii码值减1%2s -pp@s.sW0rdp@s.rW0rdReplace p + 1.p用p+1处的字符替换p处的字符%2s .pp@s.sW0rdp@s.WW0rdReplace p - 1,p用p-1处的字符替换p处的字符%2s ,pp@s.sW0rdp@s..W0rd在hashcat-legacy或hashcat中看规则/的示例。
从oclHashcat-plus v0.07开始,基于规则的攻击中添加了一个新特性。
你可以随心所欲地添加多个-r参数,不再是以前的只能有一个-r参数或一个规则文件。
他们不是顺序执行的!
每个规则文件中的规则都会和另一个规则文件中的规则相组合。这就使得你可以容易地创造自己的攻击模式。
$ cat 123.rule $1 $2 $3 $ cat abc.rule $a $b $c $ hashcat --stdout -r 123.rule -r abc.rule wordlist hashcat1a hashcat2a hashcat3a hashcat1b hashcat2b hashcat3b hashcat1c hashcat2c hashcat3c因为生成规则的总数取决于所有列表,所以若是叠加多个大列表,可用内存将会很快耗光。但是,叠加精心选择的规则将会有很好的效果。
目前支持这种攻击模式的有:
hashcathashcat-legacy在hashcat中,单行规则中函数数量和多规则中函数总量的上限均为255。