Javaアプリケーション開発や運用に携わっている方なら、.keystore
ファイル(Java KeyStore)にお世話になることが多いでしょう。SSL証明書や秘密鍵などを安全に保管するための重要なファイルですが、万が一パスワードを忘れてしまったら大変です😱。また、セキュリティ診断の観点からは、キーストアに設定されているパスワードの強度を確認する必要があります。
そんな時に役立つのが、著名なパスワードクラッキングツール「John the Ripper」(JtR)スイートに含まれるkeystore2john
です。この記事では、keystore2john
の基本的な使い方から、John the Ripperを使った実際のパスワード解析手順までを詳しく解説します。
John the Ripperとkeystore2johnとは?
まず、基本的なツールについて理解しましょう。
John the Ripper (JtR)
John the Ripper(ジョン・ザ・リッパー、通称JohnまたはJtR)は、Openwallプロジェクトによって開発されている、非常に強力で人気のあるオープンソースのパスワードクラッキングツールです。元々はUnix系システムのパスワード(/etc/shadow
ファイルなど)の強度をテストするために開発されましたが、現在ではWindowsのLM/NTLMハッシュ、各種ハッシュ関数(MD5, SHA-1, SHA-256, SHA-512など)、さらには様々なアプリケーション固有のパスワード形式に対応しています。
JtRは主に以下のパスワード解析手法をサポートしています:
- 辞書攻撃 (Wordlist mode): パスワード候補が記載されたリスト(辞書ファイル)を用いて攻撃します。
- ブルートフォース攻撃 (Incremental mode): 文字の組み合わせを総当たりで試します。
- ルールベース攻撃 (Rule-based attack): 辞書の単語に特定のルール(大文字小文字変換、数字付加など)を適用して候補を生成します。
- シングルクラックモード (Single crack mode): ユーザー名などの情報からパスワードを推測します。
その速度と柔軟性から、セキュリティ専門家やシステム管理者に広く利用されています。最新情報やダウンロードは公式サイトhttps://www.openwall.com/john/で確認できます。
keystore2john
keystore2john
は、John the Ripperの「community-enhanced version」(Jumbo Johnとも呼ばれる、多くの追加機能を持つバージョン)に含まれるユーティリティスクリプト(多くの場合Pythonスクリプト)の一つです。その主な役割は、Java KeyStore (JKS) ファイルからパスワードハッシュ情報を抽出し、John the Ripperが解析できる形式に変換することです。
JKSファイル自体は直接John the Ripperで解析できません。そのため、このkeystore2john
のような「*2john」系ツールを使って、事前に解析可能なフォーマットに変換する必要があるのです。他にもzip2john
(ZIPファイル用)、rar2john
(RARファイル用)、office2john
(Officeファイル用)など、多くのファイルタイプに対応するツールがJtRスイートには含まれています。
前提条件と準備
keystore2john
を使用するには、以下の準備が必要です。
-
John the Ripper (Jumboバージョン) のインストール:
keystore2john
はJumbo Johnに含まれています。多くのLinuxディストリビューションではパッケージマネージャ(例:sudo apt install john
on Debian/Ubuntu)でインストールできますが、最新版やフル機能を利用したい場合は、公式サイトやGitHubリポジトリからダウンロードしてビルドすることをお勧めします。特にPythonスクリプトである*2john
ツール群は、GitHubのソースに含まれていることが多いです。 -
Python環境:
keystore2john.py
はPythonスクリプトであるため、Pythonの実行環境が必要です。通常、現代的なLinuxシステムにはデフォルトでインストールされています。 -
解析対象のJava KeyStoreファイル (
.keystore
または.jks
): パスワードを解析したいキーストアファイルが必要です。
John the Ripperをソースからビルドした場合、keystore2john.py
スクリプトは通常、Johnのインストールディレクトリ内のrun
サブディレクトリに配置されます。(古いバージョンや配布形態によっては/usr/share/john/
などに配置されることもあります)。
# 例: John the Ripperのソースを展開したディレクトリに移動
cd JohnTheRipper/run/
ls *2john* # *2john系のツールを探す
./keystore2john.py --help # ヘルプが表示されればOK
keystore2johnの使い方: ハッシュの抽出
keystore2john
の使い方は非常にシンプルです。基本的には、スクリプトを実行し、引数として解析したいキーストアファイルを指定するだけです。
# Johnのrunディレクトリにいる場合
./keystore2john.py /path/to/your/mykeystore.jks
# Johnのrunディレクトリがパスに含まれていない場合
/path/to/john/run/keystore2john.py /path/to/your/mykeystore.jks
実行すると、標準出力にJohn the Ripperが解析できる形式のハッシュ文字列が出力されます。この出力をファイルに保存して、後でJohn the Ripperに渡します。
./keystore2john.py mykeystore.jks > keystore_hash.txt
出力されるハッシュの形式は通常、以下のようになります(内容はキーストアによって異なります)。
mykeystore.jks:$keystore$0*...*...
この文字列には、キーストアの種類、暗号化されたデータ、チェックサムなどが含まれており、John the Ripperはこの情報を使ってパスワードの検証を行います。
💡 複数のファイルを一度に処理:
keystore2john
は複数のキーストアファイルを引数として受け付け、それぞれのハッシュを連続して出力することもできます。
./keystore2john.py key1.jks key2.jks > multiple_hashes.txt
⚠️ キーストアのパスワードと鍵のパスワード:
Java KeyStoreには、キーストアファイル全体を保護する「ストアパスワード」と、キーストア内に格納されている個々の秘密鍵を保護する「キーパスワード」の2種類が存在します。keystore2john
がデフォルトで抽出しようとするのは、主にストアパスワードのハッシュです。キーパスワードがストアパスワードと異なる場合、keystore2john
でストアパスワードをクラックしても、秘密鍵自体にはアクセスできない可能性があります。一部のバージョンのkeystore2john
や関連ツール(bks2john
など)ではキーパスワードの抽出もサポートする動きがありましたが、基本的な利用ではストアパスワードの解析が主目的となります。
John the Ripperでのパスワード解析
keystore2john
でハッシュを抽出したら、いよいよJohn the Ripper本体を使ってパスワード解析(クラッキング)を行います。
基本的なコマンド構文は以下の通りです。
john [オプション] <ハッシュファイル>
<ハッシュファイル>
には、先ほどkeystore2john
で作成したハッシュ情報を含むファイル(例: keystore_hash.txt
)を指定します。
1. 辞書攻撃 (Wordlist Mode)
最も一般的な方法の一つが辞書攻撃です。パスワードとして使われそうな単語を集めたリスト(辞書ファイル)を用意し、それを試します。John the Ripperにはデフォルトでpassword.lst
という辞書が付属していることが多いですが、より強力な辞書(例えば有名なrockyou.txt
など)を別途用意すると成功率が上がります。
# John付属のデフォルト辞書を使う場合
john keystore_hash.txt
# 特定の辞書ファイルを指定する場合 (--wordlist オプション)
john --wordlist=/path/to/your/dictionary.txt keystore_hash.txt
# rockyou.txt を使う例 (kali linuxなどでは /usr/share/wordlists/rockyou.txt.gz にあることが多い)
# gunzip /usr/share/wordlists/rockyou.txt.gz # 事前に解凍が必要な場合
john --wordlist=/usr/share/wordlists/rockyou.txt keystore_hash.txt
2. ブルートフォース攻撃 (Incremental Mode)
辞書攻撃でパスワードが見つからない場合、文字の組み合わせを総当たりで試すブルートフォース攻撃が有効です。ただし、パスワードが長くて複雑な場合、非常に時間がかかります(数日~数年以上かかることも)。
# --incremental オプションでブルートフォースモードを指定
john --incremental keystore_hash.txt
# 特定の文字種を指定することも可能 (例: 小文字アルファベットのみ)
john --incremental=Lower keystore_hash.txt
Johnはデフォルトで、辞書攻撃 → シングルモード → ブルートフォースモード、と自動的に試行を進めることもあります。
解析の進行状況と結果の確認
John the Ripperは解析中に状況を表示します。何かキーを押すと現在のステータス(試行速度、経過時間、現在の候補など)が表示されます。解析が完了するか、Ctrl+Cで中断できます。
パスワードが見つかると、John the Ripperはその結果を記録します(デフォルトでは$JOHN/john.pot
というファイル)。後でクラックされたパスワードを確認するには、--show
オプションを使用します。
john --show keystore_hash.txt
出力例:
mykeystore.jks:SecretPassword123: ... (他の情報) ...
1 password hash cracked, 0 left
この例では、mykeystore.jks
のパスワードがSecretPassword123
であることが特定されました🎉。
💡 フォーマットの指定:
John the Ripperは通常、ハッシュファイルの形式を自動検出しますが、明示的に指定したい場合は--format=keystore
のように指定できます。
john --format=keystore --wordlist=dictionary.txt keystore_hash.txt
利用可能なフォーマットは john --list=formats
で確認できます。
よくある問題と対処法 🤔
問題 | 考えられる原因 | 対処法 |
---|---|---|
keystore2john.py: command not found |
John the Ripper (Jumbo) が正しくインストールされていない、またはkeystore2john.py がPATHに含まれていない。 |
John the Ripper (Jumbo) をインストールする。keystore2john.py のフルパスを指定して実行する(例: /opt/john/run/keystore2john.py ... )。 |
FileNotFoundError: [Errno 2] No such file or directory: 'mykeystore.jks' (keystore2john実行時) |
指定したキーストアファイルが存在しない、またはパスが間違っている。 | ファイル名とパスを確認する。カレントディレクトリを確認する。 |
John the RipperでNo password hashes loaded と表示される |
keystore2john が出力したハッシュファイルが空、または形式がJohnに認識されていない。キーストアファイル自体が破損している可能性。 |
keystore2john の出力(ハッシュファイルの中身)を確認する。keystore2john を再度実行してみる。別のJKSファイルで試してみる。Johnのバージョンを確認する。 |
パスワード解析に非常に時間がかかる、または見つからない | パスワードが非常に長く複雑。使用している辞書が弱い。ブルートフォース攻撃の範囲が広すぎる。 | より強力な辞書ファイルを使用する。ルールベース攻撃を試す。可能であればパスワードに関するヒント(長さ、使用文字種など)から攻撃方法を絞り込む。高性能なハードウェア(特にGPU対応のツールと組み合わせる場合)を使用する。諦める(現実的な時間内に解読不可能な場合もある)。 |
セキュリティ上の考慮事項とまとめ
keystore2john
とJohn the Ripperは、忘れてしまったパスワードの回復や、システムのセキュリティ強度を評価するための強力なツールです。しかし、その能力ゆえに悪用される危険性もはらんでいます。
- 倫理的な使用: 繰り返しになりますが、これらのツールは許可された目的でのみ使用してください。
- 強力なパスワードの重要性: このツールを使ってみると、単純なパスワードや辞書に載っている単語がいかに簡単に破られるかが分かります。キーストアには、長く、複雑で、推測困難なパスワードを設定することが極めて重要です。ランダムな文字列生成ツールの利用も検討しましょう。
- アクセス制御: キーストアファイル自体へのアクセスを適切に制限することも重要です。ファイルシステムのパーミッションを適切に設定し、不要なユーザーがアクセスできないようにしてください。
この記事では、keystore2john
を使ってJava KeyStoreからハッシュを抽出し、John the Ripperでパスワードを解析する基本的な手順を解説しました。正しく理解し、責任ある使い方を心掛けることで、これらのツールはセキュリティ維持・向上のための強力な味方となります🛡️。
参考情報
- John the Ripper 公式サイト: https://www.openwall.com/john/
- John the Ripper Community Wiki (Johnny GUIなど): https://openwall.info/wiki/john/johnny
- John the Ripper GitHub (Source code): https://github.com/openwall/john
- Java KeyStore (JKS) に関するドキュメント (Oracle): https://docs.oracle.com/javase/jp/21/docs/api/java.base/java/security/KeyStore.html
コメント