[译]hashcat之基于规则的攻击
原文
译文
描述
基于规则的攻击是最为复杂的攻击之一。这样说的原因很简单。基于规则的攻击就像是设计用于产生候选密码的编程语言。例如,它有用于修改、切断、扩展单词的函数,有用于跳过某些单词的条件操作。这些特性使它成为最为灵活、精确和有效的攻击模式。
为何不使用正则表达式
为何要重复造轮子?很简单啊,正则表达式太慢了。通常,我们不得不在赶在hash算法开始之前——10ms内,生成1,000,000,000或更多的新鲜候选密码,而且这一过程要一再重复。只需看一眼你的GPU速度显示就知道该如何决定。
和其他规则引擎的兼容性
hashcat的规则引擎中,只要函数名和John the Ripper和PasswordsPro规则引擎中的函数名是一样的,那么该函数便是100%兼容的,反之亦然。稍后,我们会介绍一些我们自己和、不兼容的函数。但这些函数有他们自己的名字不会产生冲突。
实现了的兼容函数
下列函数100%兼容于John the Ripper和PasswordsPro:
Name | Function | Description | Example Rule | Input Word | Output Word | Note |
---|---|---|---|---|---|---|
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 @ | TN | 改变单词中,第N个字母的大小写 | T3 | p@ssW0rd | p@sSW0rd | * |
Reverse | r | 反转整个单词 | r | p@ssW0rd | dr0Wss@p | |
Duplicate | d | 重复整个单词 | d | p@ssW0rd | p@ssW0rdp@ssW0rd | |
Duplicate N | pN | 在单词后再重复N遍此单词 | p2 | p@ssW0rd | p@ssW0rdp@ssW0rdp@ssW0rd | |
Reflect | f | 在单词后重复一遍反转的单词 | f | p@ssW0rd | p@ssW0rddr0Wss@p | |
Rotate Left | { | 将整个单词循环左移一位 | { | p@ssW0rd | @ssW0rdp | |
Rotate Right | } | 将整个单词循环右移一位 | } | p@ssW0rd | dp@ssW0r | |
Append Character | $X | 在单词后边添加一个字符 | $1 | p@ssW0rd | p@ssW0rd1 | |
Prepend Character | ^X | 在单词前面添加一个字符 | ^1 | p@ssW0rd | 1p@ssW0rd | |
Truncate left | [ | 删除第一个字符 | [ | p@ssW0rd | @ssW0rd | |
Trucate right | ] | 删除最后一个字符 | ] | p@ssW0rd | p@assW0r | |
Delete @ N | DN | 删除第N个位置上的字符 | D3 | p@ssW0rd | p@sW0rd | * |
Extract range | xNM | 取从N开始的M个字符 | x04 | p@ssW0rd | p@ss | * # |
Omit range | ONM | 删除从N开始的M个字符 | O12 | p@ssW0rd | psW0rd | * |
Insert @ N | iNX | 在位置N插入一个字符 | i4! | p@ssW0rd | p@ss!W0rd | * |
Overwrite @ N | oNX | 用X重写位置N的字符 | o3$ | p@ssW0rd | p@s$W0rd | * |
Truncate @ N | ‘N | 在位置N前截断单词 | ‘6 | p@ssW0rd | p@ssW0 | * |
Replace | sXY | 用Y替换所有X | ss$ | p@ssW0rd | p@$$W0rd | |
Purge | @X | 清除所有X | @s | p@ssW0rd | p@W0rd | + |
Duplicate first N | zN | 重复第一个字符N次 | z2 | p@ssW0rd | ppp@ssW0rd | |
Duplicate last N | ZN | 重复最后一个字符N次 | Z2 | p@ssW0rd | p@ssW0rddd | |
Duplicate all | q | 重复每个字符 | q | p@ssW0rd | pp@@ssssWW00rrdd | |
Extract memory | XNMI | 在位置I处插入存储在内存中的词的从N开始的长度为M的子串 | lMX428 | p@ssW0rd | p@ssw0rdw0 | + |
Append memory | 4 | 将保存在内存中的词添加到当前词后面 | uMl4 | p@ssW0rd | p@ssw0rdP@SSW0RD | + |
Prepend memory | 6 | 将保存在内存中的词添加到当前词前面 | rMr6 | p@ssW0rd | dr0Wss@pp@ssW0rd | + |
Memorize | M | 将当前词保存到内存中 | lMuX084 | p@ssW0rd | P@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同理。
丢弃文本的规则
Name | Function | Description | Example Rule | Note |
---|---|---|---|---|
Reject less | <N | 丢弃长度小于N的 | <16 | |
Reject greater | >N | 丢弃长度大于N的 | >8 | |
Reject equal | _N | 丢弃长度不小于N的 | _7 | |
Reject contain | !X | 丢弃包含字符X的 | !z | |
Reject not contain | /X | 丢弃不包含字符X的 | /e | |
Reject equal first | (X | 丢弃不以字符X开头的 | (h | |
Reject equal last | )X | 丢弃不以字符X结尾的 | )t | |
Reject equal at | =NX | 丢弃位置N不是字符X的 | =1a | |
Reject contains | %NX | 丢弃字符X出现次数小于N次的 | %2a | |
Reject contains | Q | 若当前词与内存中存储相匹配则丢弃 | rMrQ | 本例用于丢弃回文字符串 |
注意:丢弃规则仅仅在hashcat-legacy或是使用“-j”、“-k”的hashcat中有效。在hashcat中,丢弃规则不会作为常规规则(在规则文件中的)而发生效力。
译者注:回文字符串是指形如“aaabbcbbaaa”这样正着反着读一模一样的字符串。
实现了的特有函数
Name | Function | Description | Example Rule | Input Word | Output Word | Note |
---|---|---|---|---|---|---|
Swap front | k | 交换前两个字符 | k | p@ssW0rd | @pssW0rd | |
Swap back | K | 交换最后面两个字符 | K | p@ssW0rd | p@ssW0dr | |
Swap @ N | *NM | 交换M和N位置的字符 | *34 | p@ssW0rd | p@sWs0rd | * |
Bitwise shift left | LN | 对处于N位置的字符进行按位循环左移 | L2 | p@ssW0rd | p@æsW0rd | * |
Bitwise shift right | RN | 对处于N位置的字符进行按位循环右移 | R2 | p@ssW0rd | p@9sW0rd | * |
Ascii increment | +N | 将处于N位置的字符的ascii码值加1 | +2 | p@ssW0rd | p@tsW0rd | * |
Ascii decrement | -N | 将处于N位置的字符的ascii码值减1 | -1 | p@ssW0rd | p?ssW0rd | * |
Replace N + 1 | .N | 用N+1位置的字符替换N位置的字符 | .1 | p@ssW0rd | psssW0rd | * |
Replace N – 1 | ,N | 用N-1位置的字符替换N位置的字符 | ,1 | p@ssW0rd | ppssW0rd | * |
Duplicate block front | yN | 重复最开始的N个字符 | y2 | p@ssW0rd | p@p@ssW0rd | * |
Duplicate block back | YN | 重复最后面的N个字符 | Y2 | p@ssW0rd | p@ssW0rdrd | * |
Title | E | 先将整行都小写,然后大写空格后的字符和行首的字符 | E | p@ssW0rd w0rld | P@ssw0rd W0rld | + |
Title w/separator | eX | 先将整行都小写,然后大写指定字符后的字符和行首的字符 | e- | p@ssW0rd-w0rld | P@ssw0rd-W0rld | + |
下列函数在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”(第N个指定的字符)作为位置规则
位置码字符“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”。
Name | Function | Description | Example Rule | Input Word | Output Word | Note |
---|---|---|---|---|---|---|
Toggle @ | Tp | 改变位置p字符的大小写 | %2s Tp | p@s.sW0rd | p@s.SW0rd | |
Delete @ p | Dp | 删除位置p的字符 | %2s Dp | p@s.sW0rd | p@s.W0rd | |
Extract range | xpM | 从位置p开始取M个字符 | %2s xp4 | p@s.sW0rd | sW0r | |
Omit range | OpM | 从位置p开始删除M个字符 | %2s Op2 | p@s.sW0rd | p@s.0rd | |
Insert @ p | ipX | 在位置p插入字符X | %2s ip! | p@s.sW0rd | p@s.!sW0rd | |
Overwrite @ p | opX | 用字符X覆盖位置p的原有字符 | %2s op$ | p@s.sW0rd | p@s.$W0rd | |
Truncate @ p | ‘p | 从位置p前截断单词 | %2s ‘p | p@s.sW0rd | p@s. | |
Extract memory | XpMI | 在位置I处插入存储在内存中的词的从p的长度为M的子串 | %2s lMXp28 | p@s.sW0rd | p@s.sw0rswd | |
Swap @ p | *pM | 交换p与M处的字符 | %2s *p4 | p@s.sW0rd | p@s.sW0rd | |
Bitwise shift left | Lp | 按位循环左移位置p处的字符 | %2s Lp | p@s.sW0rd | p@s.▒W0rd | |
Bitwise shift right | Rp | 按位循环右移位置p处的字符 | %2s Rp | p@s.sW0rd | p@s.9W0rd | |
ASCII increment | +p | 位置p处的字符的ascii码值加1 | %2s +p | p@s.sW0rd | p@s.tW0rd | |
ASCII decrement | -p | 位置p处的字符的ascii码值减1 | %2s -p | p@s.sW0rd | p@s.rW0rd | |
Replace p + 1 | .p | 用p+1处的字符替换p处的字符 | %2s .p | p@s.sW0rd | p@s.WW0rd | |
Replace p – 1 | ,p | 用p-1处的字符替换p处的字符 | %2s ,p | p@s.sW0rd | p@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
因为生成规则的总数取决于所有列表,所以若是叠加多个大列表,可用内存将会很快耗光。但是,叠加精心选择的规则将会有很好的效果。
支持
目前支持这种攻击模式的有:
- hashcat
- hashcat-legacy
限制
在hashcat中,单行规则中函数数量和多规则中函数总量的上限均为255。