介紹如何使用 hashcat 搭配各種字典檔與破解模式,快速破解各種類型的密碼雜湊。
hashcat 是一個快速破解密碼雜湊的開放原始碼工具,支援 5 種破解模式、300 種以上的雜湊演算法、CPU 與 GPU 等各種硬體加速,可運行於 Linux、Windows 與 macOS 作業系統,當單一台電腦運算能力不足時,hashcat 也可以搭配其他的軟體架構,使用多台電腦建置分散式密碼破解系統,減少破解密碼所需要的時間。
單純暴力法攻擊
暴力法是最直接的密碼雜湊破解方式,但是需要耗費大量的運算時間。以下我們以 abcdef
這個簡單的密碼產生一個測試用的 MD5 雜湊,將其儲存在 my_hash.txt
檔案中:
# 產生測試用的 MD5 雜湊檔案 echo -n 'abcdef' | md5sum | cut -d " " -f 1 > my_hash.txt
這裡我們只針對一個密碼雜湊進行破解,如果有多筆密碼雜湊,可以用一行一個雜湊的方式寫在這個 my_hash.txt
檔案中,hashcat 可以一次對多筆密碼雜湊值進行破解。
接著執行 hashcat
指令以暴力法嘗試破解這組 MD5 雜湊:
# 使用暴力法(Brute-force)嘗試破解 MD5 雜湊 hashcat -m 0 -a 3 my_hash.txt ?l?l?l?l?l?l
這裡的 -m
參數是指定雜湊的演算法類型(hash type),hashcat 支援非常多的雜湊演算法,我們可以從 hashcat 的官方文件中查詢其支援的演算法、對應的代號與輸入的雜湊範例,以最普通的 MD5 來說,其對應的代號就是 0
,所以這裡以 -m 0
來將演算法類型指定為普通的 MD5 雜湊演算法。
而 -a
參數則是用來指定攻擊模式(attach mode),暴力法(Brute-force)所對應的代號為 3
,所以這裡以 -a 3
來將攻擊模式指定為暴力法。我們可以執行 hashcat -h
來查詢所有可用的攻擊模式。
- [ Attack Modes ] - # | Mode ===+====== 0 | Straight 1 | Combination 3 | Brute-force 6 | Hybrid Wordlist + Mask 7 | Hybrid Mask + Wordlist 9 | Association
而最後兩個參數則是輸入的雜湊檔案與密碼遮罩(mask),密碼遮罩是用來指定密碼的字元結構,每一個密碼字元在指定遮罩時是以一個問號加上一個代號來表示,我們可以從 hashcat -h
的輸出中查詢 hashcat 內建的基本遮罩字元表(chartsets):
- [ Built-in Charsets ] - ? | Charset ===+========= l | abcdefghijklmnopqrstuvwxyz [a-z] u | ABCDEFGHIJKLMNOPQRSTUVWXYZ [A-Z] d | 0123456789 [0-9] h | 0123456789abcdef [0-9a-f] H | 0123456789ABCDEF [0-9A-F] s | !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ a | ?l?u?d?s b | 0x00 - 0xff
例如 ?l
就代表小寫英文字母,而 ?d
就代表數字,這裡我們猜測的密碼字元結構是長度為 6 的小寫英文字母,所以我們將密碼遮罩設定為 ?l?l?l?l?l?l
。
執行這行 hashcat
指令之後,就會進行暴力法破解,而因為這裡的我們設定密碼只有 6 個字元的小寫英文字母,所以只要幾秒鐘就可以破解:
[略] Host memory required for this attack: 8 MB e80b5017098950fc58aad83c8c14978e:abcdef Session..........: hashcat Status...........: Cracked Hash.Mode........: 0 (MD5) Hash.Target......: e80b5017098950fc58aad83c8c14978e Time.Started.....: Sat May 20 20:45:23 2023, (0 secs) Time.Estimated...: Sat May 20 20:45:23 2023, (0 secs) Kernel.Feature...: Pure Kernel Guess.Mask.......: ?l?l?l?l?l?l [6] Guess.Queue......: 1/1 (100.00%) Speed.#1.........: 933.8 MH/s (1.63ms) @ Accel:1024 Loops:84 Thr:1 Vec:16 Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new) Progress.........: 249167872/308915776 (80.66%) Rejected.........: 0/249167872 (0.00%) Restore.Point....: 360448/456976 (78.88%) Restore.Sub.#1...: Salt:0 Amplifier:84-168 Iteration:0-84 Candidate.Engine.: Device Generator Candidates.#1....: lecekf -> kypnkz Started: Sat May 20 20:45:02 2023 Stopped: Sat May 20 20:45:25 2023
自訂遮罩字元表
如果內建的基本遮罩字元表不符合我們的需求時,我們也可以自訂遮罩字元表。假設我們的密碼採用小寫英文加上數字混合,這時候我們就要採用不同的密碼遮罩進行破解:
# 產生測試用的 MD5 雜湊檔案 echo -n 'abc123' | md5sum | cut -d " " -f 1 > my_hash.txt # 使用暴力法(Brute-force)嘗試破解 MD5 雜湊 hashcat -m 0 -a 3 -1 ?l?d my_hash.txt ?1?1?1?1?1?1
hashcat 最多可以自訂四種遮罩字元表(以 -1
、-2
、-3
、-4
參數定義 ?1
、?2
、?3
、?4
),這裡我們使用 -1 ?l?d
將 ?1
定義為 ?l?d
(小寫英文字母或數字),並將後面的密碼遮罩指定為 ?1?1?1?1?1?1
,這樣就可以針對長度為 6 的小寫英文或數字的密碼進行破解。
Host memory required for this attack: 8 MB e99a18c428cb38d5f260853678922e03:abc123 Session..........: hashcat Status...........: Cracked Hash.Mode........: 0 (MD5) Hash.Target......: e99a18c428cb38d5f260853678922e03 Time.Started.....: Sat May 20 20:51:05 2023, (0 secs) Time.Estimated...: Sat May 20 20:51:05 2023, (0 secs) Kernel.Feature...: Pure Kernel Guess.Mask.......: ?1?1?1?1?1?1 [6] Guess.Charset....: -1 ?l?d, -2 Undefined, -3 Undefined, -4 Undefined Guess.Queue......: 1/1 (100.00%) Speed.#1.........: 760.1 MH/s (1.74ms) @ Accel:1024 Loops:64 Thr:1 Vec:16 Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new) Progress.........: 6291456/2176782336 (0.29%) Rejected.........: 0/6291456 (0.00%) Restore.Point....: 0/1679616 (0.00%) Restore.Sub.#1...: Salt:0 Amplifier:128-192 Iteration:0-64 Candidate.Engine.: Device Generator Candidates.#1....: ernier -> trscfa Started: Sat May 20 20:51:02 2023 Stopped: Sat May 20 20:51:07 2023
遞增密碼遮罩
遞增密碼遮罩功能(--increment
參數)可以讓我們嘗試不同長度的密碼遮罩,其預設會從密碼遮罩中取用第 1 個遮罩字元,產生所有長度為 1 的密碼組合,接著再取用前 2 個遮罩字元,產生所有長度為 2 的密碼組合,以此類推直到達到密碼遮罩的長度為止。而我們也可以使用 --increment-min
與 --increment-max
參數來指定最小與最大的密碼遮罩字元取用的長度。
舉例來說,若我們希望產生由數字構成的所有密碼組合,長度介於 2 到 6 之間,就可以這樣做:
# 以密碼遮罩搭配遞增模式產生新密碼組合 hashcat -a 3 --increment --increment-min=2 --increment-max=6 ?d?d?d?d?d?d --stdout
這裡我們先不指定要破解的雜湊檔案,另外加上 --stdout
參數,輸出產生的密碼組合,方便檢查指令是否有問題,執行後產生的輸出會類似這樣:
12 02 22 [略] 838373 708373 688373
如果要將這裡產生的密碼組合,直接用於破解密碼,可以這樣做:
# 產生測試用的 MD5 雜湊檔案 echo -n '12345' | md5sum | cut -d " " -f 1 > my_hash.txt # 使用密碼遮罩搭配遞增模式嘗試破解 MD5 雜湊 hashcat -m 0 -a 3 --increment --increment-min=2 --increment-max=6 my_hash.txt ?d?d?d?d?d?d?d?d
字典檔攻擊
一般的暴力法攻擊雖然作法簡單,但是卻需要大量的計算時間,採用字典檔可以有機會縮短破解密碼所需要的時間。這裡我們產生一個長度為 12、混合大小寫英文字、數字與特殊符號的密碼,這種複雜度的密碼若單純以暴力法進行破解,會需要很久的時間。
# 產生測試用的 MD5 雜湊檔案 echo -n 'Password@123' | md5sum | cut -d " " -f 1 > my_hash.txt
在網路上有許多的字典檔可以使用,這裡我們拿 rockyou 這個字典檔作為示範:
# 下載字典檔
wget https://github.com/brannondorsey/naive-hashcat/releases/download/data/rockyou.txt
有了字典檔之後,就可以使用 hashcat 的直接模式(Straight)搭配字典檔進行暴力破解:
# 使用 rockyou.txt 字典檔嘗試破解 MD5 雜湊 hashcat -m 0 -a 0 my_hash.txt rockyou.txt
若我們要攻擊的密碼剛好存在於字典檔中,這樣的方式就可以大幅減少破解所需要的時間,但是能否成功取決於我們的字典檔品質以及運氣:
d00f5d5217896fb7fd601412cb890830:Password@123 Session..........: hashcat Status...........: Cracked Hash.Mode........: 0 (MD5) Hash.Target......: d00f5d5217896fb7fd601412cb890830 Time.Started.....: Sun May 21 08:33:44 2023 (0 secs) Time.Estimated...: Sun May 21 08:33:44 2023 (0 secs) Kernel.Feature...: Pure Kernel Guess.Base.......: File (rockyou.txt) Guess.Queue......: 1/1 (100.00%) Speed.#1.........: 7216.9 kH/s (0.13ms) @ Accel:512 Loops:1 Thr:1 Vec:16 Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new) Progress.........: 1044480/14344384 (7.28%) Rejected.........: 0/1044480 (0.00%) Restore.Point....: 1040384/14344384 (7.25%) Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1 Candidate.Engine.: Device Generator Candidates.#1....: TEEXTRANO -> PORTOPORTO Hardware.Mon.#1..: Temp: 59c Util: 13% Started: Sun May 21 08:33:32 2023 Stopped: Sun May 21 08:33:46 2023
組合字典檔攻擊
單一字典檔案很難窮舉所有的密碼可能性,這時候就可以採用組合兩個字典檔的方式(Combinator Attack)來產生更多的可能性,假設我們有 dict1.txt
與 dict2.txt
兩個字典檔,dict1.txt
的內容為:
abc def
而 dict2.txt
的內容為:
123 456 789
在這種狀況下,我們就可以將兩個字典檔結合起來,產生所有可能的排列組合。這裡我們先使用 --stdout
參數將產生新的字典檔至標準輸出,方便檢查指令的正確性:
# 組合 dict1.txt 與 dict2.txt 產生新的字典檔 hashcat -a 1 dict1.txt dict2.txt --stdout
abc123 abc456 abc789 def123 def456 def789
這個輸出的組合若直接導入檔案,即可產生新的字典檔。一般常見的組合方式可能會用兩個英文單字,或是英文單字搭配日期、特殊符號等。
若要以兩個字典檔結合之後的組合直接進行破解,可以這樣做:
# 產生測試用的 MD5 雜湊檔案 echo -n 'def456' | md5sum | cut -d " " -f 1 > my_hash.txt # 使用組合字典檔嘗試破解 MD5 雜湊 hashcat -m 0 -a 1 my_hash.txt dict1.txt dict2.txt
法則攻擊
法則攻擊(Rule-based Attack)是一種比較複雜的攻擊方式,這種方式就是在 -a 0
攻擊模式下搭配 -r
餐數指定法則,其類似自訂的程式語言,以自訂的規則來產生密碼組合,增加攻擊的彈性、效率與精準度。
hashcat 的法則攻擊語法相當豐富,詳細語法可參考 hashcat 的官方文件,舉例來說 c
是代表將第一個英文字轉為大寫,其餘英文字轉為小寫,而 $X
則是代表在結尾加上 X
字元。
若我們自行撰寫的規則檔 my_rule.rule
內容如下:
c $2$0$2$1 c $2$0$2$2 c $2$0$2$3
以這個規則檔搭配普通的字典檔,就可以產生第一個英文字大寫,外加各種年分的字典檔。我們以前面建立的 dict1.txt
字典檔作為範例,搭配自訂規則產生新的字典檔:
# 以規則搭配字典檔產生新密碼組合 hashcat -a 0 -r my_rule.rule dict1.txt --stdout
Abc2021 Abc2022 Abc2023 Def2021 Def2022 Def2023
若要以這個自訂規則搭配字典檔直接進行破解,可以這樣做:
# 產生測試用的 MD5 雜湊檔案 echo -n 'Def2023' | md5sum | cut -d " " -f 1 > my_hash.txt # 使用自訂規則搭配字典檔嘗試破解 MD5 雜湊 hashcat -m 0 -a 0 -r my_rule.rule my_hash.txt dict1.txt
在 hashcat 隨附的 rules
目錄中,有許多常見的規則檔可以參考或直接套用。
混合攻擊
混合攻擊(Hybrid Attack)有點類似組合字典檔的攻擊,但混合攻擊是將一個字典檔與一個單純暴力法產生的字串混合,產生新的字典檔。
hashcat 的混合攻擊有兩種模式,一種是字典檔搭配密碼遮罩(-a 6
),另一種是密碼遮罩搭配字典檔(-a 7
),兩種用法類似,差異只在於字典檔與密碼遮罩前後的擺放位置而已。
若要以 dict1.txt
這個字典檔搭配 2 位數字的密碼遮罩(?d?d
)產生新密碼組合,可以 -a 6
的模式:
# 以字典檔搭配密碼遮罩產生新密碼組合 hashcat -a 6 dict1.txt ?d?d --stdout
這樣就會產生所有的密碼組合:
abc12 abc08 abc20 abc31 [略] def59 def83 def70 def68
若要把密碼遮罩放在前方,則可改用 -a 7
的模式:
# 以密碼遮罩搭配字典檔產生新密碼組合 hashcat -a 7 ?d?d dict1.txt --stdout
12abc 12def 08abc 08def [略] 70abc 70def 68abc 68def
以下是用字典檔搭配密碼遮罩直接進行破解的範例:
# 產生測試用的 MD5 雜湊檔案 echo -n 'def78' | md5sum | cut -d " " -f 1 > my_hash.txt # 以字典檔搭配密碼遮罩嘗試破解 MD5 雜湊 hashcat -m 0 -a 6 my_hash.txt dict1.txt ?d?d
這是以字典檔搭配密碼遮罩直接進行破解的例子:
# 產生測試用的 MD5 雜湊檔案 echo -n '78def' | md5sum | cut -d " " -f 1 > my_hash.txt # 以字典檔搭配密碼遮罩嘗試破解 MD5 雜湊 hashcat -m 0 -a 7 my_hash.txt ?d?d dict1.txt
Brain 伺服器
hashcat 的 brain 伺服器可以用來協助 client 檢查每個密碼是否已經檢查過,讓 client 自動跳過已經檢查過的密碼,讓密碼破解更有效率。
若要使用 hashcat 的 brain 伺服器,可以先以 --brain-server
參數啟動一台 brain 伺服器,並以 --brain-host
、--brain-port
與 --brain-password
參數來指定 brain 伺服器傾聽的網路位址、連接埠與密碼:
# 啟動 brain server hashcat --brain-server --brain-host=192.168.1.1 \ --brain-port=5000 --brain-password=YOUR_PASSWORD
然後再以 --brain-client
參數啟動 client,並指定 brain 伺服器的相關資訊,即可透過 brain 伺服器控管整個密碼破解過程:
# 啟動 brain client hashcat -O --brain-client --brain-client-features=3 \ --brain-host=192.168.1.1 --brain-port=5000 \ --brain-password=YOUR_PASSWORD \ -m 0 -a 0 my_hash.txt my_dict.txt -r my_rule.rule