Hashcat

Hashcat 是一款功能強大的開源密碼破解工具,以其高效能和多樣化的攻擊模式而聞名。它不僅是世界上最快的密碼破解工具之一,還內建了獨特的「in-kernel」規則引擎,可以更有效地應用密碼變換規則。

主要特色

  • 免費與開源: 可免費使用,並採用 MIT 授權。
  • 跨平台支援: 支援 Linux, Windows 和 macOS 等多種作業系統。
  • 多種攻擊模式: 提供多種攻擊模式,如字典攻擊、組合攻擊、暴力破解等,以應對不同情況。
  • 多種雜湊類型: 支援多達數百種不同的雜湊類型,涵蓋了常見的 MD5, SHA1, NTLM, Bcrypt, WordPress 等。

常用參數說明

攻擊模式 (Attack Modes, -a)

這是在 Hashcat 中選擇密碼破解方式的重要參數:

  • -a 0 (Straight): 字典攻擊模式,或稱「直譯模式」。它會直接使用字典檔(如 rockyou.txt)中的每一個單詞來嘗試破解。
  • -a 1 (Combination): 組合攻擊模式,將兩個字典檔中的單詞進行組合。
  • -a 2 (Toggle Case): 變換大小寫攻擊模式,用於改變單詞的大小寫組合。
  • -a 3 (Brute-Force): 暴力破解模式,透過窮舉所有可能的字元組合來破解密碼。

雜湊類型 (Hash Type, -m)

此參數用來指定你想要破解的雜湊類型,每種雜湊都有其對應的編號:

  • 0 = MD5
  • 50 = HMAC-MD5
  • 100 = SHA1
  • 400 = WordPress
  • 1000 = NTLM
  • 1400 = SHA256
  • 3200 = Bcrypt

支援的Mode可參考:https://hashcat.net/wiki/doku.php?id=example_hashes


實用攻擊範例

Straight Attack (字典攻擊)

字典攻擊是最基本的攻擊模式,它直接使用預先準備好的密碼字典檔進行匹配。

運作方式: Hashcat 會讀取一個包含常見密碼的字典檔,然後逐一嘗試。

範例:

hashcat -a 0 -m <hash type> <hash_encrypt_file> <password directory file>
  • <hash_encrypt_file>:存放待破解雜湊值的檔案。
  • <password directory file>:密碼字典檔路徑,例如:
    • 在 Kali Linux 中: /usr/share/wordlists/rockyou.txt (此檔案通常為壓縮檔,需先解壓縮:gzip -d /usr/share/wordlists/rockyou.txt.gz)
    • 線上資源: 許多網站提供免費的密碼字典檔,例如:https://samsclass.info/123/proj10/500_passwords.txt

使用Rule-based Attack

  • 說明:規則攻擊是字典攻擊的延伸,它會根據指定的規則對字典中的單詞進行變換,以生成更多的候選密碼,提升破解成功率。
  • 運作方式: Hashcat 從字典檔中讀取單詞,然後應用規則(如大小寫轉換、添加數字或符號、反轉順序等)來生成新的密碼組合。
  • 範例:
    • 使用 rockyou-30000.rule 規則檔增加字典 wordlist.txt 的密碼量並對md5做密碼測試。
    • hashcat -m 0 -a 0 -r /usr/share/hashcat/rules/rockyou-30000.rule hashes.txt /path/to/wordlist.txt

refer
https://uwnthesis.wordpress.com/2013/08/07/kali-how-to-crack-passwords-using-hashcat/


Brute-Force Attack (暴力破解)

暴力破解是透過窮舉所有可能的字元組合來破解密碼,當不知道密碼長度或字元類型時,它會非常有用。

運作方式:

  • Mask (遮罩): 透過遮罩來定義密碼的字元集和長度。
  • --increment 參數: 可選參數,用於讓 Hashcat 嘗試不同長度的密碼,從最短長度一直增加到最長長度。
  • --pw-min <length> / --increment-min <length> 設定密碼最小長度。
  • --pw-max <length> / --increment-max <length> 設定密碼最大長度。

內建字元集:

  • ?l:小寫字母 (a-z)
  • ?u:大寫字母 (A-Z)
  • ?d:數字 (0-9)
  • ?s:特殊符號
  • ?a:所有可見的 ASCII 字元 (?l?u?d?s)

範例:

  • 破解一個六位數的純數字密碼:(這個命令會嘗試所有從 000000999999 的組合。)
    • # echo e10adc3949ba59abbe56e057f20f883e > hash.txt # hashcat -m 0 -a 3 -i hash.txt ?d?d?d?d?d?d
  • 破解一個由四個小寫字母和兩個數字組成的密碼:(這個命令會嘗試所有例如 abcd12, abxy99 這樣的組合。)
    • # hashcat -m 0 -a 3 hashes.txt ?l?l?l?l?d?d
  • 破解一個長度為 1 到 5 位,包含所有可見字元的密碼:
    • # hashcat -m 0 -a 3 hashes.txt ?a?a?a?a?a --increment --increment-min=1 --increment-max=5

其他參數:

  • -n <thread_number> 設定執行緒數。

refer
https://hashcat.net/wiki/doku.php?id=frequently_asked_questions#why_should_i_use_a_mask_attack_i_just_want_to_brute_these_hashes


Hashcat 輸出解析表

設定長度 5 位全字元集 (?a?a?a?a?a) 的窮舉爆破,總共 7,737,809,375 組密碼,在單張 GPU(383.9 MH/s)上跑了約 20 秒全部嘗試完,但沒有找到正確密碼,因此狀態是 Exhausted,各項說明解釋如下。

欄位/項目原始輸出說明
StatusExhausted已經將設定的密碼空間全部嘗試完,沒有找到匹配的密碼。
Hash. Mode10 (md5($pass.$salt))使用的 hash 模式是 -m 10,計算方式為 MD5(密碼 + salt)。
Hash. Targete5249bbc558elfc5d71744ab9216e46:WhRgV4HXYjySt1aw前面是 hash 值,冒號後面是 salt 值。
Time. StartedTue Aug 12 19:10:41 2025 (20 secs)攻擊開始時間與持續時間(20 秒)。
Time. EstimatedTue Aug 12 19:11:01 2025 (0 secs)預估結束時間與剩餘時間(已完成)。
Kernel. FeaturePure Kernel使用純演算法核心(不是優化 kernel)。
Guess. Mask?a?a?a?a?a [5]嘗試的 mask 為長度 5 的全字元集(?a = 大小寫、數字、符號,95 種字元)。
Guess. Queue5/6 (83.33%)此次任務中第 5 個 mask(共 6 個)正在執行,完成度 83.33%。
Speed.#1383.9 MH/s (0.31ms) @ Accel:64 Loops:11 Thr:64 Vec:1單張 GPU 每秒嘗試 3.839 億組密碼,批處理延遲 0.31 毫秒,其他為 GPU 工作設定值。
Recovered0/1 (0.00%) Digests目標共 1 筆 hash,已破解 0 筆。
Progress7737809375/7737809375 (100.00%)已完成所有可能組合(95^5 = 7,737,809,375),完成率 100%。
Rejected0/7737809375 (0.00%)沒有任何候選密碼被篩掉。
Restore. Point81450625/81450625 (100.00%)斷點儲存的進度也已完成。
Candidate. Engine顯示候選產生器資訊(未特別輸出細節)。
Salt0 Amplifier:88-95 Iteration:0-11Hashcat 內部對 salt 與計算批次的描述(與破解邏輯有關,不影響你設定 mask)。
Candidates.#1](z}~ -> 3範例顯示剛跑過與即將嘗試的候選密碼。

Hashcat Status 狀態對照表

狀態名稱說明
Cracked已找到目標密碼(至少一個 hash 被破解)。
Exhausted已經嘗試完設定的密碼空間,但沒有找到任何正確密碼。
Aborted使用者手動中斷(Ctrl+C 或系統訊號終止)。
Quit使用者輸入 q 或 QUIT 命令結束。
Running正在執行破解(持續嘗試中)。
Paused使用者輸入 p 暫停,或因其他原因暫停(例如 GPU 過熱)。
Resumed從暫停狀態繼續執行。
Checkpoint正在儲存進度檔(–restore 可用來續跑)。
Bypass略過某些已經標記的 hash(通常是已經破解的)。
Stopped任務完成或被終止(包含正常結束與錯誤結束)。
Error執行過程中發生錯誤(例如檔案讀取失敗、GPU 初始化錯誤等)。