[译]hashcat之基于规则的攻击

原文

Rule-based Attack

译文

描述

基于规则的攻击是最为复杂的攻击之一。这样说的原因很简单。基于规则的攻击就像是设计用于产生候选密码的编程语言。例如,它有用于修改、切断、扩展单词的函数,有用于跳过某些单词的条件操作。这些特性使它成为最为灵活、精确和有效的攻击模式。

为何不使用正则表达式

为何要重复造轮子?很简单啊,正则表达式太慢了。通常,我们不得不在赶在hash算法开始之前——10ms内,生成1,000,000,000或更多的新鲜候选密码,而且这一过程要一再重复。只需看一眼你的GPU速度显示就知道该如何决定。

和其他规则引擎的兼容性

hashcat的规则引擎中,只要函数名和John the RipperPasswordsPro规则引擎中的函数名是一样的,那么该函数便是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的所有数字呢?这就要用到一种叫做混合攻击的模式了。

需要注意:

  • 如果不是被用作参数,空白字符将被忽略。这会使源码看上去整齐些。
  • 用字符“#”开头表示注释一行

生成规则

有两种方式自动地生成规则。

随机规则

这是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中,单行规则中函数数量和多规则中函数总量的上限均为255。

发表评论

电子邮件地址不会被公开。 必填项已用*标注