はじめに
Hashcat は、世界的に有名なパスワードリカバリツールであり、非常に高速に多種多様なハッシュをクラックする能力を持っています。辞書攻撃は一般的ですが、これはパスワードが与えられた単語リスト内に存在する場合にのみ有効です。純粋な総当たり攻撃(ブルートフォースアタック)は、考えられるすべての文字の組み合わせを試行するため、実用的には遅すぎることがよくあります。
ここでマスク攻撃が登場します。マスク攻撃は、パスワードの構造について何らかの知識がある場合に使用される、非常に効率的な総当たり攻撃の一種です。例えば、パスワードの長さや、大文字で始まり数字で終わる、といったことを知っている場合があります。
この実験(Lab)では、Hashcat を使用したマスク攻撃を実行するための基礎を学びます。まず概念を理解し、文字セットを使用してマスクを構築する方法を学び、この知識を適用して既知のパターンを持つパスワードハッシュをクラックします。
マスク攻撃(-a 3)の概念を理解する
このステップでは、Hashcat におけるマスク攻撃の基本的な概念を学びます。マスク攻撃モードは、-a 3オプションを使用して指定します。このモードは、定義したパターン、すなわち「マスク」に基づいてパスワード候補を生成するように Hashcat に指示します。
これは、既製の単語リストを使用する辞書攻撃(-a 0)とは異なります。マスク攻撃は、その場で独自の候補を生成します。
マスクがどのように候補を生成するかを見てみましょう。ハッシュをクラックしようとする代わりに、生成されたパスワードを画面に出力するために--stdoutオプションを使用できます。ここでは、?dを数字(0-9)の単純なプレースホルダーとして使用します。
すべての可能な 3 桁の数値を生成するには、次のコマンドを実行します。
hashcat -a 3 ?d?d?d --stdout
Hashcat は、考えられるすべての 3 桁の組み合わせを生成します。出力順序は Hashcat の最適化アルゴリズムによりランダムに見える場合があることに注意してください。しかし、000から999までのすべての組み合わせが生成されます。
...
476
576
876
976
...
これにより、核となるアイデアが実証されます。マスク?d?d?dはテンプレートとして機能し、Hashcat は指定された文字セットから考えられるすべての組み合わせで体系的にそれを埋めていきます。
組み込み文字セット(?l, ?u, ?d, ?s)を学ぶ
このステップでは、マスクの基本的な構成要素である内蔵文字セットについて学習します。これらは、特定の文字グループを表すプレースホルダーです。
Hashcat は、いくつかの便利な内蔵文字セットを提供しています。
| プレースホルダー | 文字セット | 説明 |
|---|---|---|
?l |
abcdefghijklmnopqrstuvwxyz |
すべての小文字 |
?u |
ABCDEFGHIJKLMNOPQRSTUVWXYZ |
すべての大文字 |
?d |
0123456789 |
すべての数字 |
?s |
!"#$%&'()*+,-./:;<=>?@[\]^_{}~ |
すべての特殊文字(記号) |
?a |
?l?u?d?s |
すべての可能な文字 |
これらのプレースホルダーを組み合わせることで、複雑なマスクを作成できます。マスクの長さは、生成されるパスワード候補の長さに直接影響します。
次に、大文字 1 文字の後に数字 1 文字が続くパスワードの候補を生成してみましょう。この場合のマスクは ?u?d となります。
出力を確認するために、再度 --stdout オプションを使用します。
hashcat -a 3 ?u?d --stdout
Hashcat は、大文字 1 文字と数字 1 文字のすべての組み合わせを生成します。出力順序は、Hashcat の最適化アルゴリズムによりランダムに見える場合がありますが、A0 から Z9 までのすべての組み合わせが生成されます。
...
B4
C7
D2
...
これらの文字セットを組み合わせることで、テストしたいパスワードの正確なパターンを定義できます。
3 桁の PIN(NTLM ハッシュ)に対するマスク攻撃の実行
このステップでは、学んだ知識を現実世界のシナリオ、すなわち 3 桁の PIN のクラッキングに応用します。ここでは、NTLM 形式のパスワードハッシュを含むpin_hash.txtというファイルがあると仮定します。元のパスワードは 3 桁の数字であると推測しています。
まず、ハッシュファイルの内容を確認してみましょう。
cat pin_hash.txt
NTLM ハッシュが表示されます。
D2063C28444B9B742B9B89C282395EBF
これをクラックするためには、Hashcat に次の 3 つのことを伝える必要があります。
- 攻撃モードはマスク攻撃(
-a 3)であること。 - ハッシュタイプは NTLM(
-m 1000)であること。 - 3 桁の PIN のマスクは
?d?d?dであること。
これらを組み合わせて、攻撃を開始するための単一のコマンドを実行します。
hashcat -a 3 -m 1000 pin_hash.txt ?d?d?d
Hashcat が起動し、キー空間(000-999)が非常に小さいため、ほぼ瞬時にパスワードが見つかります。
...
D2063C28444B9B742B9B89C282395EBF:137
...
Status...........: Cracked
...
Hashcat はパスワード137を正常に復元しました。パスワードがクラックされると、Hashcat はそれを「potfile」と呼ばれるファイルに保存します。このハッシュタイプに対してクラックされたすべてのパスワードは、--showオプションを使用して表示できます。
hashcat -m 1000 pin_hash.txt --show
出力:
D2063C28444B9B742B9B89C282395EBF:137
既知のパスワードパターンに対するカスタムマスクの作成
このステップでは、より複雑なパスワードに取り組みます。ある企業が「パスワードは正確に 5 つの小文字で構成されなければならない」というパスワードポリシーを持っていると想像してください。そのパスワードの例はlabexです。
このようなパスワードの NTLM ハッシュがpattern_hash.txtファイルに格納されています。
まず、このパスワードポリシーを Hashcat のマスクに変換します。
- 5 文字すべてが小文字である必要があります:
?l?l?l?l?l
これにより、最終的なマスクは?l?l?l?l?lとなります。
次に、このマスクを使用してpattern_hash.txt内のハッシュをクラックします。コマンドは前のステップと似ていますが、新しいマスクを使用します。
hashcat -a 3 -m 1000 pattern_hash.txt ?l?l?l?l?l
Hashcat は、この特定のパターンに適合するすべての組み合わせのテストを開始します。これは、すべての 5 文字の組み合わせを試みる純粋な総当たり攻撃(ブルートフォースアタック)よりもはるかに効率的です。短時間でパスワードが見つかります。
...
2BF7D33EC706798E0308F5DF34BC7D2F:labex
...
Status...........: Cracked
...
正確に 5 つの小文字という必要なポリシーに一致するカスタムマスクを作成することにより、特定のパターンのパスワードを正常にクラックできました。
マスク攻撃と辞書攻撃のパフォーマンス比較
この最終ステップでは、先ほど実行したマスクアタックと、従来の辞書アタックを比較し、それぞれの長所を理解します。
辞書アタック(-a 0)は、パスワードがワードリスト内に存在する場合、非常に高速です。前のステップのパスワードを含む dict.txt という小さな辞書ファイルがあります。
pattern_hash.txt に対して辞書アタックを実行してみましょう。
hashcat -a 0 -m 1000 pattern_hash.txt dict.txt
labex が dict.txt に含まれているため、Hashcat はほぼ瞬時にそれを見つけます。
hashcat (v6.2.5) starting
OpenCL API (OpenCL 2.0 pocl 1.8 Linux, None+Asserts, RELOC, LLVM 11.1.0, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
=====================================================================================================================================
* Device #1: pthread-Intel(R) Xeon(R) Platinum 8575C, 6808/13680 MB (2048 MB allocatable), 4MCU
Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256
INFO: All hashes found in potfile! Use --show to display them.
Started: Sat Oct 11 16:05:20 2025
Stopped: Sat Oct 11 16:05:20 2025
Hashcat は、ハッシュが既に見つかり、potfile に保存されたことを通知します。クラックされたパスワードを確認するには、--show オプションを使用できます。
hashcat -a 0 -m 1000 pattern_hash.txt dict.txt --show
出力:
2bf7d33ec706798e0308f5df34bc7d2f:labex
では、マスクアタックが有利になるのはいつでしょうか?辞書アタックは、正確なパスワードがワードリストに存在する場合にのみ成功します。もしパスワードが testx であり、それが辞書になかった場合、アタックは失敗します。
しかし、ステップ 4 のマスクアタック(?l?l?l?l?l)は、辞書に存在するかどうかに関係なく、パターンに適合するすべてのパスワードを体系的に生成・テストするため、成功します。labex、testx、hello などをテストします。
結論:
- 辞書アタック (
-a 0): 一般的なパスワードをクラックする場合、または高品質でターゲットを絞ったワードリストを持っている場合に最適です。高速ですが、辞書の内容によって制限されます。 - マスクアタック (
-a 3): パスワードの構造やパターン(例:既知のパスワードポリシーから)がわかっている場合に最適です。辞書アタックよりもはるかに包括的であり、純粋な総当たり攻撃(brute-force attack)よりも無限に効率的です。
まとめ
この実験では、Hashcat の最も強力な機能の 1 つであるマスク攻撃について実践的な経験を積みました。
以下の点を学びました。
- マスク攻撃(
-a 3)の基本概念と、それがパターンに基づいてパスワード候補をどのように生成するか。 - Hashcat の組み込み文字セット(
?l、?u、?d、?s)を使用してマスクを構築する方法。 - 3 桁の PIN をクラックするために単純なマスクを適用する方法。
- 既知のパスワードポリシー(5 つの小文字)に基づいてカスタムマスクを作成し、特定のパターンのパスワードをクラックする方法。
- 標準的な辞書攻撃と比較した場合の、マスク攻撃を使用する上での主要な違いと戦略的な利点。
マスク攻撃は、辞書攻撃の速度と純粋な総当たり攻撃(ブルートフォースアタック)の網羅性の完璧なバランスを提供するものであり、すべてのセキュリティ専門家にとって不可欠なスキルです。



