John the Ripper 规则

Wordlist规则语法

每个wordlist规则由可选的规则拒绝标志和一个或多个简单命令组成,这些命令都列在一行中,可以选择用空格分隔。还有一个预处理器,它为单个源代码行生成多个规则。下面是对规则拒绝标志、规则命令(其中许多与Crack 5.0a中的命令兼容)和预处理器语法的描述。

规则拒绝标志

-: no-op: 不拒绝
-c 拒绝此规则,除非当前哈希类型是区分大小写的
-8 拒绝此规则,除非当前哈希类型使用8位字符
-s 拒绝此规则,除非一些密码散列在加载时被分割
-p 拒绝此规则,除非当前允许词对命令

数值常量和变量

数值常量可以指定,变量可以用以下字符引用:

0...9 为0…9
A...Z 为10…35
* 为最大长度
- 为最大长度-1
+ 为最大长度+ 1
a...k 用户定义的数值变量(使用“v”命令)
l 初始或更新的单词长度(当使用“v”时更新)
m 首字母或记忆单词最后一个字符的位置
p 用”/“或”%”命令最后找到的字符的位置
z “无限”位置或长度(超过字尾)

这里max_length是当前哈希类型所支持的最大明文长度。

这些参数可用于指定字符位置、子字符串长度和其他数值参数,以便根据给定命令对命令进行规则处理。字符位置从0开始编号。例如,初始值“m”(最后字符位置)比初始值“l”(长度)小1。

字符类

?? 匹配”?”
?v 匹配元音:“aeiouAEIOU”
?c 匹配辅音:“bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ”
?w 匹配空格:空格和水平制表字符
?p 匹配标点:“。,:,“? !和双引号字符
?s 匹配符号” $ % ^ & *()_ + = | \ < >[]{}# @ / ~”
?l 匹配小写字母[a-z]
?u 匹配大写字母[A-Z]
?d 匹配的数字[0 - 9]
?a 匹配字母[a-zA-Z]
?x 匹配字母和数字[a-zA-Z0-9]
?z 匹配所有字符

类的补码可以通过其名称的大写来指定。例如,“?D”匹配除了数字之外的所有内容。

简单的命令

: no-op:对输入单词不做任何操作
l 转换为小写字母
u 转换成大写
c 大写
C 第一个字母小写,其余字母大写
t 单词中所有字符的切换大小写
TN 字符在N位置的切换情况
r 反转:“Fred”->“derF”
d 复制:“Fred”->“FredFred”
f 反射:“Fred”->“FredderF”
{ 向左旋转单词“jsmith”->“smithj”
} 向右旋转单词:“smithj”->“jsmith”
$X 将字符X附加到单词
^X 在单词前加上字符X

字符串命令

AN"STR" 将字符串STR插入到单词的N位置

要追加一个字符串,指定“z”作为位置。若要在单词前面加上字符串,请指定“0”作为位置。

虽然使用双引号有利于提高可读性,但您可以使用STR中没有的任何其他字符。当STR包含双引号字符时,这特别有用。没有办法在字符串中转义您所选择的引号字符(防止它结束字符串和命令),但是您可以通过逐个指定多个命令来实现相同的效果。例如,如果您选择使用正斜杠作为您的引号字符,但它碰巧出现在一个字符串中,而您不想重新考虑您的选择,您可以写入“Az/yes/$/Az/no/”,它将附加字符串“yes/no”。当然,为了达到同样的效果,使用“Az,yes/no”会更简单、更有效。

长度控制命令

<N 拒绝该单词,除非它的长度小于N个字符
>N 拒绝该单词,除非它的长度大于N个字符
'N 以N的长度截断该单词

英语语法命令

p 复数形式:“crack”->“crack”等(仅限小写)
P “crack” -> “cracked”等(仅限小写)
I “crack” -> “cracking”等(仅限小写)

插入/删除命令

[ 删除第一个字符
] 删除最后一个字符
DN 删除位置N中的字符
xNM 从位置N中提取至多M个字符的子字符串
iNX 在N位置插入字符X,然后右移其他字符
oNX 用字符X覆盖位置N的字符

另外,请参阅下面“内存访问命令”下面的“X”命令(提取和插入子字符串)。

注意,方括号(“[“和”]”)是预处理程序的特殊字符:如果使用这些命令,应该使用反斜杠(“")对它们进行转义。

字符集转换命令

S 转换例子:”Crack96” -> “cRACK(^”
V 小写元音,大写辅音:”Crack96” -> “Crack96”
R 按键盘将每个字符右移:“Crack96”->“Vtsvl07”
L 按键盘左移每个字符:”Crack96” -> “Xeaxj85”

内存访问命令

M 记忆单词(用于与“Q”、“X”连用,或更新“m”)
Q 查询内存并拒绝该单词,除非它已经改变
XNMI 从内存中提取子字符串NM并插入到当前字I中

如果“Q”或“X”没有在“M”之前使用,他们就会从“word”开始读。换句话说,您可以假设在每个规则的开头都有一个隐含的“M”,并且没有必要在规则的开头使用“M”(因为“M”将是一个no-op)。“M”唯一合理的用法是在规则的中间,在一些命令可能修改了这个词之后。

“Q”命令的预期用途是帮助避免多个类似规则可能导致的重复候选密码。例如,如果您的规则集中有规则“l”(小写),并且您想添加规则“lr”(小写和反向),那么您可以将后者写成“lMrQ”,以避免产生重复的回文候选密码。

“X”命令从内存(或者从从未使用过“M”的初始单词)中提取一个子字符串,从位置N开始(在已记忆的或初始单词中),最多提取M个字符。它将子串插入到当前字的位置i。目标位置可以是“z”用于附加子串,“0”用于在字前面加上子串,或者它可以是任何其他有效的数值常量或变量。一些示例使用,假设我们在一个规则或一个“M”后,将“X011”(重复第一个字符),“Xm1z”(重复最后一个字符),“dX0zz”(一式三份)这个词,”< 4 x011x113x215”(重复每个字符在短单词),“> 9 x5zx05z”(旋转长单词5个字符,留下的一样“> 9 {{{{{> 9 vam4xa50’l“),(向右旋转5字符,一样“> 9}}}}}”)。

数字命令

vVNM 更新“l”(长度),然后从N中减去M,赋值给变量V

“l”被设置为当前单词的长度,并且它的新值可以被这个命令使用(如果N或/和M也是“l”)。

V必须是a到k中的一个。N和M可以是任何有效的数值常量或初始化的变量。在同一个命令中多次甚至三次引用同一个变量是可以的。例如,“va00”和“vaaa”都将变量“a”设置为零(但是后者将要求“a”之前已经初始化),而“vil2”将变量“i”设置为当前单词的长度减2。如果在单词被进一步修改之前使用“i”作为字符位置,它将指从末尾开始的第二个字符。中间变量值变为负数是可以的,但是这些值不应该直接用作位置或长度。例如,如果在同一规则中稍后的某个地方使用“vj02vjij”遵循“vil2”,则将“j”设置为“i”加2,或者设置为该规则中较早处理“vil2”命令时单词的长度。

字符类命令

sXY 将单词中的所有字符X替换为Y
s?CY 将单词中所有C类字符替换为Y
@X 从单词中清除所有字符X
@?C 从单词中清除类C的所有字符
!X 如果单词包含字符X,则拒绝该单词
!?C 如果单词包含类C中的字符,则拒绝该单词
/X 拒绝该单词,除非它包含字符X
/?C 拒绝该单词,除非它包含类C中的字符
=NX 拒绝该单词,除非位置N的字符等于X
=N?C 拒绝该单词,除非N位置的字符在类C中
(X 拒绝该单词,除非它的第一个字符是X
(?C 拒绝该单词,除非它的第一个字符在类C中
)X 拒绝该单词,除非它的最后字符是X
)?C 拒绝该单词,除非它的最后一个字符在类C中
%NX 拒绝该单词,除非它至少包含X的N个实例
%N?C 拒绝该单词,除非它包含至少N个类C字符

额外的单一破解模式命令

在定义“single crack”模式规则时,可以使用额外的命令来支持单词对,以控制其他命令是否应用于第一个、第二个或两个单词:
1 仅限第一个单词
2 仅限第二个单词
+ 两者的连接(只能在“1”或“2”之后使用)

如果您在规则中使用了上面的一些命令,它将只处理单词对(例如,来自GECOS字段的全名)并拒绝单个单词。除非您手动指定,否则在使用这些命令的任何规则的末尾都假设有一个“+”。例如,“1l2u”将把第一个单词转换为小写,第二个单词转换为大写,并将两者连接起来。“+”的用法可能是应用更多的命令:“1l2u+r”将在分别对两个单词应用一些命令之后,逆转这两个单词的连接。

预处理程序规则

预处理器用于将类似的规则合并到一个源代码行中。例如,如果您需要让John尝试添加数字的小写单词,您可以为每个数字编写一条规则,总共10条规则。现在想象一下附加两位数——配置文件将变得又大又难看。

使用预处理器,您可以更容易地完成这些工作。只需编写一个源代码行,其中包含这些规则的公共部分,后面是将放在不同规则中的字符列表,用方括号表示(在regexp中使用的方法)。然后,预处理器将为您生成规则(在John startup时用于语法检查,在崩溃时再次生成,但不会将所有扩展的规则保存在内存中)。对于上面的示例,源代码行是“l$[0-9]”(小写并附加一个数字)和“l$[0-9]$[0-9]”(小写并附加两个数字)。这些源代码行将分别扩展为10条和100条规则。顺便说一下,预处理命令是从右到左处理的,而字符列表是从左到右处理的,这导致了上述示例和其他典型情况中的数字的自然排序。注意,字符范围和字符列表的任意组合都是有效的。例如,”[aeiou]”将使用元音字母,而”[aeiou -9]”将使用元音字母和数字。如果您需要John尝试元音后面跟所有其他字母,您可以使用“[aeiua -z]”——预处理器足够聪明,在这种情况下不会产生重复规则(尽管这种行为可能会被下面描述的“\r”魔术转义序列禁用)。

规则中有一些特殊字符(“[”启动一个预处理器字符列表,“-”标记列表中的一个范围,等等),如果你想把它们放在规则中而不使用它们的特殊含义,你应该在它们前面加上反斜杠(“\”)。当然,这同样适用于“\”本身。另外,如果您需要在一行的最开始开始一个预处理器字符列表,那么您必须在它前面加上一个“:”(no-op规则命令),否则它将被视为一个新的节的开始。

最后,预处理器支持一些魔术转义序列。这些字符以反斜杠开始,并使用通常不需要转义的字符。在下面描述转义的段落中,单词“range”指的是像上面所示的用方括号括起来的字符列表和/或范围的单一实例。

当前支持的是“\1”到“\9”,用于对之前范围的反向引用(这些将被当前替换所引用范围的相同字符所替代,其范围编号为1,从左到右),“\0”用于反向引用前一个范围,“\p”用于前一个范围,使该范围与前一个范围“并行”处理,“\p1”到“\p9”用于与特定的引用范围“并行”处理该范围,”\p0”使该范围与前面的范围”并行”处理,”\r”使该范围产生重复字符。“\r”转义只有在区域与另一个区域“并行”或至少有一个区域与此区域“并行”时才有用,因为您不应该希望实际产生重复的规则。

本文章首发在 网安wangan.com 网站上。

上一篇 下一篇
讨论数量: 0
只看当前版本


暂无话题~