John the Ripper のパフォーマンス最適化

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

はじめに

この実験では、強力なパスワードクラッキングツールである John the Ripper のパフォーマンスを最適化するためのさまざまなテクニックを探求します。効率的なパスワードクラッキングでは、利用可能なハードウェアリソースを効果的に活用することがしばしば必要となります。ここでは、John the Ripper を複数の CPU コアを利用するように設定する方法、GPU クラッキング機能の理解、正確なパフォーマンス測定のためのベンチマーク設定の調整、Hashcat との GPU パフォーマンスの比較、およびクラッキング操作中のシステムリソースの監視方法を学びます。これらのスキルは、サイバーセキュリティ、ペネトレーションテスト、またはシステム管理に関わるすべての人にとって不可欠であり、パスワード監査タスクの効率を最大化することを可能にします。

複数の CPU コアの活用

このステップでは、John the Ripper を複数の CPU コアを利用するように設定する方法を学びます。これにより、マルチコアプロセッサを搭載したシステムでのクラッキングプロセスを大幅に高速化できます。デフォルトでは、John the Ripper は利用可能なすべてのコアを使用しない場合があります。--fork オプションを使用して、使用する CPU コアの数を指定できます。

まず、コア数を指定せずに簡単なベンチマークを実行し、デフォルトのパフォーマンスを確認しましょう。

john --test=0

以下のような出力が表示され、さまざまなハッシュタイプのパフォーマンスが示されます。

Benchmarking: Traditional DES [32/32 BS SSE2-i]... DONE
Many calculations will be done, please be patient.
Raw:    100000 c/s real, 100000 c/s virtual
Benchmarking: BSDI DES [32/32 BS SSE2-i]... DONE
Raw:    100000 c/s real, 100000 c/s virtual
...

次に、John the Ripper に複数の CPU コアを使用するように明示的に指示して、再度ベンチマークを実行しましょう。システムで利用可能な CPU コアの数を確認するには、nproc コマンドを使用できます。

nproc

このコマンドは、利用可能なプロセッシングユニットの数を出力します。たとえば、2 と出力された場合、CPU コアは 2 つあります。

次に、利用したいコア数とともに --fork オプションを使用します。必要に応じて $(nproc) を実際のコア数に置き換えることもできますが、$(nproc) は動的です。

john --test=0 --fork=$(nproc)

2 つのベンチマークの「Raw」パフォーマンスの数値を比較してください。複数のコアを使用すると、特に CPU 負荷の高いハッシュタイプで、クラッキング速度が向上するはずです。--fork オプションは、個別のプロセスを作成し、それぞれがクラッキングタスクの一部を担当することで、並列処理を活用します。

最後に、複数のコアを使用してパスワードファイルをクラッキングしてみましょう。~/project ディレクトリに passwords.txt ファイルがあります。

john --wordlist=~/project/wordlist.txt --fork=$(nproc) ~/project/passwords.txt

クラッキングが完了したら、クラックされたパスワードを表示できます。

john --show ~/project/passwords.txt

このコマンドは、John the Ripper が正常にクラックしたパスワードを表示します。

GPU クラッキングのための John the Ripper の設定 (該当する場合)

このステップでは、John the Ripper を GPU クラッキング用に設定する方法について説明します。LabEx 環境は通常、一般的な実験用に専用の GPU リソースを提供しませんが、互換性のある GPU を搭載したシステムで John the Ripper を最適化するには、この概念を理解することが重要です。John the Ripper は、OpenCL および CUDA の実装を通じて GPU クラッキングをサポートしており、特定のハッシュタイプでは CPU クラッキングよりも大幅な高速化を提供できます。

お使いの John the Ripper のビルドが OpenCL または CUDA をサポートしているかを確認するには、次のコマンドを実行できます。

john --list=opencl-devices

OpenCL デバイスが検出された場合、以下のような出力が表示されます(この環境ではおそらく空です)。

No OpenCL devices found.

互換性のある GPU と OpenCL ドライバがインストールされているシステムでは、利用可能な GPU デバイスのリストが表示されます。たとえば次のようになります。

Device #0: NVIDIA GeForce RTX 3080, 10240MB, 1710MHz, 68CU

クラッキングに特定の GPU デバイスを利用するには、通常、OpenCL 対応フォーマット(例:raw-md5-opencl)とともに --format オプションを使用し、複数の GPU が存在する場合は --device オプションで特定の GPU を選択します。

たとえば、GPU が搭載されたシステムでは、次のように実行する場合があります。

john --format=raw-md5-opencl --wordlist=~/project/wordlist.txt ~/project/passwords.txt

注意: この LabEx 環境には GPU がないため、上記のコマンドは失敗するか、利用可能な場合は CPU フォールバックで実行される可能性が高いです。このステップの目的は、コマンドと概念を示すことであり、この特定の環境で実際の GPU クラッキングを実行することではありません。

John the Ripper が GPU クラッキングを試みるように設定されていることを確認するには、GPU 対応フォーマットでクラッキングコマンドを実行した際に、OpenCL または CUDA の初期化を示すメッセージを探します。

John the Ripper ベンチマーク設定の調整

このステップでは、John the Ripper のベンチマーク設定を調整して、より正確で関連性の高いパフォーマンス測定値を取得する方法を学びます。デフォルトのベンチマーク (john --test=0) は、さまざまなハッシュタイプに対して簡単なテストを実行します。ただし、特定のハッシュタイプや特定のベンチマーク時間を指定することもできます。これは、特定のクラッキングシナリオのパフォーマンスを測定したい場合に役立ちます。

まず、John the Ripper がサポートするすべての利用可能なハッシュフォーマットを一覧表示しましょう。これにより、ベンチマークしたい特定のフォーマットを特定できます。

john --list=formats

このコマンドは、サポートされているハッシュフォーマットの長いリストを出力します。たとえば次のようになります。

raw-md5
raw-sha1
raw-sha256
...

次に、たとえば raw-md5 のような特定のハッシュフォーマットをベンチマークしましょう。--format オプションを使用してフォーマットを指定できます。

john --test=0 --format=raw-md5

raw-md5 フォーマットに特化したベンチマーク結果が表示されます。

より安定した正確なベンチマークを取得するために、特にパフォーマンス比較を行う場合、--max-run-time オプションを使用してテストの実行時間を長くすることができます。このオプションは、ベンチマークの最大実行時間を秒単位で指定します。

raw-md5 のベンチマークを 10 秒間実行してみましょう。

john --test=0 --format=raw-md5 --max-run-time=10

「Raw」パフォーマンスの数値が、より長い実行時間で安定するか、より一貫した平均値を提供するかに注目してください。これは、異なるハードウェア構成や John the Ripper のビルドを比較する場合に特に役立ちます。

これをステップ 1 の --fork オプションと組み合わせて、指定された時間で特定のハッシュタイプのマルチコアパフォーマンスをベンチマークすることもできます。

john --test=0 --format=raw-md5 --fork=$(nproc) --max-run-time=10

これらのベンチマーク設定を調整することで、特定のクラッキングニーズに関連するより正確なパフォーマンスデータを取得し、ハードウェアのアップグレードや構成変更に関する情報に基づいた意思決定を行うことができます。

GPU における Hashcat と John the Ripper の比較

このステップでは、Hashcat と John the Ripper の違い、特に GPU クラッキング機能に関する違いについて説明します。どちらも強力なパスワードクラッキングツールですが、特に GPU の活用に関しては、それぞれ異なる強みと弱みがあります。

John the Ripper (JtR):

  • 強み: CPU ベースのクラッキングに優れており、多くの組み込みフォーマットで高い汎用性を持ち、シングルユーザーシステムに適しています。辞書攻撃や総当たり攻撃に重点を置いています。GPU サポート(OpenCL/CUDA)は統合されていますが、生の GPU パワーに関しては Hashcat ほど最適化されていない場合があります。
  • 弱み: GPU パフォーマンスは存在しますが、特定のハッシュタイプでは Hashcat の生の速度に常に匹敵するとは限りません。GPU の設定が、時にはそれほど簡単ではない場合があります。

Hashcat:

  • 強み: GPU ベースのパスワードクラッカーとして、最も高速で効率的であると広く認識されています。GPU(NVIDIA CUDA および AMD OpenCL の両方)での並列処理に高度に最適化されています。膨大な数のハッシュタイプと攻撃モードをサポートしています。
  • 弱み: 主に GPU に焦点を当てているため、CPU パフォーマンスは主な強みではありません。豊富なオプションと攻撃モードのため、初心者にとっては学習がより複雑になる可能性があります。

GPU クラッキングにおける主な違い:

  1. 最適化: Hashcat は GPU アクセラレーションのために特別に構築されており、同じハッシュタイプに対して John the Ripper よりも高いハッシュ/秒 (H/s) レートを GPU で達成することがよくあります。
  2. 使いやすさ: John the Ripper の GPU オプションは、既存のコマンドラインインターフェースに統合されています。Hashcat は独自の構文とオプションを持ち、GPU の制御に関して、より詳細な設定が可能です。
  3. コミュニティの焦点: Hashcat の開発とコミュニティは、GPU クラッキングパフォーマンスの最大化に重点を置いています。

どちらを使用するか:

  • John the Ripper は、一般的な CPU クラッキング、多くの組み込み機能を持つ汎用的なツールが必要な場合、または強力な GPU を搭載していないシステムで作業する場合に使用します。
  • Hashcat は、強力な GPU にアクセスでき、特にプロフェッショナルなペネトレーションテストや監査シナリオで、幅広いハッシュタイプに対して絶対的に最速のクラッキング速度が必要な場合に使用します。

例として、Hashcat がインストールされている場合(この環境ではデフォルトではありません)、GPU を使用して MD5 ハッシュをクラックする典型的なコマンドは次のようになります。

## This command is for illustration only and will not work without Hashcat installed
## hashcat -m 0 -a 0 ~/project/passwords.txt ~/project/wordlist.txt

ここで、-m 0 は MD5 ハッシュタイプを指定し、-a 0 は辞書攻撃を指定します。

これらの違いを理解することで、適切なツールを選択し、利用可能なハードウェアに基づいてパスワード監査タスクの効率を最大化することができます。

クラッキング中のシステムリソースの監視

このステップでは、John the Ripper がクラッキング操作を実行中にシステムリソースを監視する方法を学びます。CPU 使用率、メモリ使用率、ディスク I/O を監視することで、ボトルネックを特定し、システムが効率的に利用されていることを確認できます。これは、パフォーマンスの最適化と問題のトラブルシューティングに不可欠です。

まず、John the Ripper のクラッキングプロセスをバックグラウンドで開始しましょう。passwords.txt ファイルに対して簡単な辞書攻撃を使用します。

john --wordlist=~/project/wordlist.txt ~/project/passwords.txt &

末尾の & はプロセスをバックグラウンドに送り、ターミナルを使い続けることができます。表示されるプロセス ID (PID) に注意してください。例:[1] 12345

次に、top コマンドを使用して、システムの CPU およびメモリ使用率を監視しましょう。top は、実行中のシステムの動的なリアルタイムビューを提供します。

top

top の出力で、john プロセスを探します。その CPU 使用率 (%CPU) とメモリ使用率 (%MEM) が表示されます。John the Ripper がアクティブにクラッキングしている場合、特に複数のコアを使用している場合(マルチコアプロセスでは 100% を超える可能性があります)、%CPU の値が高くなるはずです。q を押して top を終了します。

プロセスの監視に役立つ別のコマンドは htop です。htop がインストールされていない場合は、インストールできます。

sudo apt install -y htop

インストールしたら、htop を実行します。

htop

htoptop よりもユーザーフレンドリーでインタラクティブなビューを提供し、コアごとの CPU 使用率、メモリ使用率、プロセスツリーを表示します。CPU またはメモリ使用率でプロセスを簡単に並べ替えることができます。john プロセスを探し、そのリソース消費を観察します。F10 または q を押して htop を終了します。

ディスク I/O を監視するには、iotop コマンドを使用できます。単語リストまたはハッシュファイルが非常に大きい場合、ディスクアクセスがボトルネックになる可能性があるため、これは特に役立ちます。iotop がインストールされていない場合は、インストールします。

sudo apt install -y iotop

次に iotop を実行します。

sudo iotop

iotop はリアルタイムのディスク I/O アクティビティを表示します。ディスクへの読み書きが頻繁に行われているかどうかを確認するために、john または関連プロセスを探します。q を押して iotop を終了します。

最後に、バックグラウンドの john プロセスをフォアグラウンドに戻して停止するか、まだ実行中の場合は単にキルしましょう。

fg
## プロセスを停止するには Ctrl+C を押します

fg が機能しない場合、または PID でキルしたい場合は次のようになります。

killall john

システムリソースを定期的に監視することで、John the Ripper がハードウェアを完全に活用しているかどうか、またはクラッキングに割り当てられる可能性のあるリソースを消費している他のプロセスがあるかどうかを特定できます。これにより、クラッキング設定を微調整して最適なパフォーマンスを得ることができます。

まとめ

この実験では、John the Ripper のパフォーマンスを最適化する実践的な経験を積みました。--fork オプションを使用して複数の CPU コアを活用し、クラッキングを高速化する方法を学びました。専用 GPU がない環境でも、John the Ripper を使用した GPU クラッキングの原則について議論し、OpenCL/CUDA サポートの重要性を強調しました。また、特定のハッシュタイプと期間の正確なパフォーマンスメトリックを取得するために、ベンチマーク設定を調整する方法も習得しました。さらに、GPU アクセラレーションクラッキングにおける John the Ripper と Hashcat の主な違いを理解し、さまざまなシナリオで最も適切なツールを選択できるようになりました。最後に、クラッキング操作中に CPU、メモリ、ディスク I/O などのシステムリソースを監視する方法を学びました。これは、ボトルネックを特定し、効率的なハードウェア利用を確保するために不可欠です。これらのスキルは、パスワード監査とセキュリティテストの効率を最大化したいすべての人にとって基本的です。