# | Mode |
---|---|
0 | Straight |
1 | Combination |
3 | Brute-force |
6 | Hybrid Wordlist + Mask |
7 | Hybrid Mask + Wordlist |
這一攻擊模式又名“Dictionary Attack”。沒啥好說的,就是給定一個字典,hashcat會逐行讀取字典中的內容,計算每行的hash值,與目標hash值相比較。
示例:
hashcat -a 0 -m 400 example400.hash example.dict
百度告訴我,Combination是名詞,意為:“結合; 聯(lián)合體; 密碼組合; 連褲內衣”。這一攻擊模式其實很簡單,就是組合兩個密碼字典的內容。使用這一攻擊模式需要不多不少地指定兩個密碼字典。假設我們有兩個密碼字典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個。
與這一模式相關的參數(shù)有:
-j, --rule-left -k, --rule-right
-j后的規(guī)則作用于左邊,-k后的規(guī)則作用于右邊,如添加參數(shù) -j ‘$-‘,則實際嘗試的字典便是:
hunting-paris hunting-rock kitty-paris kitty-rock rain-bowparis rain-bowrock
添加參數(shù) -j ‘^!’,則實際嘗試的字典便是:
!huntingparis !huntingrock !kittyparis !kittyrock !rainbowparis !rainbowrock
添加參數(shù) -k ‘^>’,則實際嘗試的字典便是:
hunting>paris hunting>rock kitty>paris kitty>rock rain>bowparis rain>bowrock
這個規(guī)則是什么規(guī)則呢?“$”、“^”的用法和正則表達式相似,所以是正則嗎?其實不是啦,hashcat的規(guī)則是自己實現(xiàn)的,這又是一大塊內容了,詳情參見Rule-based Attack
嘗試給定字符集的各種各樣的組合。根據(jù)hashcat官方wiki,該方法已經過時,被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參數(shù)用于指定hash函數(shù)類型,md5.hash文件中存放著md5值。關鍵便是最后的字符串“?l?l?l?l?l”了,這樣的字符串被稱為mask。
一個mask是一個字符串,這個字符串由若干個占位符組成?!?l”便是一個占位符,其中的“?”是關鍵字,用于修飾其后的“l(fā)”,“?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
參數(shù) –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便是各個占位符字符集合的組合。占位符的個數(shù)和密碼的長度相等。這樣的設計,比起單純得給定字符集合和密碼長度來,有何好處呢?
假設我們已知某人的密碼共7位,第一位是大寫字母,接下來3位是小寫字母,最后3位是數(shù)字。若是傳統(tǒng)的暴力破解,需要字符集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個數(shù)量級。
退一步講,就算我們不知道密碼的分布,用mask也很容易模擬出傳統(tǒng)暴力破解的效果來。
現(xiàn)在的問題便是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
另一種解決方法是添加參數(shù) –increment,這參數(shù)告訴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
加參數(shù) –username 是由于我們的每個hash值前都有原字符串,若不加此參數(shù),hashcat會顯示沒有找到正確的hash值,加此參數(shù),hashcat便會以為hash值前的字符串是該hash值對于的用戶名,從而能順利載入hash值。
運行結果是只解出了一條hash:
900150983cd24fb0d6963f7d28e17f72:abc
現(xiàn)在加上參數(shù) –increment,再次運行:
hashcat -m 0 -a 3 --show --increment --username md5.hash abc
這次,又解出了兩條hash:
0cc175b9c0f1b6a831c399e269772661:a 187ef4436122d1cc2f40dc2b92f0eba0:ab
可見,–increment 發(fā)揮了作用。但同時,我們也知道了,有此參數(shù),hashcat只會按順序地嘗試a、ab和abc,并不會亂序地對占位符排列組合,嘗試各種可能。
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