John the Ripper Potfile からハッシュをクラックする

DockerBeginner
オンラインで実践に進む

はじめに

John the Ripper (JtR) は、広く使われているパスワードクラッキングツールです。パスワードをクラックすることに成功すると、その結果を john.pot というファイルに保存します。これは「potfile」とも呼ばれます。これにより、JtR は将来同じハッシュを再クラックしようとして時間を無駄にすることを防ぎます。

この実験では、John the Ripper によってパスワードクラッキングの試みが部分的に完了しているシナリオで作業します。あなたのタスクは、どのハッシュがクラックされなかったかを特定し、その後、別の強力なツールである Hashcat を使用して、残りのハッシュをクラックしようとすることです。このワークフローは、ペネトレーションテストやセキュリティ監査で一般的であり、複数のツールを使用して結果を最大化します。

以下のことを学びます:

  • JtR の potfile を見つけ、理解する。
  • コマンドラインツールを使用してハッシュリストを抽出し、比較する。
  • Hashcat を使用して、残りのハッシュに対して辞書攻撃を実行する。

既存の John the Ripper Potfile を特定する

このステップでは、john.pot ファイルを特定し、検査します。このファイルは、John the Ripper がクラックに成功したハッシュとその平文パスワードを保存するために自動的に作成されます。このファイルのデフォルトの場所は、ユーザーのホームディレクトリにある .john という名前の隠しディレクトリ内です。

私たちの実験環境には、シミュレートされた以前のクラッキングセッションからの john.pot ファイルが事前に設定されています。その内容を見てみましょう。

cat コマンドを使用して、potfile の内容を表示します。すべての作業はデフォルトの ~/project ディレクトリで行われますが、potfile は /home/labex/.john/ にあります。

cat ~/.john/john.pot

JtR が既に検出したハッシュと対応するパスワードを示す、以下の出力が表示されるはずです。

$1$abc$gqNud23o1vjR/pYd9gH7k/:password123
$1$def$H9g2s3kLd/fG1hJkLpQ9r/:labex
$1$ghi$aB4c5dE6fG7hI8jK9lM0n/:secret

JtR Potfile のフォーマットを理解する

このステップでは、john.pot ファイルの構造を分析します。このフォーマットを理解することは、そのデータを処理するために不可欠です。

前のステップで見たように、potfile の各行は特定のフォーマットを持っています:

HASH:PLAINTEXT_PASSWORD

ファイルから最初の行を分解してみましょう:

$1$abc$gqNud23o1vjR/pYd9gH7k/:password123

  • $1$abc$gqNud23o1vjR/pYd9gH7k/: これはクラックされた完全なハッシュ文字列です。このフォーマット($1$ で始まる)は、古い Linux システムで一般的に使用される MD5-crypt ハッシュであることを示しています。
  • :: コロンは区切り文字として使用され、ハッシュとパスワードを分離します。
  • password123: これはハッシュに対応する平文パスワードです。

私たちの目標は、元のリスト (all_hashes.txt) のどのハッシュがこの potfile に 存在しない かを見つけることです。そのためには、まず john.pot の各行からハッシュ部分のみを分離する必要があります。これは次のステップで行います。このステップは概念的な理解のためのものであり、実行するコマンドはありません。

JtR Potfile からハッシュを抽出する

このステップでは、john.pot ファイルからハッシュ値のみを抽出します。ファイルの各行からセクションを切り出すための標準的な Linux ユーティリティである cut コマンドを使用できます。

cut にコロン (:) を区切り文字として使用し、最初のフィールド (-f1) を抽出するように指示します。出力は、現在のディレクトリ (~/project) に cracked_hashes.txt という名前の新しいファイルにリダイレクトします。

ターミナルで次のコマンドを実行してください:

cut -d: -f1 ~/.john/john.pot > cracked_hashes.txt

これで、ファイルの内容を表示して、ファイルが正しく作成されたことを確認します:

cat cracked_hashes.txt

出力にはハッシュ文字列のみが含まれているはずです:

$1$abc$gqNud23o1vjR/pYd9gH7k/
$1$def$H9g2s3kLd/fG1hJkLpQ9r/
$1$ghi$aB4c5dE6fG7hI8jK9lM0n/

Hashcat 攻撃用にハッシュを再フォーマットする

このステップでは、JtR がクラックできなかったハッシュを特定します。すべての元のハッシュを含むファイル (all_hashes.txt) と、すでにクラックされたハッシュを含むファイル (cracked_hashes.txt) があります。これらの 2 つのファイルを比較することで、クラックされていないハッシュのみを含む新しいリストを作成できます。

これを達成するために grep コマンドを使用します。使用するフラグは次のとおりです:

  • -v: マッチを反転させ、一致しない行を選択します。
  • -F: パターンを正規表現ではなく固定文字列として扱います。
  • -f file: 指定されたファイルからパターンを取得します。

このコマンドは、cracked_hashes.txt からパターンを読み取り、all_hashes.txt から一致する行をすべて削除し、結果を uncracked_hashes.txt に保存します。

grep -v -F -f cracked_hashes.txt all_hashes.txt > uncracked_hashes.txt

次に、新しいファイルの内容を確認します。potfile に含まれていなかった 3 つのハッシュが含まれているはずです。

cat uncracked_hashes.txt

次の出力が表示されるはずです:

user4:$1$jkl$oP1qR2sT3uV4wX5yZ6a7b/
user5:$1$mno$c8d9e0f1g2h3i4j5k6l7m/
user6:$1$pqr$n9o8p7q6r5s4t3u2v1w0x/

このファイルは、Hashcat で使用する準備ができました。

JtR が見逃したハッシュに対して Hashcat を使用してクラックを試みる

この最終ステップでは、Hashcat を使用して残りのハッシュを攻撃します。Hashcat は、GPU を活用して大幅なパフォーマンス向上を実現できる、非常に高速で汎用性の高いパスワードクラッカーです。

Hashcat を使用した辞書攻撃の基本的な構文は hashcat -m <mode> <hash_file> <wordlist_file> です。

  • -m 500: ハッシュタイプを指定します。500 は MD5-crypt に対応しており、これは現在扱っているハッシュのタイプです。
  • --force: このラボのような仮想化またはコンテナ化された環境では、警告をバイパスし、Hashcat の実行を強制するためにこのオプションが必要になることがよくあります。

次に、提供された wordlist.txt を使用して、uncracked_hashes.txt ファイルに対して Hashcat を実行します。

hashcat -m 500 --force uncracked_hashes.txt wordlist.txt

Hashcat が開始されます。実行中にステータス情報が表示されます。単語リストが小さく、正しいパスワードが含まれているため、プロセスは非常に高速です。

...
Session..........: hashcat
Status...........: Running
Hash.Name........: md5crypt, MD5 (Unix), Cisco-IOS $1$ (MD5)
Hash.Target......: uncracked_hashes.txt
...
Approaching final keyspace - workload adjusted.

Session..........: hashcat
Status...........: Cracked
...

Hashcat が完了すると、クラックされたパスワードは独自の potfile に保存されます。新しくクラックされたパスワードを表示するには、--show オプションを使用できます。

hashcat -m 500 --force --show uncracked_hashes.txt

出力には、ハッシュとその新しく発見された平文パスワードが表示されます。

$1$jkl$oP1qR2sT3uV4wX5yZ6a7b/:dragon
$1$mno$c8d9e0f1g2h3i4j5k6l7m/:qwerty
$1$pqr$n9o8p7q6r5s4t3u2v1w0x/:sunshine

おめでとうございます。一方のクラッキングツールの出力を、もう一方の入力として使用することに成功しました!

まとめ

この実験では、異なるパスワードクラッキングツールの強みを組み合わせる実践的なワークフローを学びました。以前のクラッキングセッションの結果を表す、既存の John the Ripper potfile から開始しました。

以下のことを成功させました:

  • john.pot ファイルの内容を特定し、解釈しました。
  • cut コマンドを使用して特定のデータフィールドを抽出しました。
  • grep コマンドを使用して 2 つのリストを比較し、クラックされていないハッシュを分離しました。
  • 残りのハッシュに対して Hashcat 辞書攻撃を開始し、成功裏にクラックしました。

残りの作業を特定し、それを別のツールに渡すというこのプロセスは、実際のセキュリティ評価において非常に効率的な戦略であり、より広範囲をカバーし、成功の可能性を高めることができます。