John the Ripper とハードウェアアクセラレーション(GPU)

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

はじめに

この実験では、John the Ripper (JtR) とグラフィックス処理ユニット (GPU) を組み合わせた強力なパスワードクラッキングの高速化を探求します。従来の CPU ベースのクラッキングは、特に複雑なパスワードの場合、遅くなる可能性があります。GPU は、その大規模な並列処理能力により、パスワードをクラックするのに必要な時間を劇的に短縮できます。

まず、GPU クラッキングの基本原則を理解し、次に環境設定の実践的な手順に進みます。これには、CUDA や OpenCL などの必要な GPU ドライバーとフレームワークのインストールが含まれます。次に、John the Ripper を GPU を利用するように設定し、そのパフォーマンスをベンチマークし、一般的なトラブルシューティング技術を学びます。この実験の終わりまでに、John the Ripper で GPU アクセラレーションを効果的に使用する方法について、確かな理解を得られるでしょう。

GPU クラッキングの原則を理解する

このステップでは、GPU がパスワードクラッキングを高速化できる基本的な原則を学びます。

GPU は並列処理のために設計されており、多くの計算を同時に実行できます。このアーキテクチャは、パスワードクラッキングのようなタスクに理想的です。パスワードクラッキングでは、同じ操作(例:パスワード候補のハッシュ化)を数百万回または数十億回実行する必要があります。

主要な概念:

  • 並列処理 (Parallelism): 逐次的なタスクに長けた CPU とは異なり、GPU は数千の小さなコアを持ち、問題の独立した部分に同時に取り組むことができます。パスワードクラッキングでは、各コアが異なるパスワード候補をテストできます。
  • ハッシュアルゴリズム (Hashing Algorithms): パスワードクラッキングには、候補パスワードを繰り返しハッシュ化し、その結果を既知のハッシュと比較することが含まれます。多くのハッシュアルゴリズム(MD5、SHA-1、bcrypt、scrypt など)は計算負荷が高く、GPU アクセラレーションに適しています。
  • CUDA/OpenCL: これらは、ソフトウェア開発者が GPU を汎用処理に使用できるようにする並列コンピューティングプラットフォームおよびプログラミングモデルです。
  • CUDA (Compute Unified Device Architecture): NVIDIA によって開発された、NVIDIA GPU 向けのプロプライエタリプラットフォームです。
  • OpenCL (Open Computing Language): 異なるベンダーの異種プラットフォーム(CPU、GPU、FPGA など)全体での並列プログラミングのためのオープンスタンダードです。John the Ripper は両方をサポートしています。

仕組み:

  1. ハッシュのロード: John the Ripper は、ターゲットのパスワードハッシュを GPU のメモリにロードします。
  2. 候補の生成: GPU は、多数のパスワード候補(例:単語リストから、または総当たり攻撃によって)を生成します。
  3. ハッシュ化と照合: 各 GPU コアは、割り当てられた候補を同時にハッシュ化し、生成されたハッシュをターゲットハッシュと比較します。
  4. クラックの報告: 一致が見つかった場合、クラックされたパスワードが報告されます。

この並列実行により、一致するパスワードを見つけるのに必要な時間が大幅に短縮されます。

GPU ドライバーと CUDA/OpenCL のインストール

このステップでは、必要なドライバーと OpenCL フレームワークをインストールして、LabEx 環境を GPU アクセラレーション用に準備します。LabEx 環境は仮想化されており、物理 GPU への直接アクセスがない場合があるため、John the Ripper の GPU モジュールに不可欠な OpenCL 開発ライブラリをインストールすることでセットアップをシミュレートします。

まず、パッケージリストを更新して、最新バージョンのソフトウェアを取得します。

sudo apt update

次に、ocl-icd-opencl-devパッケージをインストールします。このパッケージは、OpenCL Installable Client Driver (ICD) ローダーと開発ファイルを提供します。これらは、John the Ripper のようなアプリケーションが OpenCL 互換デバイスと対話するために不可欠です。

sudo apt install -y ocl-icd-opencl-dev

インストール後、OpenCL ライブラリが存在することを確認できます。clinfoでクエリできる物理 GPU はありませんが、開発ファイルが存在することは、システムが OpenCL アプリケーションをコンパイルおよび実行できるようにセットアップされていることを示しています。

ls -l /usr/lib/x86_64-linux-gnu/libOpenCL.so

以下のような出力が表示され、ライブラリが存在することを確認できるはずです。

lrwxrwxrwx 1 root root 19 Mar 28  2023 /usr/lib/x86_64-linux-gnu/libOpenCL.so -> libOpenCL.so.1.0.0

このステップにより、John the Ripper が検出および利用できる基本的な OpenCL コンポーネントが利用可能になります。

John the Ripper を GPU 利用のために設定する

このステップでは、John the Ripper をインストールし、OpenCL を検出する能力を確認します。LabEx 環境には物理 GPU がないかもしれませんが、John the Ripper の OpenCL モジュールは存在し、設定可能です。

まず、John the Ripper をインストールします。

sudo apt install -y john

インストール後、John the Ripper の機能を確認し、特に OpenCL サポートを探します。John the Ripper のjohn --list=opencl-devicesコマンドは、検出された OpenCL デバイスを一覧表示するために使用されます。物理 GPU のない仮想環境では、実際のデバイスは一覧表示されないかもしれませんが、コマンド自体が OpenCL モジュールが John the Ripper にコンパイルされていることを確認します。

john --list=opencl-devices

「No OpenCL devices found.」のような出力が表示されるかもしれませんが、これはこの仮想環境では予想されることです。重要なのは、コマンドがエラーなく実行され、JtR の OpenCL 機能が存在することを確認することです。

No OpenCL devices found.

次に、クラッキングの準備としてダミーのハッシュファイルを作成します。デモンストレーションのために、簡単な MD5 ハッシュを使用します。

echo "testuser:5d41402abc4b2a76b9719d911017c592" > ~/project/hashes.txt

これにより、~/projectディレクトリにパスワード「hello」のハッシュを含むhashes.txtファイルが作成されます。

それでは、John the Ripper を使用してハッシュをクラックしてみましょう。物理 GPU がなくても、John the Ripper は利用可能な OpenCL 対応モジュールを使用しようとし、デバイスが見つからない場合は CPU にフォールバックします。

john --format=raw-md5 ~/project/hashes.txt --wordlist=/usr/share/john/password.lst

John the Ripper がハッシュを処理していることを示す出力が表示されるはずです。パスワード「hello」がデフォルトの単語リストに含まれている場合、クラックされます。

Using default input encoding: UTF-8
Loaded 1 password hash (Raw-MD5 [MD5])
Cost 1 (iteration count) is 1 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
hello            (testuser)
1g 0:00:00:00 DONE (2024-01-01 12:00) 100.0% 1000000g/s 1000000p/s 1000000c/s 1000000C/s testuser
Session completed.

このステップにより、John the Ripper がインストールされ、その OpenCL コンポーネントが認識され、ハッシュを処理できることが確認されます。

GPU クラッキングパフォーマンスのベンチマーク

このステップでは、John the Ripper のパフォーマンスをベンチマークする方法を学びます。仮想化された環境で物理 GPU がない場合でも、ベンチマークプロセスを理解することは、実際のシナリオにおいて非常に重要です。John the Ripper には、さまざまなハッシュタイプのテストを実行できる組み込みのベンチマークツールがあります。

John the Ripper をベンチマークするには、--testオプションを使用します。このコマンドは、さまざまなハッシュアルゴリズムに対して一連のテストを実行し、それぞれのクラッキング速度(1 秒あたりの推測回数)を表示します。

john --test

出力は広範囲にわたり、さまざまなハッシュタイプのパフォーマンスが表示されます。OpenCL デバイスが検出された場合は、説明に「OpenCL」が含まれる行を探してください。物理 GPU が存在しない場合でも、John the Ripper はコンパイルされたモジュールに基づいて理論上の OpenCL パフォーマンスを報告する場合があります。

出力例(簡潔にするために省略):

Benchmarking: Raw-MD5 [MD5]... DONE
Many salts:     1000000 c/s real, 1000000 c/s virtual

Benchmarking: bcrypt ($2*$, $2a$, $2x$, $2y$, $2b$) [Blowfish OpenCL]... DONE
Many salts:     1000000 c/s real, 1000000 c/s virtual
Only one salt:  1000000 c/s real, 1000000 c/s virtual

c/s(candidates per second)またはp/s(passwords per second)の値は、クラッキング速度を示します。強力な GPU を備えた実際の環境では、GPU アクセラレーションアルゴリズムの場合、CPU のみのベンチマークと比較してこれらの数値は大幅に高くなります。

特定のハッシュタイプ(例:raw-md5)をベンチマークして、より焦点を絞った結果を得ることもできます。

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

このコマンドは、raw-md5フォーマットのベンチマークを specifically に実行します。--test=0オプションは短時間ベンチマークを実行し、これはクイックチェックに便利です。

これらのベンチマーク結果を理解することは、GPU セットアップの効果を評価し、さまざまなハードウェア構成を比較するための鍵となります。

GPU クラッキング問題のトラブルシューティング

このステップでは、John the Ripper と GPU アクセラレーションに関する一般的なトラブルシューティング手法を学びます。LabEx 環境には物理 GPU がありませんが、これらのステップを理解することは、実際のアプリケーションにとって非常に重要です。

一般的な問題と解決策:

  1. 「No OpenCL devices found」または「CUDA error」:

    • 原因: GPU ドライバーが正しくないか、または欠落している、あるいは OpenCL/CUDA SDK が適切にインストールされていない。
    • 解決策: GPU ドライバーが最新であり、正しくインストールされていることを確認してください。NVIDIA GPU の場合は、CUDA Toolkit をインストールしてください。AMD/Intel GPU の場合は、OpenCL ドライバーがインストールされていることを確認してください。仮想環境では、仮想 GPU が公開されていない場合、このメッセージは予想されるものです。
    • 確認: デバイス検出を確認するために、john --list=opencl-devices または nvidia-smi (NVIDIA の場合) を実行してください。
  2. パフォーマンスが低い:

    • 原因: ドライバーが古い、GPU メモリが不足している、または GPU で CPU 最適化されたハッシュタイプを使用している。
    • 解決策: ドライバーを更新してください。選択したハッシュタイプと単語リストに対して、GPU に十分なメモリがあることを確認してください。一部のハッシュタイプ(例:bcrypt、scrypt)は、意図的に遅く、メモリ集約型になるように設計されており、MD5 のような単純なハッシュと比較して GPU での効率が低下します。
    • 確認: john --test を使用してパフォーマンスをベンチマークし、GPU の期待値と比較してください。
  3. クラッシュまたはフリーズ:

    • 原因: 過熱、不安定なオーバークロック、またはドライバーの競合。
    • 解決策: GPU の温度を監視してください。適用されている場合はオーバークロックを減らしてください。ドライバーをクリーンに再インストールしてください。
    • 確認: GPU の使用状況と温度を監視するために、watch -n 1 nvidia-smi (NVIDIA の場合) を使用してください。
  4. John the Ripper が GPU を使用しない:

    • 原因: JtR が GPU サポート付きでコンパイルされていない、または特定のハッシュフォーマットが JtR の GPU モジュールでサポートされていない。
    • 解決策: 正しい JtR バージョン(利用可能な場合はjohn-openclまたはjohn-cuda、あるいは GPU フラグ付きでソースからビルドしたもの)をインストールしたことを確認してください。クラックしようとしているハッシュフォーマットに、JtR の OpenCL/CUDA 実装があることを確認してください。
    • 確認: john --list=formats を実行し、説明にOpenCLまたはCUDAが含まれるフォーマットを探してください。

トラブルシューティング手順のシミュレーション:

問題が発生し、OpenCL をサポートしていることを確認するために John the Ripper のバージョンを確認する必要があったと仮定しましょう。

john --version

このコマンドは、インストールされている John the Ripper のバージョンを出力します。これにより、GPU サポートが含まれるビルドを持っているかどうかを特定するのに役立ちます。

John the Ripper 1.9.0-jumbo-1 (linux-gnu)
Copyright (c) 1996-2023 by Solar Designer and others
...

これらの一般的な問題とその解決策を理解することは、実際のシナリオで John the Ripper を GPU アクセラレーションと共に使用する際に問題を効果的にトラブルシューティングするのに役立ちます。

まとめ

この実験では、John the Ripper と GPU ハードウェアアクセラレーションを活用して、より高速なパスワードクラッキングを行う方法について包括的な理解を得ました。まず、GPU 並列処理の基本原則と、OpenCL のようなフレームワークの役割を探りました。

次に、必要な OpenCL 開発ライブラリのインストールを含む、環境設定の実践的なステップに進みました。John the Ripper のインストール方法、OpenCL 機能の検証、基本的なハッシュクラッキングの実行方法を学びました。さらに、パフォーマンスを評価するための John the Ripper の組み込みベンチマークツールを探求し、GPU クラッキング問題に関する一般的なトラブルシューティング手法について議論しました。

この実験を完了することで、John the Ripper で GPU アクセラレーションを効果的に活用するための知識を習得し、実際のシナリオにおけるパスワードクラッキング能力を大幅に向上させることができます。