pfx2john の使い方: PFX/P12 ファイルからパスワードハッシュを抽出し解析する

デジタル証明書とその秘密鍵を安全に保管・転送するためのファイル形式として、PKCS#12 (一般的に拡張子が .pfx または .p12 のファイル) が広く利用されています。これらのファイルは、多くの場合、パスワードによって保護されています。しかし、このパスワードを忘れてしまったり、セキュリティ評価の一環としてパスワードの強度をテストする必要が生じたりすることがあります。

このような状況で役立つのが、著名なパスワードクラッキングツールである John the Ripper スイートに含まれるユーティリティ、pfx2john です。pfx2john は、PFX/P12 ファイルからパスワード検証に必要な情報(ハッシュ)を抽出し、John the Ripper が解析できる形式に変換するツールです。

このブログ記事では、pfx2john の基本的な使い方から、応用的な利用方法、注意点までを詳しく解説していきます。

pfx2john の使い方を学ぶ前に、対象となる PFX/P12 ファイルについて理解を深めましょう。PKCS#12 (Public-Key Cryptography Standards #12) は、RSA Security によって策定された公開鍵暗号標準の一部です。

この規格は、主に以下のものを一つのファイルにまとめて格納するために使用されます。

  • 秘密鍵 (Private Key)
  • X.509 公開鍵証明書 (Public Key Certificate)
  • 証明書チェーン (中間証明書やルート証明書)

これらの機密性の高い情報を保護するため、PKCS#12 ファイルは通常、パスワードで暗号化されます。これにより、ファイルが第三者の手に渡ったとしても、パスワードを知らない限り中身を容易に閲覧することはできません。

PFX (Personal Information Exchange) は、Microsoft が PKCS#12 を実装した際の古い名称であり、現在でも拡張子として広く使われています。そのため、.pfx ファイルと .p12 ファイルは実質的に同じものと考えて差し支えありません。

この形式は、サーバー証明書のバックアップや移行、クライアント証明書の配布など、様々な場面で利用されています。例えば、Windows Server の IIS や macOS のキーチェーンアクセスで証明書をエクスポートする際に、この形式が用いられることがあります。

pfx2john は、John the Ripper スイートの一部として提供されています。したがって、John the Ripper をインストールすれば、通常は pfx2john も一緒に利用可能になります。

Kali Linux や Parrot OS などのペネトレーションテスト向け Linux ディストリビューション:

これらのディストリビューションでは、John the Ripper (多くの場合、機能拡張版である John the Ripper Jumbo) が標準でインストールされているか、簡単なコマンドでインストールできます。

# Debian/Ubuntu ベースの場合
sudo apt update
sudo apt install john

インストール後、pfx2john が利用可能か確認してください。多くの場合、/usr/share/john//usr/sbin/ などのパスにスクリプトまたは実行ファイルとして配置されています。

その他の Linux ディストリビューション、macOS、Windows:

John the Ripper の公式サイト (Openwall) からソースコードまたはコンパイル済みのバイナリをダウンロードしてインストールする必要があります。Jumbo バージョンをインストールすることを推奨します。Jumbo バージョンは、より多くのハッシュ形式に対応しており、*2john 系のツールも充実しています。

多くの場合、pfx2john は Python スクリプト (pfx2john.py) として提供されています。そのため、Python 3 の実行環境が必要になる場合があります。また、依存ライブラリとして asn1crypto が必要になることがあります。

# asn1crypto がない場合のエラー例 (pfx2john.py の場合)
# asn1crypto is missing, run 'pip install --user asn1crypto' to install it!

# インストールコマンド例
pip install --user asn1crypto
# または
pip3 install --user asn1crypto

インストール場所は環境によって異なりますが、John the Ripper のインストールディレクトリ内の run サブディレクトリなどに配置されていることが多いです。

注意: pfx2john は Python スクリプト (pfx2john.py) として提供されることが多いですが、環境によってはコンパイルされたバイナリ (pfx2john) として存在する場合もあります。

pfx2john の最も基本的な使い方は非常にシンプルです。コマンドラインで pfx2john (または python3 pfx2john.py) の後に、対象となる PFX/P12 ファイルのパスを指定するだけです。

pfx2john <対象のPFX/P12ファイル>

例えば、mycertificate.pfx というファイルからハッシュを抽出したい場合は、以下のように実行します。

pfx2john mycertificate.pfx

または、Python スクリプトとして実行する場合:

python3 /path/to/john/run/pfx2john.py mycertificate.pfx

成功すると、標準出力に John the Ripper が解析可能な形式のハッシュ文字列が出力されます。このハッシュ文字列には、元のファイル名、暗号化やハッシュ化に関するパラメータ、ソルト、そしてパスワード検証に必要なデータが含まれています。

出力例 (内容はファイルによって異なります):

mycertificate.pfx:$pfxng$1$16$5f8a3b...$...$30$8d7e...

この出力されたハッシュ文字列をファイルに保存し、John the Ripper に渡すことでパスワードクラッキングを開始できます。

# ハッシュをファイルに保存
pfx2john mycertificate.pfx > pfx_hash.txt

# John the Ripper でクラッキングを開始
john pfx_hash.txt

あるいは、パイプを使って直接 John the Ripper に渡すことも可能です。

pfx2john mycertificate.pfx | john --stdin

これにより、中間ファイルを作成する手間を省くことができます。

pfx2john 自体には、多くのコマンドラインオプションは用意されていません。主な機能は PFX/P12 ファイルを読み込み、ハッシュ形式に変換することに特化しています。

利用可能なオプションは、pfx2john のバージョンや、それがスクリプトかバイナリかによって異なる可能性がありますが、一般的にはヘルプオプション (-h--help) も提供されていないことが多いです。

基本的な使用法は、前述の通り、引数として PFX/P12 ファイルを指定することです。

補足: pfx2john で生成されたハッシュを処理する john コマンドには、多数のオプションが存在します。例えば、使用するワードリストの指定 (--wordlist=)、クラッキングモードの選択 (--single, --incremental など)、ルールの適用 (--rules) など、細かな制御が可能です。これらのオプションについては、John the Ripper のドキュメントを参照してください。

# John the Ripper のオプション例
john --wordlist=passwords.txt --rules pfx_hash.txt
john --incremental --fork=4 pfx_hash.txt

ここでは、pfx2john を利用する具体的なシナリオと、その際のコマンド例をいくつか紹介します。

シナリオ1: 忘れた PFX パスワードの回復

サーバー証明書の移行や更新の際に、エクスポートした PFX ファイルのパスワードを忘れてしまった、というのはよくあるケースです。

  1. ハッシュの抽出:
    pfx2john server_backup.pfx > server_hash.txt
  2. John the Ripper による解析:

    まず、よく使われるパスワードや簡単なパターンを試すために、辞書攻撃やインクリメンタルモードを使用します。

    # デフォルトのモード (Single, Wordlist, Incremental の順に試行)
    john server_hash.txt
    
    # 特定のワードリストを使用
    john --wordlist=/usr/share/wordlists/rockyou.txt server_hash.txt
    
    # インクリメンタルモード (ASCII文字) を試す
    john --incremental=ASCII server_hash.txt

    John the Ripper は解析を進め、パスワードが見つかると画面に表示します。解析には時間がかかる場合があります。

  3. 結果の確認:

    パスワードが見つかった後、または解析中に現在の状況を確認するには --show オプションを使います。

    john --show server_hash.txt

    これにより、既にクラックされたパスワードが表示されます。

シナリオ2: ペネトレーションテストにおける PFX ファイルの評価

ペネトレーションテスト中に、ファイル共有サーバーなどからパスワードで保護された PFX ファイルを発見することがあります。この PFX ファイルに設定されているパスワードの強度を評価するために pfx2john と John the Ripper を使用します。

2024年2月に公開された Hack The Box のマシン “Timelapse” の Writeup では、共有フォルダから発見された PFX ファイル (legacyy_dev_auth.pfx) のパスワードを pfx2john と John the Ripper を使ってクラックし、その証明書を利用して WinRM 経由でシステムにアクセスする手順が示されています。

  1. 発見した PFX ファイルからハッシュを抽出:
    pfx2john /mnt/smbshare/legacyy_dev_auth.pfx > htb_pfx_hash.txt
  2. パスワード強度の評価 (クラッキング試行):

    組織内でよく使われるパスワードリストや、ターゲットに関連する情報 (会社名、サービス名など) を含むカスタムワードリストを使って、弱いパスワードが設定されていないか確認します。

    john --wordlist=custom_wordlist.txt htb_pfx_hash.txt

    もし短時間でパスワードがクラックされた場合、それはパスワード強度が不十分であることの証拠となります。

シナリオ3: スクリプトでの自動化

複数の PFX ファイルに対して一括でハッシュ抽出を行いたい場合、シェルスクリプトなどで自動化することが可能です。

#!/bin/bash

PFX_DIR="/path/to/pfx_files"
HASH_DIR="/path/to/hashes"

mkdir -p "$HASH_DIR"

# PFX ディレクトリ内の全ての .pfx ファイルに対して処理を実行
for pfx_file in "$PFX_DIR"/*.pfx; do
  if [ -f "$pfx_file" ]; then
    filename=$(basename "$pfx_file")
    hash_file="$HASH_DIR/${filename%.pfx}.hash"
    echo "Processing $filename..."
    pfx2john "$pfx_file" > "$hash_file"
    echo "Saved hash to $hash_file"
  fi
done

echo "All PFX files processed."

# 必要であれば、この後 John the Ripper を起動するコマンドを追加
# john "$HASH_DIR"/*.hash

このスクリプトは、指定されたディレクトリ内のすべての .pfx ファイルに対して pfx2john を実行し、結果を別ディレクトリに .hash ファイルとして保存します。

pfx2john や John the Ripper を使用する際には、いくつかの問題が発生する可能性があります。ここでは、一般的な問題とその対処法、および注意点を挙げます。

問題1: ハッシュ形式の非互換性 (特に古い pfx2john.py)

古いバージョンの pfx2john.py (特に Python 3 環境で実行した場合) が生成するハッシュ文字列に、余計な文字 (b'...' や単一引用符 ' など) が含まれることがありました。これにより、John the Ripper がハッシュを正しく認識できず、「No password hashes loaded」のようなエラーが発生することがあります。

対処法:

  • John the Ripper と pfx2john を最新版にアップデートする: これが最も推奨される解決策です。近年のバージョンではこの問題は修正されています。
  • 手動でハッシュを修正する: 緊急の場合、生成されたハッシュファイルを開き、不正な文字 (例: 先頭の b' と末尾の ') を手動で削除することで解決する場合があります。ただし、これは根本的な解決策ではありません。

Hack The Box のフォーラム (2022年8月投稿) や Medium の記事 (2024年2月投稿) でも、Timelapse マシンに関連してこの問題と手動修正について言及されていました。

# 不正なハッシュの例 (修正前)
legacyy_dev_auth.pfx:b'$pfxng$...'

# 修正後のハッシュの例
legacyy_dev_auth.pfx:$pfxng$...

問題2: “No password hashes loaded” エラー

John the Ripper を実行した際にこのエラーが出る場合、いくつかの原因が考えられます。

  • ハッシュ形式の問題: 上記の問題1のケース。
  • ファイルの破損: 対象の PFX ファイルが破損している、または不完全である。
  • John the Ripper のバージョン: 使用している John the Ripper のバージョンが、pfx2john が生成したハッシュ形式に対応していない (特に古いバージョンや、Jumbo でない標準版の場合)。
  • ファイルパスの間違い: John the Ripper に渡しているハッシュファイルのパスが間違っている。
  • 既にクラック済み: 一度パスワードがクラックされると、John the Ripper はデフォルトでは同じハッシュを再度クラックしようとしません。--show オプションで確認してみてください。

対処法: John the Ripper Jumbo の最新版を使用し、ハッシュファイルが正しく生成されているか確認してください。PFX ファイル自体が有効かどうかも確認が必要です (例: openssl pkcs12 -info -in file.pfx コマンドで情報が表示されるか試すなど)。

問題3: 依存関係エラー (asn1crypto)

pfx2john.py を実行する際に `ImportError: No module named ‘asn1crypto’` のようなエラーが出る場合は、必要な Python ライブラリがインストールされていません。

対処法: pip を使用して asn1crypto をインストールします。

pip install --user asn1crypto
# または
pip3 install --user asn1crypto

注意点: 倫理的な利用

pfx2john および John the Ripper は、パスワード回復やセキュリティ評価のための強力なツールですが、悪用することも可能です。他人の PFX ファイルやシステムのパスワードを許可なく解析することは、法律や倫理規定に違反する可能性があります。これらのツールは、必ず正当な権限と目的を持って使用してください。

注意点: パスワードクラッキングの時間

PFX ファイルのパスワードクラッキングにかかる時間は、パスワードの複雑さ、長さ、使用されている暗号化アルゴリズム、そして利用するコンピューターの処理能力に大きく依存します。単純なパスワードは数秒で見つかることもありますが、複雑なパスワードの場合は数日、数週間、あるいはそれ以上かかることもあります。適切なワードリストやルール、ハードウェア (GPU など) を活用することで、解析時間を短縮できる可能性があります。

pfx2john は、パスワードで保護された PKCS#12 (PFX/P12) ファイルからパスワードハッシュを抽出し、John the Ripper で解析可能な形式に変換するための便利なツールです。パスワードを忘れてしまった場合の回復や、セキュリティ評価の一環としてパスワード強度をテストする際に役立ちます。

基本的な使い方は簡単ですが、John the Ripper 本体と連携させることで、様々なクラッキング手法を試すことができます。ただし、ツールの使用にあたっては、常に倫理的な側面と法的な制約を考慮し、正当な目的でのみ利用するようにしてください。

この記事が、pfx2john の理解と活用の一助となれば幸いです。Happy cracking! (ethically, of course!)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です