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