# | Mode |
---|---|
0 | Straight |
1 | Combination |
3 | Brute-force |
6 | Hybrid Wordlist + Mask |
7 | Hybrid Mask + Wordlist |
這一攻擊模式又名“Dictionary Attack”。沒(méi)啥好說(shuō)的,就是給定一個(gè)字典,hashcat會(huì)逐行讀取字典中的內(nèi)容,計(jì)算每行的hash值,與目標(biāo)hash值相比較。
示例:
hashcat -a 0 -m 400 example400.hash example.dict
百度告訴我,Combination是名詞,意為:“結(jié)合; 聯(lián)合體; 密碼組合; 連褲內(nèi)衣”。這一攻擊模式其實(shí)很簡(jiǎn)單,就是組合兩個(gè)密碼字典的內(nèi)容。使用這一攻擊模式需要不多不少地指定兩個(gè)密碼字典。假設(shè)我們有兩個(gè)密碼字典dict1.txt和dict2.txt,其內(nèi)容分別為:
hunting kitty rainbow
和
paris rock
則命令:
hashcat -m 0 -a 1 hash.txt dict1.txt dict2.txt
實(shí)際上嘗試的字典是:
huntingparis huntingrock kittyparis kittyrock rainbowparis rainbowrock
dict1.txt中的詞在左、dict2.txt中的詞在右,共3×2=6個(gè)。
與這一模式相關(guān)的參數(shù)有:
-j, --rule-left -k, --rule-right
-j后的規(guī)則作用于左邊,-k后的規(guī)則作用于右邊,如添加參數(shù) -j ‘$-‘,則實(shí)際嘗試的字典便是:
hunting-paris hunting-rock kitty-paris kitty-rock rain-bowparis rain-bowrock
添加參數(shù) -j ‘^!’,則實(shí)際嘗試的字典便是:
!huntingparis !huntingrock !kittyparis !kittyrock !rainbowparis !rainbowrock
添加參數(shù) -k ‘^>’,則實(shí)際嘗試的字典便是:
hunting>paris hunting>rock kitty>paris kitty>rock rain>bowparis rain>bowrock
這個(gè)規(guī)則是什么規(guī)則呢?“$”、“^”的用法和正則表達(dá)式相似,所以是正則嗎?其實(shí)不是啦,hashcat的規(guī)則是自己實(shí)現(xiàn)的,這又是一大塊內(nèi)容了,詳情參見(jiàn)Rule-based Attack
嘗試給定字符集的各種各樣的組合。根據(jù)hashcat官方wiki,該方法已經(jīng)過(guò)時(shí),被Mask-Attack全方位取代,故不做研究,
這是一種比較新穎的攻擊方式,示例如下:
hashcat -a 3 -m 0 md5.hash ?l?l?l?l?l
雖然按照“Attack Modes”表,-a 3對(duì)應(yīng)的是Brute-force,但實(shí)際上,-a 3使用的就是Mask Attack。Mask Attack可以看做高級(jí)的Brute-force。
-m參數(shù)用于指定hash函數(shù)類型,md5.hash文件中存放著md5值。關(guān)鍵便是最后的字符串“?l?l?l?l?l”了,這樣的字符串被稱為mask。
一個(gè)mask是一個(gè)字符串,這個(gè)字符串由若干個(gè)占位符組成?!?l”便是一個(gè)占位符,其中的“?”是關(guān)鍵字,用于修飾其后的“l(fā)”,“?l”合起來(lái)表示一個(gè)字符集合,除“?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”其實(shí)等價(jià)于密碼字典:
aaaaa aaaab ... zzzzz
同理,“?l?u?d”便等價(jià)于密碼字典:
aA0 aA1 ... bA0 ... zZ9
上表中的字符集合是hashcat內(nèi)置的,我們也可以自己指定字符集合:
--custom-charset1=字符集合1 --custom-charset2=字符集合2 --custom-charset3=字符集合3 --custom-charset4=字符集合4
參數(shù) –custom-charsetN 可以縮寫(xiě)為 -N,如 –custom-charset1 可以縮寫(xiě)為 -1。用 -N 指定的字符集合在mask中以占位符“?N”的形式指定,如:
-1 abc123 ?1?1?1
便等價(jià)于密碼字典:
aaa aab ... aa3 ... 333
-N 后除了接表示字符集合的字符串外,還可以是一個(gè)以.hcchr結(jié)尾的文件,文件中存儲(chǔ)著字符集合。hashcat自帶了許多.hcchr文件,在安裝包的charsets/目錄中。
占位符“??”代表的字符集合是“?”本身。除此之外,其余的字符作為占位符時(shí),代表的都是字符本身,如“?lwerner?d”等價(jià)于密碼字典:
awerner0 awerner1 ... zwerner9
有了以上知識(shí),便很容易理解mask了。一個(gè)mask由若干個(gè)占位符組成,每個(gè)占位符是一個(gè)字符集合,一個(gè)mask便是各個(gè)占位符字符集合的組合。占位符的個(gè)數(shù)和密碼的長(zhǎng)度相等。這樣的設(shè)計(jì),比起單純得給定字符集合和密碼長(zhǎng)度來(lái),有何好處呢?
假設(shè)我們已知某人的密碼共7位,第一位是大寫(xiě)字母,接下來(lái)3位是小寫(xiě)字母,最后3位是數(shù)字。若是傳統(tǒng)的暴力破解,需要字符集a-z、A-Z和0-9,共62個(gè)字符,最多需要嘗試62^7=3 521 614 606 208次,是萬(wàn)億級(jí)別的。而用mask描述這個(gè)密碼,則是“\u\l\l\l\d\d\d”,容易計(jì)算,共有(26^4)×(10^3)=456 976 000種可能,是億級(jí)別的,比前一種方法減少了4個(gè)數(shù)量級(jí)。
退一步講,就算我們不知道密碼的分布,用mask也很容易模擬出傳統(tǒng)暴力破解的效果來(lái)。
現(xiàn)在的問(wèn)題便是mask是固定的,其中有多少個(gè)占位符是寫(xiě)死的,若是我們不知道密碼的長(zhǎng)度,該怎么辦。密碼太長(zhǎng)也就罷了,若是人家的密碼只有3位,我們的占位符有4個(gè),怎么都解不出,豈不是很虧。難道要從1開(kāi)始,將各個(gè)長(zhǎng)度的mask都寫(xiě)一遍?那多麻煩啊。
有兩種解決方法,一是使用mask文件,在一個(gè)文件中寫(xiě)多個(gè)mask,然后在命令行中指明這個(gè)文件就行。注意,mask文件需以.hcmask結(jié)尾。
如test.hcmask的內(nèi)容為:
?l ?l?l ?l?l?l ?l?l?l?l
則用如下命令使用該文件:
hashcat -m 0 -a 3 --show md5.hash test.hcmask
另一種解決方法是添加參數(shù) –increment,這參數(shù)告訴hashcat,按我們給出的mask,從一個(gè)占位符開(kāi)始嘗試,再嘗試兩個(gè)的,三個(gè)的,直到我們給定的長(zhǎng)度。如我們寫(xiě)這一的占位符“abc”,然后計(jì)算下列字符串的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
“:”前是要計(jì)算hash值的原字符串,“:”后是計(jì)算出的hasn值。將上述內(nèi)容保存在文件md5.hash中,然后運(yùn)行如下命令:
hashcat -m 0 -a 3 --show --username md5.hash abc
加參數(shù) –username 是由于我們的每個(gè)hash值前都有原字符串,若不加此參數(shù),hashcat會(huì)顯示沒(méi)有找到正確的hash值,加此參數(shù),hashcat便會(huì)以為hash值前的字符串是該hash值對(duì)于的用戶名,從而能順利載入hash值。
運(yùn)行結(jié)果是只解出了一條hash:
900150983cd24fb0d6963f7d28e17f72:abc
現(xiàn)在加上參數(shù) –increment,再次運(yùn)行:
hashcat -m 0 -a 3 --show --increment --username md5.hash abc
這次,又解出了兩條hash:
0cc175b9c0f1b6a831c399e269772661:a 187ef4436122d1cc2f40dc2b92f0eba0:ab
可見(jiàn),–increment 發(fā)揮了作用。但同時(shí),我們也知道了,有此參數(shù),hashcat只會(huì)按順序地嘗試a、ab和abc,并不會(huì)亂序地對(duì)占位符排列組合,嘗試各種可能。
Hybrid Attack是和Combinator Attack是差不多的,Combinator Attack是將兩個(gè)字典進(jìn)行組合,而Hybrid Attack是將一個(gè)字典和一個(gè)mask進(jìn)行雜交,兩者是差不多的。
假設(shè)我們已經(jīng)有了一個(gè)字典example.dict,內(nèi)容如下:
hello werner
則命令:
hashcat -m 0 -a 6 md5.hash example.dict ?d?d
等價(jià)于單純地使用字典:
hello00 hello01 ... hello99 werner00 werner01 ... werener99
則命令:
hashcat -m 0 -a 7 md5.hash ?d? dexample.dict
等價(jià)于單純地使用字典:
00hello 01hello ... 99hello 00werner 01werner ... 99werener