hashcat的几种攻击模式

0.introduction

hashcat有多种攻击模式,用参数–help查看完整帮助,可以看到“Attack Modes”表,如下所示:

# Mode
0 Straight
1 Combination
3 Brute-force
6 Hybrid Wordlist + Mask
7 Hybrid Mask + Wordlist

1.Straight

这一攻击模式又名“Dictionary Attack”。没啥好说的,就是给定一个字典,hashcat会逐行读取字典中的内容,计算每行的hash值,与目标hash值相比较。

示例:

  hashcat -a 0 -m 400 example400.hash example.dict

2.Combination

百度告诉我,Combination是名词,意为:“结合; 联合体; 密码组合; 连裤内衣”。这一攻击模式其实很简单,就是组合两个密码字典的内容。使用这一攻击模式需要不多不少地指定两个密码字典。假设我们有两个密码字典dict1.txt和dict2.txt,其内容分别为:

  hunting
  kitty
  rainbow

  paris
  rock

则命令:

  hashcat -m 0 -a 1 hash.txt dict1.txt dict2.txt

实际上尝试的字典是:

  huntingparis
  huntingrock
  kittyparis
  kittyrock
  rainbowparis
  rainbowrock

dict1.txt中的词在左、dict2.txt中的词在右,共3×2=6个。

与这一模式相关的参数有:

  -j, --rule-left
  -k, --rule-right

-j后的规则作用于左边,-k后的规则作用于右边,如添加参数 -j ‘$-‘,则实际尝试的字典便是:

  hunting-paris
  hunting-rock
  kitty-paris
  kitty-rock
  rain-bowparis
  rain-bowrock

添加参数 -j ‘^!’,则实际尝试的字典便是:

  !huntingparis
  !huntingrock
  !kittyparis
  !kittyrock
  !rainbowparis
  !rainbowrock

添加参数 -k ‘^>’,则实际尝试的字典便是:

  hunting>paris
  hunting>rock
  kitty>paris
  kitty>rock
  rain>bowparis
  rain>bowrock

这个规则是什么规则呢?“$”、“^”的用法和正则表达式相似,所以是正则吗?其实不是啦,hashcat的规则是自己实现的,这又是一大块内容了,详情参见Rule-based Attack,或是我翻译的hashcat之基于规则的攻击

3.Brute-force

尝试给定字符集的各种各样的组合。根据hashcat官方wiki,该方法已经过时,被Mask-Attack全方位取代,故不做研究,

4.Mask Attack

这是一种比较新颖的攻击方式,示例如下:

  hashcat -a 3 -m 0 md5.hash ?l?l?l?l?l

虽然按照“Attack Modes”表,-a 3对应的是Brute-force,但实际上,-a 3使用的就是Mask Attack。Mask Attack可以看做高级的Brute-force。

-m参数用于指定hash函数类型,md5.hash文件中存放着md5值。关键便是最后的字符串“?l?l?l?l?l”了,这样的字符串被称为mask。

一个mask是一个字符串,这个字符串由若干个占位符组成。“?l”便是一个占位符,其中的“?”是关键字,用于修饰其后的“l”,“?l”合起来表示一个字符集合,除“?l”外,还可以有“?u”、“?d”、“?h”、“?H”、“?s”、“?a”和“?b”,代表的字符集合如下表所示。

? Charset
l abcdefghijklmnopqrstuvwxyz
u ABCDEFGHIJKLMNOPQRSTUVWXYZ
d 0123456789
h 0123456789abcdef
H 0123456789ABCDEF
s ! “#$%&'()*+,-./:;<=>?@[\]^_`~{|}
a ?l?u?d?s
b 0x00 – 0xff

这样,我们便明白了,“?l?l?l?l?l”其实等价于密码字典:

aaaaa
aaaab
...
zzzzz

同理,“?l?u?d”便等价于密码字典:

  aA0
  aA1
  ...
  bA0
  ...
  zZ9

上表中的字符集合是hashcat内置的,我们也可以自己指定字符集合:

  --custom-charset1=字符集合1
  --custom-charset2=字符集合2
  --custom-charset3=字符集合3
  --custom-charset4=字符集合4

参数 –custom-charsetN 可以缩写为 -N,如 –custom-charset1 可以缩写为 -1。用 -N 指定的字符集合在mask中以占位符“?N”的形式指定,如:

  -1 abc123 ?1?1?1

便等价于密码字典:

  aaa
  aab
  ...
  aa3
  ...
  333

-N 后除了接表示字符集合的字符串外,还可以是一个以.hcchr结尾的文件,文件中存储着字符集合。hashcat自带了许多.hcchr文件,在安装包的charsets/目录中。

占位符“??”代表的字符集合是“?”本身。除此之外,其余的字符作为占位符时,代表的都是字符本身,如“?lwerner?d”等价于密码字典:

  awerner0
  awerner1
  ...
  zwerner9

有了以上知识,便很容易理解mask了。一个mask由若干个占位符组成,每个占位符是一个字符集合,一个mask便是各个占位符字符集合的组合。占位符的个数和密码的长度相等。这样的设计,比起单纯得给定字符集合和密码长度来,有何好处呢?

假设我们已知某人的密码共7位,第一位是大写字母,接下来3位是小写字母,最后3位是数字。若是传统的暴力破解,需要字符集a-z、A-Z和0-9,共62个字符,最多需要尝试62^7=3 521 614 606 208次,是万亿级别的。而用mask描述这个密码,则是“\u\l\l\l\d\d\d”,容易计算,共有(26^4)×(10^3)=456 976 000种可能,是亿级别的,比前一种方法减少了4个数量级。

退一步讲,就算我们不知道密码的分布,用mask也很容易模拟出传统暴力破解的效果来。

现在的问题便是mask是固定的,其中有多少个占位符是写死的,若是我们不知道密码的长度,该怎么办。密码太长也就罢了,若是人家的密码只有3位,我们的占位符有4个,怎么都解不出,岂不是很亏。难道要从1开始,将各个长度的mask都写一遍?那多麻烦啊。

有两种解决方法,一是使用mask文件,在一个文件中写多个mask,然后在命令行中指明这个文件就行。注意,mask文件需以.hcmask结尾。

如test.hcmask的内容为:

  ?l
  ?l?l
  ?l?l?l
  ?l?l?l?l

则用如下命令使用该文件:

  hashcat -m 0 -a 3 --show md5.hash test.hcmask

另一种解决方法是添加参数 –increment,这参数告诉hashcat,按我们给出的mask,从一个占位符开始尝试,再尝试两个的,三个的,直到我们给定的长度。如我们写这一的占位符“abc”,然后计算下列字符串的md5值:

  a:0cc175b9c0f1b6a831c399e269772661
  b:92eb5ffee6ae2fec3ad71c777531578f
  c:4a8a08f09d37b73795649038408b5f33
  ab:187ef4436122d1cc2f40dc2b92f0eba0
  ac:e2075474294983e013ee4dd2201c7a73
  ba:07159c47ee1b19ae4fb9c40d480856c4
  bc:5360af35bde9ebd8f01f492dc059593c
  ca:5435c69ed3bcc5b2e4d580e393e373d3
  cb:d0d7fdb6977b26929fb68c6083c0b439
  abc:900150983cd24fb0d6963f7d28e17f72
  abc:900150983cd24fb0d6963f7d28e17f72
  bac:79ec16df80b57696a03bb364410061f3
  bca:b64eab8ce39e013604e243089c687e4f
  cba:3944b025c9ca7eec3154b44666ae04a0
  cab:16ecfd64586ec6c1ab212762c2c38a90

“:”前是要计算hash值的原字符串,“:”后是计算出的hasn值。将上述内容保存在文件md5.hash中,然后运行如下命令:

  hashcat -m 0 -a 3 --show --username md5.hash abc

加参数 –username 是由于我们的每个hash值前都有原字符串,若不加此参数,hashcat会显示没有找到正确的hash值,加此参数,hashcat便会以为hash值前的字符串是该hash值对于的用户名,从而能顺利载入hash值。

运行结果是只解出了一条hash:

  900150983cd24fb0d6963f7d28e17f72:abc

现在加上参数 –increment,再次运行:

  hashcat -m 0 -a 3 --show --increment --username md5.hash abc

这次,又解出了两条hash:

  0cc175b9c0f1b6a831c399e269772661:a
  187ef4436122d1cc2f40dc2b92f0eba0:ab

可见,–increment 发挥了作用。但同时,我们也知道了,有此参数,hashcat只会按顺序地尝试a、ab和abc,并不会乱序地对占位符排列组合,尝试各种可能。

5.Hybrid Attack

Hybrid Attack是和Combinator Attack是差不多的,Combinator Attack是将两个字典进行组合,而Hybrid Attack是将一个字典和一个mask进行杂交,两者是差不多的。

假设我们已经有了一个字典example.dict,内容如下:

  hello
  werner

则命令:

  hashcat -m 0 -a 6 md5.hash example.dict ?d?d

等价于单纯地使用字典:

  hello00
  hello01
  ...
  hello99
  werner00
  werner01
  ...
  werener99

则命令:

  hashcat -m 0 -a 7 md5.hash ?d? dexample.dict

等价于单纯地使用字典:

  00hello
  01hello
  ...
  99hello
  00werner
  01werner
  ...
  99werener

发表评论

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