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 オプション)の指定が必要です。hashidhash-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 とは

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

bcrypt や Argon2 はなぜ強いのか

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 よりパスワードハッシュに適したアルゴリズムとする主な理由はどれですか?