この記事で学べること
- 辞書攻撃:単語リストを使った高速な攻撃
- マスク攻撃:パターンを指定した総当たり攻撃
Hashcatとは
Hashcatとは、パスワードのハッシュ値から元のパスワードを復元(クラック)するためのオープンソースツールです。主に、パスワードの強度検証の際に使用されます。
環境
- Kali Linux 2025
- hashcat --version v7.1.2
パスワードとハッシュ値の関係性
ハッシュ値とは、ある値をハッシュ関数を通した時の出力のことです。
ハッシュ関数には以下の特徴があります。
- 同じ入力なら同じ出力が得られる
- 出力から入力逆引きが不可能
- 入力が少しでも異なると、まったく違う出力になる
例えば、
Japanという単語のMD5におけるハッシュ値は53a577bb3bc587b0c28ab808390f1c9b
しかし、
japanになると、578ed5a4eecf5a15803abdc49f6152d6
このような性質を利用して、多くのシステムではパスワードをハッシュ値として保存しています。そのため、パスワードが漏洩しても、パスワードを直接知ることはできません。
Hashcatがパスワード復元できる理由
Hashcatは、すべてのパスワードの復元をできるツールではありません。
このツールは、考えられるパスワード候補を片っ端からハッシュ化し、保存されているハッシュ値と一致するものを探すからです。
つまり、
単語や数字の連番など、予想しやすいパスワードは復元される可能性は非常に高いです。言い換えれば、元のパスワードを予想することが困難なほど、復元される可能性は低くなります。
フォーマット
コマンドの構成は、
hashcat [オプション][ハッシュ値ファイル][ワードリストファイル]
オプション
-
ハッシュタイプ (-m 数字)
ハッシュタイプとは、ハッシュ値を生成する際のルールです。- -m 0 (MD5)
- -m 500 (md5crypt)
- -m 1400 (SHA2-256)
- -m 1800 (sha512crypt)
など他にも多くタイプが存在します。興味がある方は以下を参考にしてください。
今回はmd5cryptを使用します。
MD5とmd5cryptは別物です。簡単にいうと、md5cryptはMD5をより強固にしたものです。
-
攻撃モード (-a 数字)
攻撃モードとは、ハッシュ値を復元するための方法です。- -a 0(辞書攻撃)
- -a 1(組み合わせ)
- -a 3(マスク攻撃)
- -a 6(辞書の単語 + マスクパターン)
- -a 7(マスクパターン + 辞書の単語)
今回は辞書攻撃とマスク攻撃を使用します。
辞書攻撃
テストファイルをGitHub上に公開しているので、必要な場合はダウンロードしてください。
辞書攻撃は、用意したワードリスト(辞書)を使用して、ハッシュ値を復元する攻撃です。
テストファイルを使用した実践
hashcat -m 500 -a 0 prefectures-md5 wordlist/500_passwords.txt
- -m 500 (md5crypt)
- -a 0(辞書攻撃)
- prefectures-md5 (48個のハッシュ値ファイル)
- wordlist/500_passwords.txt(500単語のワードリスト)
このコマンドを実行後、出力結果の一部にこのように書いてあるはずです。
結果
Approaching final keyspace - workload adjusted.
$1$nicXOrQE$Adof2X8ef78atWB6mSG590:japan
これだけで、1つ目のハッシュ値を復元することに成功しました!
このコマンドを簡単に解説すると、500単語のリストを順番にハッシュ化し、ターゲットのハッシュ値と比較しています。結果、japanという単語のハッシュ値が一致したため復元できました。
復元したハッシュ値が表示されない場合があります。その場合は、以下のコマンドを実行しましょう。
hashcat -m 500 --show prefectures-md5
$1$nicXOrQE$Adof2X8ef78atWB6mSG590:japan
このように、単語を予測したリストを用意して、復元する方法が辞書攻撃です。
今回は48個中1個のみクラックできました。辞書攻撃はリストにある単語しか見つけられないため、より多くのパスワードを復元するには大きな辞書使う必要があります。
では、残りのハッシュ値も復元しましょう!
hashcat -m 500 -a 0 prefectures-md5 wordlist/prefectures.txt
実行後、すべてのハッシュ値がクラックできたはずです!
48個のハッシュ値は、英字で日本と47都道府県を表していました🇯🇵
マスク攻撃
マスク攻撃は、指定したパターンで文字列を総当たりする攻撃です。
マスク攻撃の記号
- ?l 小文字 (a-z) 26通り
- ?u 大文字 (A-Z) 26通り
- ?d 数字 (0-9) 10通り
- ?s 記号 33通り
- ?a 上記すべて 95通り
テストファイルを使用した実践
mask-md5には2つのハッシュ値が保存されています。
パスワードは、1文字目は大文字、2文字目は小文字、3文字目は数字、4文字目は記号で構成されています。
つまり使用する記号列は、?u?l?d?s
hashcat -m 500 -a 3 mask-md5 ?u?l?d?s
- -m 500 (md5crypt)
- -a 3(マスク攻撃)
- mask-md5 (2個のハッシュ値ファイル)
- ?u?l?d?s(パスワードの構成文字列)
結果
$1$vlnVyE.E$NI6vUhgHWCURY0PEfI9.3/:Do2+
$1$uI9bYDk9$YzIAviJrjLqB.GFh1G.Av/:It6!
2つのハッシュ値はDo2+とIt6!を表していました!
マスク攻撃は総当たりのため、パスワードが長い、または?aを使用するば、より時間がかかります。
今回の ?u?l?d?s は 26×26×10×33 = 223,080通りなので短時間で終わりますが、
?a?a?a?aだと8,000万通り以上になり、より時間がかかります。
以上、辞書攻撃とマスク攻撃についての解説でした。
他の攻撃モードは、この2つを応用したものです。例えば -a 6(ハイブリッド攻撃)では、名前のリストとマスク ?d?d?d?d を組み合わせて「taro0123」のようなパスワードをクラックできます。興味がある方は調べてみてください。
補足
辞書攻撃でより多くのパスワードをクラックしたい場合は、rockyou.txtを使用しましょう。これは数千万件の実際に漏洩したパスワードを含むリストで、セキュリティテストによく使われます。(テストファイルにダウンロード済み)
参照