Hashcat とは
Hashcat は世界最高速のパスワード回復ツールです。GPUの並列計算能力を最大限に活用することで、CPU単体と比較して数百倍から数千倍の速度でハッシュを解析できます。
パスワードクラッキングを学ぶ目的は攻撃を行うためではなく、なぜ弱いパスワードが危険なのかを体感し、適切なパスワードポリシーとハッシュアルゴリズムの選択を理解するためです。
Hashcatが対応する主な攻撃モード:
| モード番号 | 攻撃タイプ | 説明 |
|---|---|---|
-a 0 | 辞書攻撃 | 単語リスト(ワードリスト)の各エントリをハッシュ化して比較 |
-a 1 | 組み合わせ攻撃 | 2つの辞書ファイルの単語を連結して試す |
-a 3 | ブルートフォース / マスク攻撃 | 文字セットとパターンを指定して全組み合わせを試す |
-a 6 | ハイブリッド(辞書+マスク) | 辞書の単語に末尾パターンを付加して試す |
Hashcatを他人のシステムから取得したパスワードハッシュの解析に使用することは不正アクセス禁止法・電子計算機損壊等業務妨害罪に該当する可能性があります。この実習は演習用に自分で作成したハッシュ、または前のレッスンで使用したMetasploitable 2 の /etc/shadow(自分の演習環境のもの)に対してのみ実行してください。
演習用ハッシュの準備
まず実習に使うサンプルハッシュファイルを自分で作成します。
# MD5ハッシュの生成
echo -n “password” | md5sum
# 5f4dcc3b5aa765d61d8327deb882cf99 -
echo -n “123456” | md5sum
# e10adc3949ba59abbe56e057f20f883e -
echo -n “letmein” | md5sum
# 0d107d09f5bbe40cade3de5c71e9e9b7 -
# SHA-1ハッシュの生成
echo -n “password” | sha1sum
# 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8 -
# SHA-256ハッシュの生成
echo -n “password” | sha256sum
# 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 -
# NTLMハッシュの生成(Python使用)
python3 -c “import hashlib; print(hashlib.new(‘md4’, ‘password’.encode(‘utf-16le’)).hexdigest())“
# 8846f7eaee8fb117ad06bdd830b7586c
# 演習用ハッシュファイルを作成
cat > ~/hashcat-lab/hashes_md5.txt << ‘EOF’ 5f4dcc3b5aa765d61d8327deb882cf99 e10adc3949ba59abbe56e057f20f883e 0d107d09f5bbe40cade3de5c71e9e9b7 827ccb0eea8a706c4c34a16891f84e7b 25f9e794323b453885f5181f1b624d0b EOF
cat > ~/hashcat-lab/hashes_sha1.txt << ‘EOF’ 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8 7c4a8d09ca3762af61e59520943dc26494f8941b f7c3bc1d808e04732adf679965ccc34ca7ae3441 EOF
ハッシュ関数は任意の入力を固定長の出力(ダイジェスト)に変換する一方向関数です。パスワードを平文でデータベースに保存する代わりに、ハッシュ値を保存します。ログイン時は入力されたパスワードをハッシュ化して保存済みハッシュと比較します。クラッキングとは「どの入力がこのハッシュになるか」を大量試行で逆算する行為です。
ハッシュタイプの特定
Hashcatはハッシュタイプ(-m オプション)の指定が必要です。hashid や hash-identifier を使って特定します。
# hashid でハッシュの種類を特定
hashid 5f4dcc3b5aa765d61d8327deb882cf99
# [+] MD2
# [+] MD5
# [+] MD4
# hash-identifier を使用
hash-identifier
# HASH: 5f4dcc3b5aa765d61d8327deb882cf99
# Possible Hashs:
# [+] MD5
# [+] Domain Cached Credentials - MD4(MD4(($pass)).(strtolower($username)))
# Hashcatの主なハッシュタイプ番号
# -m 0 : MD5
# -m 100 : SHA-1
# -m 1400 : SHA-256
# -m 1800 : sha512crypt(/etc/shadow のLinuxパスワード)
# -m 1000 : NTLM(Windowsパスワード)
# -m 3200 : bcrypt($2*$, Blowfish)
# -m 500 : md5crypt($1$、古いLinux/BSD)
# 対応する全ハッシュタイプ一覧(多数)
hashcat —help | grep -i “Hash modes”
実習 1 — 辞書攻撃(MD5)
最も基本的な攻撃方法です。rockyouのような実際の漏洩パスワードリストを使います。
# Kali LinuxのWordlistの場所を確認
ls /usr/share/wordlists/
# rockyou.txt.gz fasttrack.txt dirbuster/ …
# rockyou.txtを展開(初回のみ)
sudo gunzip /usr/share/wordlists/rockyou.txt.gz
# 辞書攻撃の実行(-m 0: MD5, -a 0: 辞書攻撃)
hashcat -m 0 -a 0 ~/hashcat-lab/hashes_md5.txt /usr/share/wordlists/rockyou.txt
# 進捗表示の例:
# Session…: hashcat
# Status…: Running
# Hash.Mode…: 0 (MD5)
# Hash.Target…: hashes_md5.txt
# Time.Started…: Thu Mar 19 10:00:00 2026
# Time.Estimated…: Thu Mar 19 10:01:30 2026
# Guess.Base…: File (/usr/share/wordlists/rockyou.txt)
# Speed.#1…: 350.2 MH/s (9.44ms)
# Recovered…: 3/5 (60.00%) Digests
# Progress…: 14344385/14344385 (100.00%)
# 解析済みのパスワードを表示
hashcat -m 0 ~/hashcat-lab/hashes_md5.txt —show
# 5f4dcc3b5aa765d61d8327deb882cf99:password
# e10adc3949ba59abbe56e057f20f883e:123456
# 0d107d09f5bbe40cade3de5c71e9e9b7:letmein
rockyou.txt は2009年にRockYouというSNSサービスから漏洩した約1,400万件の実際のパスワードをまとめたリストです。「password」「123456」「letmein」などよく使われるパスワードが上位を占めており、辞書攻撃の定番ワードリストです。このリストに含まれるパスワードは使用しないことを強く推奨します。
実習 2 — SHA-1 / SHA-256 のクラッキング
# SHA-1ハッシュへの辞書攻撃(-m 100)
hashcat -m 100 -a 0 ~/hashcat-lab/hashes_sha1.txt /usr/share/wordlists/rockyou.txt
# 進捗確認(実行中にsキーを押す)
# Recovered…: 2/3 (66.67%) Digests
# SHA-256ハッシュへの辞書攻撃(-m 1400)
echo “5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8” > ~/hashcat-lab/hashes_sha256.txt hashcat -m 1400 -a 0 ~/hashcat-lab/hashes_sha256.txt /usr/share/wordlists/rockyou.txt
# 結果確認
hashcat -m 1400 ~/hashcat-lab/hashes_sha256.txt —show
# 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8:password
実習 3 — NTLMハッシュのクラッキング
NTLMはWindowsのパスワード認証で使われるハッシュ形式です。ペネトレーションテストではよく遭遇します。
# NTLMハッシュファイルを作成(前のMetasploit実習で収集したものを想定)
cat > ~/hashcat-lab/hashes_ntlm.txt << ‘EOF’ 8846f7eaee8fb117ad06bdd830b7586c 31d6cfe0d16ae931b73c59d7e0c089c0 e19ccf75ee54e06b06a5907af13cef42 EOF
# NTLMハッシュへの辞書攻撃(-m 1000)
hashcat -m 1000 -a 0 ~/hashcat-lab/hashes_ntlm.txt /usr/share/wordlists/rockyou.txt
# 結果確認
hashcat -m 1000 ~/hashcat-lab/hashes_ntlm.txt —show
# 8846f7eaee8fb117ad06bdd830b7586c:password
# 31d6cfe0d16ae931b73c59d7e0c089c0:(空文字列)
# e19ccf75ee54e06b06a5907af13cef42:iloveyou
実習 4 — ブルートフォース / マスク攻撃
辞書に含まれないパスワードに対しては、マスク(パターン)を指定したブルートフォース攻撃を使います。
# 4桁数字のMD5ハッシュを解析(-a 3: マスク攻撃, ?d: 数字)
echo -n “1234” | md5sum | cut -d’ ’ -f1 > ~/hashcat-lab/pin4.txt
hashcat -m 0 -a 3 ~/hashcat-lab/pin4.txt “?d?d?d?d”
# Recovered…: 1/1 (100.00%) Digests
# マスク文字集合の定義:
# ?l = 英小文字 (a-z)
# ?u = 英大文字 (A-Z)
# ?d = 数字 (0-9)
# ?s = 特殊文字
# ?a = ?l?u?d?s の全文字
# 8文字(英小文字+数字)のパスワードを試す例
hashcat -m 0 -a 3 ~/hashcat-lab/hashes_md5.txt “?l?l?l?l?d?d?d?d”
# 例: pass1234 のようなパターン
# 大文字で始まり数字で終わる8文字パターン(よく使われる構成)
hashcat -m 0 -a 3 ~/hashcat-lab/hashes_md5.txt “?u?l?l?l?l?l?d?d”
# 例: Password12 に近いパターン
# 実行速度のベンチマーク(GPU性能の確認)
hashcat -b -m 0
# Speed.#1…: 5000.0 MH/s(GPU使用時はGPU番号が表示される)
実習 5 — ルールベース攻撃
ルールベース攻撃は辞書の単語に変換ルール(大文字化・数字追加・置換など)を適用し、実際のユーザーが行うような変換パターンを自動化します。
# Kali Linux に含まれる既製ルールファイルを確認
ls /usr/share/hashcat/rules/
# best64.rule combinator.rule d3ad0ne.rule dive.rule
# rockyou-30000.rule toggles1.rule …
# best64.rule(最もよく使われる64個の変換ルール)で攻撃
hashcat -m 0 -a 0 ~/hashcat-lab/hashes_md5.txt /usr/share/wordlists/rockyou.txt
-r /usr/share/hashcat/rules/best64.rule
# best64.rule に含まれる変換例:
# : (何もしない)
# l (小文字化: PASSWORD -> password)
# u (大文字化: password -> PASSWORD)
# c (先頭大文字: password -> Password)
# $1 (末尾に”1”を追加: password -> password1)
# $! (末尾に”!”を追加: password -> password!)
# @a (“a”を削除)
# sa@ (“a”を”@“に置換: password -> p@ssword)
# 複数ルールを組み合わせて使用
hashcat -m 0 -a 0 ~/hashcat-lab/hashes_md5.txt /usr/share/wordlists/rockyou.txt
-r /usr/share/hashcat/rules/best64.rule
-r /usr/share/hashcat/rules/toggles1.rule
# 解析済み結果の確認
hashcat -m 0 ~/hashcat-lab/hashes_md5.txt —show
MD5やSHA-1でのパスワードクラッキングが数秒〜数分で完了するのに対し、bcrypt(コスト係数12)は同じGPUを使っても毎秒数万回程度しかハッシュ化できません。これはbcryptが意図的に「遅く」設計されているためです。Argon2やscryptはさらにメモリ集約型で、GPU並列攻撃を困難にします。現代のシステムではパスワード保存に必ずbcrypt・Argon2・scrypt等を使用すべきです。
ハッシュアルゴリズムの強度比較
# 各アルゴリズムのベンチマーク(GPU使用時の概算値)
hashcat -b
# 参考速度(RTX 3080使用時の概算):
# MD5 (-m 0) : 60,000 MH/s(毎秒600億ハッシュ)
# SHA-1 (-m 100) : 20,000 MH/s(毎秒200億ハッシュ)
# SHA-256 (-m 1400) : 9,000 MH/s(毎秒90億ハッシュ)
# NTLM (-m 1000) : 90,000 MH/s(毎秒900億ハッシュ)
# bcrypt (-m 3200) : 70 kH/s(毎秒7万ハッシュ)← 圧倒的に遅い
# Argon2id (-m 25700): 1 kH/s(毎秒1,000ハッシュ)← さらに遅い
# → MD5の 85,000,000倍の時間がArgon2idでは必要
# 8文字ランダムパスワードのMD5:約1秒で解析可能
# 8文字ランダムパスワードのArgon2id:約2,400年かかる計算
やってみよう — 演習ミッション
以下の課題を順番に試してみましょう。
ミッション 1(基礎): 以下のMD5ハッシュを辞書攻撃でクラッキングしてください。
21232f297a57a5a743894a0e4a801fc3
(ヒント:一般的なWebアプリのデフォルトアカウント名)
ミッション 2(中級): Metasploit実習で取得した /etc/shadow のエントリ($1$ で始まる md5crypt ハッシュ)を -m 500 で辞書攻撃してみてください。MD5より大幅に時間がかかることを体感できます。
ミッション 3(発展): --increment オプションを使い、1文字から8文字まで段階的に増やすブルートフォースを試してください。文字数が増えるにつれ解析時間がどのように変化するか記録してみましょう。
トラブルシューティング
| 症状 | 原因 | 対処法 |
|---|---|---|
No hashes loaded | ハッシュファイルの形式が正しくない | 1行1ハッシュの形式か確認。空白行がないか確認 |
Unknown hash type | -m の番号が間違っている | hashid でタイプを再確認し、hashcat --help で番号を照合 |
| GPU が検出されない | OpenCLドライバが未インストール | hashcat -I でデバイス一覧を確認。VMの場合はCPUモード(-D 1)で実行 |
| セッションが途中で停止 | 温度保護が発動 | --hwmon-temp-abort 95 で温度上限を設定し、冷却を改善する |
| ポット(解析済みDB)に残っている | 以前の解析結果が残っている | --potfile-disable で無視するか、~/.hashcat/hashcat.potfile を確認 |
# VMなどGPUが使えない環境ではCPUモードで実行
hashcat -m 0 -a 0 ~/hashcat-lab/hashes_md5.txt /usr/share/wordlists/rockyou.txt -D 1
# デバイス一覧を確認
hashcat -I
# OpenCL Info:
# Platform ID #1
# Vendor..: Intel(R) Corporation
# Name…: OpenCL 3.0 HD Graphics …
# スレッド数を指定してCPU負荷を調整
hashcat -m 0 -a 0 ~/hashcat-lab/hashes_md5.txt /usr/share/wordlists/rockyou.txt
-D 1 —force
bcrypt を MD5 よりパスワードハッシュに適したアルゴリズムとする主な理由はどれですか?