openssl2john を使って OpenSSL ファイルのパスワードを解析する 🕵️‍♀️

セキュリティツール

はじめに

現代のデジタル社会において、ファイルの暗号化は非常に重要です。特に、秘密鍵や証明書などの機密情報を含むファイルは、不正アクセスから保護するためにパスワードで暗号化されることがよくあります。OpenSSL は、これらのファイルを暗号化するための一般的なツールですが、もし設定したパスワードを忘れてしまったらどうなるでしょうか?あるいは、セキュリティ監査の一環として、パスワードの強度をテストする必要がある場合は? 🤔

ここで登場するのが John the Ripper (JtR) という強力なパスワードクラッキングツールスイートと、その中に含まれる openssl2john というユーティリティです。

openssl2john は、OpenSSL で暗号化されたファイルからパスワードハッシュ情報を抽出し、John the Ripper が解析できる形式に変換する役割を担います。この記事では、openssl2john の基本的な使い方から、具体的なファイル形式ごとの利用例、そして倫理的な側面まで、詳しく解説していきます。パスワードリカバリやセキュリティテストに役立つ知識を身につけましょう! 💪

⚠️ 重要:倫理的な利用について

パスワードクラッキングツールは、自身が所有するファイルや、明示的な許可を得たシステムに対してのみ使用してください。許可なく他者のファイルやシステムにこれらのツールを使用することは、法律で禁止されており、重大な倫理違反となります。この記事は、正当な目的(パスワードリカバリや許可されたセキュリティテスト)での利用を前提として解説します。

openssl2john とは?

openssl2john は、広く使われているオープンソースのパスワードクラッキングツールである John the Ripper (JtR) スイートに含まれるユーティリティの一つです。John the Ripper 本体は、様々な種類のパスワードハッシュを解析(クラック)することに特化していますが、直接暗号化されたファイルを扱うことはできません。

そこで、openssl2john のような補助ツールが必要になります。openssl2john の主な役割は、OpenSSL を使用してパスワードベースで暗号化されたファイル(特に秘密鍵ファイルなど)を読み込み、そのファイルからパスワード検証に必要な情報(ハッシュ、ソルト、暗号化パラメータなど)を抽出することです。そして、抽出した情報を John the Ripper が理解できる特定のフォーマットに変換して出力します。この出力結果を John the Ripper に入力することで、元のパスワードの解析が可能になります。

具体的には、以下のような OpenSSL 関連ファイル形式からハッシュ情報を抽出できます。

  • パスワードで暗号化された PEM 形式の秘密鍵 (RSA, DSA, EC など)
  • パスワードで暗号化された PKCS#8 形式の秘密鍵
  • PKCS#12 (PFX) ファイル (.p12, .pfx) – ※ JtR のバージョンや構成によっては pfx2john という別のツールが使われることもあります。
  • OpenSSL のコマンドラインツール (openssl enc など) で暗号化されたファイル

これらのファイルは、通常、SSL/TLS 通信、SSH 接続、デジタル署名、ファイルの暗号化などに使用される重要な要素を含んでいるため、パスワードを忘れた場合の回復手段や、セキュリティ強度評価のために openssl2john が役立ちます。

💡 補足: John the Ripper は非常に多くのハッシュ形式に対応しており、openssl2john 以外にも ssh2john (SSH 秘密鍵用), zip2john (ZIP ファイル用), pdf2john (PDF ファイル用) など、様々なファイル形式からハッシュを抽出するためのツールが JtR の “jumbo” バージョンには同梱されています。

インストール方法 💻

openssl2john は通常、John the Ripper (JtR) の一部として提供されます。特に、多くの追加機能やハッシュ形式に対応した “Jumbo” バージョンに含まれています。したがって、openssl2john を利用するには、John the Ripper (Jumbo) をインストールする必要があります。

インストール方法は、お使いのオペレーティングシステムによって異なります。

1. パッケージマネージャーを使用する (推奨)

多くの Linux ディストリビューションや macOS (Homebrew 使用) では、パッケージマネージャーを使って簡単にインストールできます。

  • Debian / Ubuntu / Kali Linux:
    sudo apt update
    sudo apt install john

    Kali Linux など、一部のペネトレーションテスト用ディストリビューションでは、デフォルトでインストールされている場合があります。

  • Fedora / CentOS / RHEL:
    sudo dnf install john  # Fedora
    sudo yum install john  # CentOS/RHEL (EPEL リポジトリが必要な場合あり)
  • macOS (Homebrew):
    brew update
    brew install john-jumbo

    Homebrew では、Jumbo 版が john-jumbo として提供されることが多いです。

パッケージマネージャーでインストールした場合、openssl2john スクリプト (通常は Python スクリプト) は、/usr/bin/, /usr/sbin/, /usr/share/john/, /opt/homebrew/share/john/ (macOS Homebrew M1/M2) などのパスに配置されることが多いです。場所がわからない場合は、find コマンドなどで探してみてください。

sudo find / -name openssl2john\* 2>/dev/null

2. ソースコードからコンパイルする

最新バージョンを利用したい場合や、お使いのディストリビューションのパッケージが古い場合は、GitHub の John the Ripper リポジトリからソースコードをクローンしてコンパイルすることも可能です。

  1. リポジトリをクローン:
    git clone https://github.com/openwall/john -b bleeding-jumbo john
    cd john/src

    (bleeding-jumbo ブランチが最新の開発版です)

  2. 依存関係のインストール:

    コンパイルに必要なライブラリ (OpenSSL の開発ファイル、libgmp など) をインストールします。必要なパッケージは OS により異なります (例: Debian/Ubuntu では build-essential libssl-dev libgmp-dev yasm libpcap-dev pkg-config libbz2-dev zlib1g-dev など)。

  3. 設定とコンパイル:
    ./configure
    make -s clean && make -sj4

    (-sj4 は 4 コアで並列コンパイルするオプションです。環境に合わせて調整してください)

コンパイルが成功すると、../run/ ディレクトリ内に john 実行ファイルや openssl2john スクリプトなどが生成されます。

cd ../run
ls openssl2john*

どちらの方法でも、インストール後に openssl2john (または openssl2john.py) が実行できることを確認してください。

基本的な使い方 🚀

openssl2john の基本的な使い方は非常にシンプルです。コマンドラインで openssl2john を実行し、引数としてパスワードで保護された OpenSSL ファイルを指定します。

openssl2john <暗号化されたファイル>

または、Python スクリプトとして直接実行する場合もあります(パスが通っていない、実行権限がないなどの理由で)。

python /path/to/openssl2john.py <暗号化されたファイル>

これを実行すると、標準出力に John the Ripper が解析できる形式のハッシュ文字列が出力されます。この出力をファイルに保存し、John the Ripper に渡してパスワード解析を行います。

ステップ・バイ・ステップ

  1. ハッシュの抽出:

    openssl2john を使って、対象ファイルからハッシュ情報を抽出し、ファイル(例: hash.txt)にリダイレクト (>) して保存します。

    openssl2john encrypted_file.key > hash.txt
  2. John the Ripper で解析:

    保存したハッシュファイル (hash.txt) を John the Ripper に渡して、パスワード解析を開始します。

    john hash.txt

出力形式の例

openssl2john が出力するハッシュ文字列は、ファイルの種類や暗号化アルゴリズムによって形式が異なりますが、一般的には以下のような情報を含んでいます。

filename:$tag$parameters$salt$ciphertext
  • filename: 元のファイル名(省略されることもあります)。
  • $tag: ハッシュの種類を示す識別子 (例: $pem$, $pkcs12$, $openssl$ など)。John the Ripper はこのタグを見て、どの解析モジュールを使うかを判断します。
  • parameters: 暗号化アルゴリズム、モード、イテレーション回数などのパラメータ。
  • salt: パスワードハッシュ計算に使われたソルト値(16進数などで表現)。
  • ciphertext: 暗号化されたデータの一部や検証用データ(16進数などで表現)。

例えば、PEM 形式の暗号化された秘密鍵の場合、以下のような形式になることがあります。

mykey.pem:$pem$1$1$.......$........

このハッシュ文字列があれば、John the Ripper は元のパスワードを知らなくても、様々なパスワード候補を試して正しいパスワードを見つけ出すことができます。

使用例とシナリオ 🛠️

ここでは、具体的なファイルタイプごとに openssl2john を使用する例と、想定される利用シナリオを見ていきましょう。

例1: パスワード付き PEM 形式秘密鍵 (RSA)

SSL/TLS 証明書や SSH 認証などで使われる RSA 秘密鍵が、作成時に指定したパスフレーズで暗号化されているケースです。パスフレーズを忘れてしまった場合などに解析を試みます。

  1. サンプルの暗号化秘密鍵を作成 (OpenSSL)

    まず、テスト用にパスワードで保護された RSA 秘密鍵 (encrypted_rsa.key) を作成します。ここではパスワードを secret123 とします。

    openssl genrsa -aes256 -out encrypted_rsa.key 2048
    # パスワード入力が求められるので 'secret123' を入力

    中身を確認すると、-----BEGIN RSA PRIVATE KEY-----Proc-Type: 4,ENCRYPTED のようなヘッダが見えます。

  2. openssl2john でハッシュを抽出
    openssl2john encrypted_rsa.key > rsa_hash.txt

    rsa_hash.txt の中身は以下のようになります(値は実行ごとに異なります)。

    encrypted_rsa.key:$openssl$1$1$8$......

    ※ JtR のバージョンによっては $pem$ タグが使われることもあります。最近の JtR では pem2john が使われることも推奨されています。

    ./pem2john.py encrypted_rsa.key > rsa_hash_pem.txt

    rsa_hash_pem.txt の中身は以下のようになることがあります。

    encrypted_rsa.key:$PEM$1*1*aes-256-cbc*...*...
  3. John the Ripper で解析

    簡単なパスワードなので、John the Ripper はすぐに見つけられるでしょう。

    john rsa_hash.txt  # または john rsa_hash_pem.txt

    しばらくすると、以下のような出力が表示され、パスワード (secret123) が表示されます。

    Using default input encoding: UTF-8
    Loaded 1 password hash (openssl-enc, OpenSSL salted EVP_BytesToKey [PBKDF1_SHA1 256/256 AVX2 4x])
    Cost 1 (algorithm [1:PBKDF1_SHA1 2:AES_CBC]) is 1 for all loaded hashes
    Cost 2 (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
    secret123        (encrypted_rsa.key)
    1g 0:00:00:00 DONE (2025-03-31 12:49) 10.00g/s 1234Kp/s 1234Kc/s 1234KC/s secret..123
    Session completed

    解析結果は john --show rsa_hash.txt コマンドで後から確認できます。

    john --show rsa_hash.txt
    encrypted_rsa.key:secret123
    
    1 password hash cracked, 0 left

例2: PKCS#12 ファイル (.p12 / .pfx)

PKCS#12 ファイルは、秘密鍵とそれに対応する証明書(公開鍵証明書)、場合によっては中間証明書などを一つのファイルにまとめたものです。多くの場合、ファイル全体がパスワードで保護されています。Windows 環境などでよく利用されます。

JtR のバージョンや構成によっては、openssl2john ではなく pfx2john という専用ツールを使うことが推奨される場合があります。

  1. サンプルの PKCS#12 ファイルを作成

    まず、自己署名証明書と秘密鍵を作成し、それらを PKCS#12 ファイル (mycert.p12) にエクスポートします。エクスポート時にパスワード (P@sswOrd!) を設定します。

    # 自己署名証明書と秘密鍵を作成
    openssl req -x509 -newkey rsa:2048 -keyout tempkey.pem -out tempcert.pem -days 365 -nodes -subj "/CN=Test Cert"
    
    # PKCS#12 ファイルにエクスポート (パスワード 'P@sswOrd!' を設定)
    openssl pkcs12 -export -out mycert.p12 -inkey tempkey.pem -in tempcert.pem -passout pass:P@sswOrd!
    
    # 一時ファイルを削除
    rm tempkey.pem tempcert.pem
  2. pfx2john (または openssl2john) でハッシュを抽出

    pfx2john スクリプトを使ってみます。

    ./pfx2john.py mycert.p12 > p12_hash.txt

    p12_hash.txt の中身は以下のようになります(これも値は異なります)。

    mycert.p12:$pfxng$1*1*....*....*....

    もし pfx2john がなければ、openssl2john を試すこともできますが、対応状況は JtR のバージョンによります。

    openssl2john mycert.p12 > p12_hash_ossl.txt
  3. John the Ripper で解析

    抽出したハッシュファイルを John the Ripper に渡します。

    john p12_hash.txt

    成功すれば、設定したパスワード P@sswOrd! が見つかります。

    Using default input encoding: UTF-8
    Loaded 1 password hash (pfx, PKCS#12 PBE [PBKDF2-SHA1 128/128 SSE2 4x])
    Cost 1 (iteration count) is 2048 for all loaded hashes
    Cost 2 (mac-iteration count) is 1 for all loaded hashes
    Cost 3 (hash type [1:SHA1 2:SHA256]) is 1 for all loaded hashes
    Will run 4 OpenMP threads
    Press 'q' or Ctrl-C to abort, almost any other key for status
    P@sswOrd!        (mycert.p12)
    1g 0:00:00:01 DONE (2025-03-31 12:49) 0.9523g/s 194.3p/s 194.3c/s 194.3C/s P@sswOrd!
    Session completed

例3: openssl コマンドで暗号化されたファイル

OpenSSL の enc サブコマンドを使って、任意のファイルをパスワードベースで暗号化した場合も、openssl2john でハッシュを抽出できます。

  1. ファイルを作成して暗号化
    echo "This is a secret message." > secret.txt
    openssl enc -aes-256-cbc -salt -pbkdf2 -out secret.enc -in secret.txt
    # パスワード入力が求められるので 'my_enc_pass' を入力

    (-pbkdf2 オプションは最近の OpenSSL で推奨されています)

  2. openssl2john でハッシュを抽出
    openssl2john secret.enc > enc_hash.txt

    enc_hash.txt の中身は以下のようになります。

    secret.enc:$openssl$1$1$8$.........
  3. John the Ripper で解析
    john enc_hash.txt

    成功すれば、パスワード my_enc_pass が見つかります。

利用シナリオ

  • 🔑 パスワードリカバリ: 自身で設定した秘密鍵や PFX ファイルのパスワードを忘れてしまい、アクセスできなくなった場合に、パスワードを回復させる。
  • 🛡️ セキュリティ監査: 組織内で使用されている秘密鍵や証明書ファイルのパスワード強度をテストする(必ず事前の許可を得ること)。弱いパスワードが使われている場合は、より強力なものに変更するよう促す。
  • 🔬 フォレンジック調査: 合法的な調査の一環として、押収されたデバイス内の暗号化ファイルの内容を解析する必要がある場合(法的手続きと令状が必要)。
  • 🎓 学習・研究: 暗号化技術やパスワードクラッキングのメカニズムを理解するための学習目的(自身で作成したファイルを使用)。

これらの例は基本的なものです。実際のパスワードはもっと複雑である可能性が高く、解析には高性能なハードウェアと時間(場合によっては数日、数週間以上)が必要になることもあります。John the Ripper には、辞書攻撃、ブルートフォース攻撃、ルールベース攻撃など、様々な解析モードがあり、これらを組み合わせることで解析の成功率を高めることができます。

John the Ripper での解析オプション ⚙️

openssl2john でハッシュを抽出した後、John the Ripper (JtR) で実際にパスワードを解析する際には、様々なオプションを指定して効率や成功率を高めることができます。openssl2john 自体には複雑なオプションは少ないですが、JtR 側のオプションが重要になります。

主な JtR クラッキングモード

John the Ripper は主に以下のモードで動作します。

  • シングルクラックモード (--single):

    ハッシュファイルに含まれるユーザー名や GECOS 情報(氏名など)を利用して、それらを基にしたパスワード候補(例: “john”, “nhoj”, “john123″)を試します。比較的簡単なパスワードに対して高速に動作します。これはデフォルトで最初に試されるモードの一つです。

    john --single hash.txt
  • ワードリストモード (--wordlist):

    指定された辞書ファイル(ワードリスト)に含まれる単語をパスワード候補として試します。最も一般的に使われるモードです。辞書の質とサイズが重要になります。

    john --wordlist=/path/to/dictionary.txt hash.txt

    有名なワードリストには rockyou.txt などがあります。

  • ルールベースモード (--rules):

    ワードリストモードと組み合わせて使われることが多いです。辞書の単語に対して、特定のルール(例: 大文字小文字変換、数字や記号の追加、単語の結合など)を適用して、より多くのパスワード候補を生成します。john.conf ファイルに定義されたルールセットを指定します。

    john --wordlist=/path/to/dictionary.txt --rules=Jumbo hash.txt

    (Jumbo は JtR Jumbo 版に付属する強力なルールセットの一つ)

  • インクリメンタルモード (--incremental):

    指定された文字セット(例: 英小文字、数字、記号)を使って、可能な全ての組み合わせを試すブルートフォース(総当たり)攻撃です。短いパスワードには有効ですが、パスワードが長くなると指数関数的に時間がかかります。

    john --incremental=LowerNum hash.txt  # 英小文字と数字の組み合わせ

    利用可能な文字セットは john.conf で定義されています。

  • マスクモード (--mask):

    パスワードのパターン(例: 最初の5文字は英小文字、次の3文字は数字)が分かっている場合に、そのパターンに合致する候補のみを生成して試す、より効率的なブルートフォース攻撃です。

    john --mask='?l?l?l?l?l?d?d?d' hash.txt  # 英小文字5文字 + 数字3文字

    (?l は英小文字、?d は数字を表すプレースホルダー)

通常、オプションを指定せずに john hash.txt と実行すると、JtR はシングルモード、ワードリストモード(デフォルト辞書使用)、インクリメンタルモードを順番に試します。

その他の便利な JtR オプション

  • --format=<format>:

    ハッシュの形式を明示的に指定します。JtR が自動認識できない場合や、複数の形式が考えられる場合に役立ちます。openssl2john で抽出したハッシュの場合、--format=openssl-enc--format=pem, --format=pfx などを指定することがあります。

    john --format=pem hash.txt

    対応フォーマットは john --list=formats で確認できます。

  • --show:

    既にクラックされたパスワードを表示します。

    john --show hash.txt
  • --pot=<potfile>:

    クラックしたパスワードを保存するファイル(pot ファイル)を指定します。デフォルトは $JOHN/john.pot です。

  • --session=<name>:

    クラッキングセッションに名前を付けます。中断・再開時に便利です。

    john --session=my_openssl_crack --wordlist=rockyou.txt hash.txt
    # 中断後...
    john --restore=my_openssl_crack
  • --fork=<N>:

    N 個のプロセスをフォークして並列処理を行います。マルチコア CPU で効果的です。

    john --fork=4 hash.txt
  • --max-run-time=<seconds>:

    最大実行時間を秒単位で指定します。

これらのオプションを組み合わせることで、特定の状況に合わせてパスワード解析プロセスを最適化できます。例えば、強力なパスワードが予想される場合は、大規模なワードリストと複雑なルールを適用し、長時間の実行を覚悟する必要があります。逆に、簡単なパスワードが使われている可能性が高い場合は、シングルモードや小規模な辞書で短時間で結果が出るかもしれません。💡

倫理的考察と警告 ⚖️

openssl2john や John the Ripper のようなツールは非常に強力であり、正当な目的で使用すれば大きな助けとなりますが、その能力ゆえに悪用される危険性も常に伴います。これらのツールを使用する際には、法的な側面と倫理的な側面を十分に理解し、責任ある行動を心がけることが極めて重要です。

🚫 不正利用の禁止

絶対に、あなたが所有していない、または明示的な書面による許可を得ていないファイルやシステムに対して、これらのツールを使用してパスワードを解析しようとしないでください。

  • 他人の秘密鍵、証明書ファイル、暗号化されたドキュメントなどを無断で解析することは、プライバシーの侵害であり、不正アクセス禁止法などの法律に抵触する犯罪行為です。
  • 業務においてセキュリティテストを行う場合でも、必ず事前に組織の正式な承認プロセスを経て、許可された範囲と対象に対してのみ実施してください。

不正利用が発覚した場合、法的な処罰(罰金や懲役)を受けるだけでなく、社会的な信用を失うことになります。

正当な利用目的

openssl2john や JtR の正当な利用目的としては、以下のようなものが挙げられます。

  • 自身のパスワード回復: 自分が作成した OpenSSL ファイル(秘密鍵など)のパスワードを忘れてしまった場合に、それを回復させる。
  • 許可されたセキュリティ監査: 自身が管理者であるシステムや、クライアントから正式に依頼されたシステムにおいて、セキュリティポリシーの一環としてパスワード強度を評価する。発見された弱いパスワードについては、ユーザーに通知し、より強固なパスワードへの変更を促す。
  • 教育・研究: 暗号技術やパスワードセキュリティの仕組みを学ぶために、自身で作成したサンプルデータに対してツールを使用する。

パスワードセキュリティの重要性

これらのツールの存在は、私たちが使用するパスワードの強度がいかに重要であるかを再認識させてくれます。

  • 強力なパスワードの使用: 特に秘密鍵や重要な証明書ファイルを保護するパスワードは、長く(例: 15文字以上)、複雑(大文字、小文字、数字、記号を組み合わせる)で、推測しにくいものにする必要があります。辞書に載っている単語や、個人情報(名前、誕生日など)に関連する文字列は避けるべきです。
  • パスワードマネージャーの活用: 複雑でユニークなパスワードを多数管理するために、信頼できるパスワードマネージャーを使用することが推奨されます。
  • 定期的な見直し: パスワードポリシーを見直し、必要に応じてパスワードを変更することも重要です。
  • 鍵管理のベストプラクティス: 秘密鍵ファイル自体のアクセス権限を適切に管理し、不要になった鍵は安全に削除するなど、鍵管理のベストプラクティスに従うことも不可欠です。

openssl2john のようなツールは、パスワードセキュリティの「矛」として機能しますが、同時に、私たちがセキュリティの「盾」をいかに強化すべきかを教えてくれる存在でもあります。常に倫理観を持ち、技術を正しく利用することを心がけましょう。🙏

まとめ ✨

この記事では、John the Ripper スイートに含まれるユーティリティ openssl2john について、その役割、インストール方法、基本的な使い方、具体的な使用例、そして倫理的な側面までを解説しました。

openssl2john は、パスワードで保護された OpenSSL 関連ファイル(秘密鍵、PKCS#12 ファイル、openssl enc で暗号化されたファイルなど)から、John the Ripper が解析可能なハッシュ情報を抽出するための重要なツールです。これにより、忘れてしまったパスワードの回復や、許可された範囲でのセキュリティ強度テストが可能になります。

主なポイントを振り返りましょう:

  • openssl2john は JtR (Jumbo) に含まれる。
  • 基本的な使い方は openssl2john <ファイル> > hash.txt
  • 抽出したハッシュは john hash.txt で解析する。
  • PEM 秘密鍵、PKCS#12、OpenSSL 暗号化ファイルなどに対応 (バージョンにより pem2johnpfx2john が推奨される場合あり)。
  • JtR の多彩なモード (--wordlist, --rules, --incremental, --mask) を活用して解析効率を上げる。
  • ツールの使用は、自身が所有するファイルまたは明示的な許可を得た場合に限定し、常に倫理的な利用を心がける。

パスワードクラッキングツールは強力ですが、その力を正しく理解し、責任を持って使用することが不可欠です。同時に、これらのツールの存在は、私たちが日頃使用するパスワード、特に機密情報を保護するパスワードの強度を高めることの重要性を強く示唆しています。

この記事が、openssl2john の適切な利用と、パスワードセキュリティへの意識向上の一助となれば幸いです。🔐

コメント

タイトルとURLをコピーしました