Linux

hashcat 密碼雜湊快速破解工具使用教學與範例

介紹如何使用 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.txtdict2.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

參考資料

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

9 個月 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

9 個月 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

9 個月 ago

Windows 使用 TPM 虛擬智慧卡保護 SSH 金鑰教學與範例

本篇介紹如何在 Windows...

10 個月 ago

Linux 以 Shamir’s Secret Sharing 分割保存金鑰教學與範例

介紹如何在 Linux 中使用...

10 個月 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

11 個月 ago