マスク攻撃でのカスタム文字セットの使用

Kali LinuxBeginner
オンラインで実践に進む

はじめに

この実験 (Lab) では、Hashcat の高度な機能であるマスク攻撃におけるカスタム文字セットについて探求します。Hashcat の組み込み文字セット (?l, ?u, ?d, ?s) は強力ですが、パスワードに使用される文字に関する特定の情報がある場合、非効率的になることがあります。例えば、パスワードが 'a', 'b', 'c', '1', '2', '3' の文字のみを含むことがわかっている場合、標準の ?l および ?d 文字セットを使用すると、多くの不要な文字をテストすることになります。

カスタム文字セットを使用すると、正確な文字セットを定義でき、検索空間を劇的に削減し、クラッキングプロセスを高速化できます。カスタム文字セットの定義方法、それを使用するマスクの作成方法、そしてユニークなパターンに従うパスワードハッシュをクラックするためのターゲット攻撃の実行方法を学びます。

組み込み文字セットの限界を理解する

このステップでは、Hashcat の組み込み文字セットと、それらが常に最も効率的なツールではない理由について学びます。

Hashcat は、マスク攻撃において異なる種類の文字を表すために、文字セット (charsets) と呼ばれるプレースホルダーを使用します。

  • ?l = abcdefghijklmnopqrstuvwxyz
  • ?u = ABCDEFGHIJKLMNOPQRSTUVWXYZ
  • ?d = 0123456789
  • ?s = !"#$%&'()*+,-./:;<=>?@[]^_`{|}~
  • ?a = 上記すべてを組み合わせたもの

これらは一般的なケースでは役立ちますが、パスワードが非常に特定の限定された文字セットで構成されていることがわかっている場合、これらの広範な文字セットを使用するのは非効率的です。

まず、クラックする必要があるターゲットハッシュを調べましょう。セットアップスクリプトは、現在のディレクトリ (~/project) に hash.txt という名前のファイルを既に作成しています。

その内容を表示します。

cat hash.txt

以下の MD5 ハッシュが表示されるはずです。

2a5c3a657a73613391a8e58f1a43161e

このハッシュは、l, a, b, e, x, 1, 2, 3 の文字のみで構成される 8 文字のパスワードに対応しています。組み込みの ?l および ?d 文字セットを使用した場合、Hashcat は既知の 8 文字だけではなく、すべての 26 個の小文字と 10 個の数字を試すのに時間を浪費することになります。次のステップでは、この問題を解決するためにカスタム文字セットを作成します。

--custom-charset1 でカスタム文字セットを定義する

このステップでは、パスワードに含まれることがわかっている文字に正確に一致するカスタム文字セットを定義します。

Hashcat では、コマンドラインオプション --custom-charset1--custom-charset2--custom-charset3--custom-charset4 を使用して、最大 4 つのカスタム文字セットを定義できます。

今回のシナリオでは、パスワードは labex123 のセットの文字のみで構成されていることがわかっています。これを最初のカスタム文字セットとして定義できます。

この仕組みを確認するためにコマンドを構築しましょう。実際の攻撃を実行する代わりに、生成されたパスワード候補を画面に出力するために --stdout オプションを使用します。また、最初の数個の結果のみを表示するために head も使用します。

カスタム文字セットを使用して 3 文字のパスワードを生成するには、次のコマンドを実行します。

hashcat --stdout -a 3 --custom-charset1 labex123 ?1?1?1 | head -n 5

このコマンドの内訳を見てみましょう。

  • --stdout: 生成された候補をコンソールに出力します。
  • -a 3: マスク攻撃を指定します。
  • --custom-charset1 labex123: ?1 をカスタム文字セットとして定義します。
  • ?1?1?1: マスク。これは、Hashcat に ?1 で定義されたセットから各文字を取得した 3 文字の候補を生成するように指示します。

以下のような出力が表示され、指定した文字のみが使用されていることがわかります。

lll
lla
llb
lle
llx

これで、ターゲット攻撃のためのカスタム文字セットの定義方法が理解できました。

カスタム文字セット ?1 を利用するマスクを作成する

このステップでは、前のステップで定義したカスタム文字セットを使用するマスクを構築します。

カスタム文字セットは、使用した --custom-charset<N> オプションに対応するプレースホルダー ?1?2?3?4 を使用してマスク内で参照されます。--custom-charset1 を使用したので、マスクでは ?1 を使用します。

ターゲットパスワードは 8 文字であり、すべての文字がカスタムセットからのものであることを知っています。したがって、正しいマスクは ?1 を 8 回繰り返したものです。

明確さと再利用性のために、マスクをファイルに保存することは良い習慣です。mask.txt という名前のファイルを作成し、その中にマスクを配置しましょう。

ファイルを作成するには、次のコマンドを実行します。

echo "?1?1?1?1?1?1?1?1" > mask.txt

次に、ファイルの内容を確認して、それが正しいことを確認します。

cat mask.txt

出力は入力した内容と完全に一致するはずです。

?1?1?1?1?1?1?1?1

マスクファイルが準備できたので、攻撃を開始する準備が整いました。

カスタム文字セットを使用したマスク攻撃の実行

これで、カスタム文字セットとマスクファイルを使用してマスク攻撃を開始するために、すべてを組み合わせます。

hash.txt にハッシュがあり、カスタム文字セットが定義されており、mask.txt にマスクがあります。最終的な Hashcat コマンドを組み立てましょう。

攻撃を開始するには、ターミナルで次のコマンドを実行します。

hashcat -m 0 -a 3 hash.txt --custom-charset1 labex123 mask.txt

完全なコマンドの内訳は次のとおりです。

  • -m 0: ハッシュタイプが MD5 であることを指定します。
  • -a 3: マスク攻撃モードを選択します。
  • hash.txt: ターゲットハッシュを含む入力ファイルです。
  • --custom-charset1 labex123: カスタム文字セット ?1 を定義します。
  • mask.txt: マスク ?1?1?1?1?1?1?1?1 を含むファイルです。

Hashcat は攻撃を開始します。カスタム文字セットは非常に限定的であるため、キー空間は小さく、攻撃は非常に迅速に完了するはずです。進行状況を示す出力が表示され、最終的に Cracked というステータスが表示されます。

...
Session..........: hashcat
Status...........: Cracked
Hash.Name........: MD5
Hash.Target......: 2a5c3a657a73613391a8e58f1a43161e
Time.Started.....: ...
Time.Estimated...: 0 secs (0.00ms)
Guess.Mask.......: ?1?1?1?1?1?1?1?1 [8]
Guess.Charset....: Custom Charset 1: 'labex123', len=8
Speed.#1.........:  ... H/s (0.00ms) @ Accel:1 Loops:1 Thr:1 Vec:1
Recovered........: 1/1 (100.00%) Digests, 1/1 (100.00%) Salts
Progress.........: 16777216/16777216 (100.00%)
Rejected.........: 0/16777216 (0.00%)
Restore.Point....: 1/1 (100.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidates.#1....: labex123 -> labex123
Hardware.Mon.#1..: Util:  0%

Started: ...
Stopped: ...

攻撃は完了し、成功しました。次のステップでは、クラックされたパスワードを確認します。

クラックされたパスワードがカスタムパターンと一致することを確認する

この最終ステップでは、クラックされたパスワードを表示し、期待されるパターンと一致することを確認します。

Hashcat は、成功したクラックパスワードを自動的に「potfile」(ハッシュとパスワードを「ポット」するため)と呼ばれるファイルに保存します。これにより、将来同じハッシュを再クラックすることが防止されます。指定されたハッシュファイルに対するクラックされたパスワードを表示する最も簡単な方法は、--show オプションを使用することです。

hash.txt のハッシュに対するクラックされたパスワードを表示するには、次のコマンドを実行します。

hashcat -m 0 --show hash.txt

このコマンドは、Hashcat に hash.txt からのハッシュを potfile で検索し、対応する平文パスワードを表示するように指示します。

出力は明確でシンプルになります。

2a5c3a657a73613391a8e58f1a43161e:labex123

ご覧のとおり、クラックされたパスワードは labex123 です。これは 8 文字であり、定義したカスタム文字セット labex123 の文字のみが含まれていることに注意してください。これにより、ターゲットとしたマスク攻撃が成功し、非常に効率的であったことが確認できます。

まとめ

この実験では、Hashcat を使用した強力で効率的なパスワードクラッキング技術を学びました。

まず、特定の既知の文字セットを持つパスワードに対する Hashcat の組み込み文字セットの制限を理解しました。次に、--custom-charset1 オプションを使用して独自の文字セットを定義し、マスクで ?1 を使用して参照する方法を学びました。マスクファイルを作成し、ターゲット攻撃を開始することで、MD5 ハッシュを数秒でクラックすることができました。

カスタム文字セットを使用するこの方法は、パスワードの構造に関する情報がある場合の効率的なパスワード監査と回復に不可欠であり、攻撃に必要な時間と計算リソースを大幅に削減します。