はじめに – cprepairとは?
cprepair は、有名なパスワード解析ツール John the Ripper (JtR) の拡張版(Jumbo バージョン)に含まれるユーティリティの一つです。 John the Ripper自体は、システム管理者が脆弱なパスワードを発見したり、自分が忘れてしまったパスワードを回復したりするために設計された強力なツールキットです。 その中でも cprepair は、特にパスワードで保護された ZIPアーカイブファイル の解析に特化しています。
cprepair の最大の特徴は、既知平文攻撃 (Known Plaintext Attack) という手法を利用して、ZIPファイルの内部暗号化キーを特定することにあります。 これは、暗号化されたZIPファイルに含まれるファイルのうち、一つでも元の(暗号化されていない)ファイルが手元にある場合に非常に有効な攻撃手法です。
通常のパスワード解析では、zip2john ツールでZIPファイルからパスワードハッシュ情報を抽出し、それを john 本体で辞書攻撃や総当たり攻撃(ブルートフォースアタック)にかけます。 しかし、ZIPファイルの暗号化方式(特に古いPKZIP方式)の特性上、このハッシュ情報は解析に時間がかかることがあります。 cprepair は、既知の平文ファイルの情報を使うことで、john がより高速に処理できる形式の情報を生成し、解析プロセス全体を劇的に効率化します。
cprepairが必要となるシナリオ 🤔
どのような場合に cprepair の出番となるのでしょうか?主に以下のような状況が考えられます。
- パスワード付きZIPファイルの解析: 当然ながら、パスワードで保護されたZIPファイルが対象です。特に、広く使われていた古い PKZIP (ZipCrypto) 方式で暗号化されている場合に有効です。(比較的新しいAES暗号化方式のZIPには通常適用できません。)
- 既知平文ファイルがある場合: これが cprepair を利用するための絶対条件です。暗号化されたZIPファイル(protected.zip など)を作成する際に使われた元のファイルのうち、少なくとも一つ(document.txt や image.jpg など)が、暗号化されていない状態で手元にある必要があります。ファイルの内容だけでなく、ファイル名や圧縮方法も含めて、ZIP内部のファイルと完全に同一である必要があります。
- 通常のJohn the Ripperでの解析が遅い場合: zip2john で抽出したハッシュをそのまま john に渡して解析を試みたものの、計算量が多すぎて現実的な時間内にパスワードが見つからない、または見つかる見込みが低い場合。
例えば、あるプロジェクトで複数のファイルをまとめてパスワード付きZIPで共有したが、パスワードを忘れてしまったとします。しかし、幸いなことに、そのZIPファイルに入れる前のオリジナルファイルの一つ(例えば、README.txt)が自分のPCに残っていた場合、cprepair を使って効率的にパスワード回復を試みることができます。
cprepairの仕組み:既知平文攻撃とは? 💡
cprepair が利用する既知平文攻撃 (Known Plaintext Attack) は、暗号理論における古典的な攻撃手法の一つです。これは、暗号化されたデータ(暗号文)とその元となったデータ(平文)のペアがいくつか手元にある場合に、それらの情報を使って暗号化に使われた鍵を特定しようとする攻撃です。
PKZIPの暗号化方式 (ZipCrypto) は、ストリーム暗号の一種をベースにしていますが、その実装にはいくつかの弱点が存在しました。特に重要なのは以下の点です。
- 鍵スケジュールの初期化: 各ファイルを暗号化する際の内部的な「鍵スケジュール」は、ユーザーが設定したパスワードから生成されます。
- 暗号化ヘッダ: 各ファイルは圧縮された後、暗号化され、その際に12バイトの「暗号化ヘッダ」が付加されます。このヘッダ自体もパスワードから派生した鍵で暗号化されますが、最後の1バイトまたは2バイトは、元のファイルのCRC-32チェックサムの一部(または圧縮方式に関する情報)を含むことが知られています。
- ストリーム暗号の利用: 平文データと擬似乱数キーストリームがXORされることで暗号文が生成されます。
既知平文攻撃は、この仕組みを突きます。もし、ZIPファイル内のあるファイル(例: `known_file.txt`)の元の平文データがわかっている場合、そのファイルの暗号化に使われたキーストリームの一部を推測できます。なぜなら、「暗号文 = 平文 XOR キーストリーム」なので、「キーストリーム = 暗号文 XOR 平文」となるからです。
ZipCryptoでは、特に最初の12バイトの平文(圧縮後のデータ)がわかれば、暗号化ヘッダの情報と合わせて、内部状態(3つの32ビット整数)を特定するための計算量を大幅に削減できます。12バイトの既知平文があれば、鍵候補を総当たりで試す必要がなくなり、内部状態を直接計算できる可能性が高まります。
cprepair は、この理論に基づき、指定された既知平文ファイル (-f オプション) と暗号化ZIPファイル (-z オプション) を分析します。そして、既知平文ファイルに対応するZIP内の暗号化データと照合し、上記の攻撃に必要な情報(特に内部状態を特定するための手掛かり)を抽出します。そして、その情報を新しい小さなZIPファイル (-o オプションで指定) の中に埋め込みます。
この新しいZIPファイル (attack_file.zip など) に対して再度 zip2john を実行すると、元のZIPファイルから抽出されるハッシュとは異なり、既知平文攻撃によって得られた情報を含む、より解析が容易な形式のハッシュが出力されます。このハッシュを john に渡すことで、john は総当たり攻撃や辞書攻撃を行うのではなく、既知平文攻撃の情報を利用して内部暗号鍵を効率的に特定できるのです。
このように、cprepair は既知平文攻撃のプロセスを自動化し、ユーザーが複雑な暗号理論を意識することなく、John the RipperによるZIPファイル解析を高速化できるように支援します。
準備するもの 🛠️
cprepair を使ったZIPファイルのパスワード解析を行うには、以下のものが必要です。
-
John the Ripper (Jumboバージョン):
cprepair は、John the Ripper の「Jumbo」と呼ばれるコミュニティ強化版に含まれています。通常のコアリリースには含まれていない場合があります。
JtR Jumbo は、公式ウェブサイトやGitHubリポジトリからソースコードまたはコンパイル済みバイナリを入手できます。Linuxディストリビューションによっては、パッケージマネージャー (
apt
,yum
,snap
など) を通じてインストールできる場合もあります。- 公式ウェブサイト: https://www.openwall.com/john/
- GitHubリポジトリ: https://github.com/openwall/john
インストール後、cprepair, zip2john, john の各コマンドが実行できることを確認してください。
# コマンドが存在するか確認(パスが通っている場合) which cprepair which zip2john which john
もし見つからない場合は、JtRをインストールしたディレクトリ(例:
/opt/john/run
やC:\john\run
)に移動して実行するか、そのディレクトリにパスを通す必要があります。 - パスワードで保護されたZIPアーカイブ: 解析対象のZIPファイルです。ここでは例として protected.zip というファイル名を使用します。このファイルはPKZIP (ZipCrypto) 方式で暗号化されている必要があります。
-
既知の平文ファイル (Known Plaintext File):
これが最も重要です。protected.zip を作成する際に元々含まれていたファイルのうち、少なくとも一つが必要です。ファイルの内容、ファイル名、さらには圧縮前の状態が、ZIPファイル内部のものと完全に一致している必要があります。ここでは例として known_file.txt というファイル名を使用します。
重要:
- ファイルの内容が1バイトでも異なると失敗します。
- 改行コードの違い(CRLF vs LF)なども影響します。
- ファイル名も基本的には一致している必要があります(大文字小文字の違いは -c オプションで対応できる場合があります)。
- PKZIPの仕様上、既知平文ファイルには最低12バイトのデータが含まれている必要があります。より長い方が確実です。
これらの準備が整えば、cprepair を使った解析作業に進むことができます。🥳
cprepairの使い方:ステップ・バイ・ステップ 📝
ここでは、protected.zip というパスワード付きZIPファイルがあり、その中に含まれていた元のファイルの一つである known_file.txt が手元にある、という状況を想定して、cprepair を使ったパスワード解析の手順を解説します。
ステップ 1: zip2johnで元のZIPからハッシュ情報を抽出(比較用・省略可)
必須ではありませんが、最初に通常の zip2john を実行して、cprepair を使わない場合のハッシュ形式を確認しておくと、後のステップで違いが分かりやすくなります。
zip2john protected.zip > original_hash.txt
original_hash.txt の中身は、以下のような形式になっているはずです(内容はZIPファイルによって異なります)。
protected.zip:$pkzip2$3*1*1*0*8*24*eda3*8415*4523...[長い文字列]...*$/pkzip2$::protected.zip
このハッシュを直接 john で解析しようとすると、時間がかかる可能性があります。
ステップ 2: cprepairで攻撃用ファイルを生成 ✨
ここが cprepair の本領発揮です。既知平文ファイル known_file.txt を使って、解析を高速化するための情報を埋め込んだ新しいZIPファイル attack_file.zip を生成します。
cprepair -z protected.zip -f known_file.txt -o attack_file.zip
- -z protected.zip: 解析対象の暗号化されたZIPファイルを指定します。
- -f known_file.txt: ZIP内に含まれていることがわかっている、元の平文ファイルを指定します。
- -o attack_file.zip: 生成する攻撃用ファイル(新しいZIPファイル)の名前を指定します。
cprepair は、protected.zip 内に known_file.txt と同じ名前・サイズのファイルを探し、見つかった場合はその暗号化データと提供された平文データを比較して、既知平文攻撃に必要な情報を計算します。そして、その情報を内部に含む attack_file.zip を作成します。
もし File not found in archive
のようなエラーが出る場合は、known_file.txt がZIPファイル内に存在しないか、ファイル名が異なっている可能性があります。ZIPファイル内の正確なファイル名は unzip -l protected.zip
などで確認できます。ファイル名の大文字・小文字が違うだけなら -c オプションを試す価値があります。
ステップ 3: zip2johnで攻撃用ファイルから高速なハッシュを抽出 🚀
次に、ステップ2で生成した attack_file.zip に対して、再度 zip2john を実行します。
zip2john attack_file.zip > attack_hash.txt
今度生成される attack_hash.txt の中身は、ステップ1で見たハッシュとは異なる形式になっているはずです。
attack_file.zip:$zip2$*0*3*0*...[短い文字列]...*$/zip2$::attack_file.zip
この $zip2$
から始まる形式のハッシュは、既知平文攻撃の情報が組み込まれており、john が非常に高速に処理できるように最適化されています。元の $pkzip2$
形式よりもずっと短く、構造が単純になっていることが多いです。
ステップ 4: johnでパスワード(内部キー)をクラック 🔓
いよいよ最終段階です。ステップ3で生成した高速なハッシュファイル attack_hash.txt を john コマンドに渡して解析を実行します。
john attack_hash.txt
john は attack_hash.txt 内の情報を利用し、PKZIPの内部暗号化キーの特定を試みます。既知平文攻撃が成功していれば、このプロセスは多くの場合、数秒から数分で完了します(元のパスワードの複雑さにはほとんど依存しません)。
john がキー(またはそれから導出されるパスワード)を発見すると、通常は以下のように表示されます。
Loaded 1 password hash ($zip2$, ZipArchive [PBKDF2-SHA1/SHA256/SHA512/AES/HMAC-SHA1 32/64])
Will run 8 processes
Press 'q' or Ctrl-C to abort, almost any other key for status
password123 (attack_file.zip)
1g 0:00:00:02 DONE (2025-03-31 05:00) 0.4545g/s (2048p/s) Password123
Session completed
上記の例では、password123
が発見されたパスワード(またはパスワードとして扱える内部キー情報)です。
もし john がデフォルトのモード(シングルクラックモード、ワードリストモード、インクリメンタルモードの組み合わせ)でパスワードを見つけられなくても、特定のワードリストを使いたい場合は以下のように指定できます。
john --wordlist=/path/to/your/passwords.lst attack_hash.txt
しかし、cprepair を使った場合の $zip2$
ハッシュは非常に高速に処理されるため、多くの場合、複雑なワードリストやルールは不要で、john のデフォルト実行だけで十分なことが多いです。
ステップ 5: ZIPファイルの解凍 🎉
ステップ4で john がパスワード(またはそれに相当する情報)を発見したら、それを使って元の protected.zip を解凍できます。
unzip protected.zip
プロンプトが表示されたら、john が発見したパスワード(例: password123
)を入力します。無事にファイルが解凍されれば、パスワード解析は成功です!🙌
cprepairの主なオプション ⚙️
cprepair コマンドには、基本的な使い方以外にもいくつかのオプションがあります。主要なものを以下に示します。
オプション | 説明 | 例 |
---|---|---|
-z <zipfile> |
必須。解析対象の暗号化されたZIPファイルを指定します。 | -z archive.zip |
-f <plainfile> |
必須。既知の平文ファイル(ZIP内に含まれる元のファイル)を指定します。 | -f document.txt |
-o <outfile> |
必須。出力する攻撃用ファイル(新しいZIPファイル)の名前を指定します。 | -o attack.zip |
-c |
ZIPアーカイブ内でファイル名を検索する際に、大文字と小文字を区別しません。Windows環境で作成されたZIPファイルなどで、ファイル名の大文字小文字が -f で指定したファイルと異なる場合に役立つことがあります。 | cprepair -c -z archive.zip ... |
-k <key0> <key1> <key2> |
(上級者向け)PKZIPの内部状態キー(16進数で3つ)を直接指定して、攻撃用ファイルを生成します。通常は使用しません。 | -k aabbccdd 11223344 55667788 |
-t |
テストモード。指定されたキー(-k が必要)が正しいかどうかを検証します。攻撃用ファイルは生成しません。 | cprepair -t -k ... -z archive.zip -f plain.txt |
通常の使用では、-z
, -f
, -o
の3つのオプションを指定すれば十分です。ファイル名の大文字小文字の問題が発生した場合に -c
オプションを試す程度でしょう。
注意点と制限事項 ⚠️
cprepair は非常に強力なツールですが、万能ではありません。利用にあたっては以下の点に注意し、その制限を理解しておく必要があります。
- 対応する暗号化形式: cprepair は、主に古い形式の PKZIP暗号化 (ZipCrypto) を対象としています。近年のZIPツールで標準的に使われることがある AES (Advanced Encryption Standard) で暗号化されたZIPファイルに対しては、cprepair の既知平文攻撃は通常適用できません。AES暗号化ZIPの場合は、zip2john でハッシュを抽出し、john で直接辞書攻撃や総当たり攻撃を行う必要があります。
-
既知平文ファイルの厳密な要件:
前述の通り、-f オプションで指定する既知平文ファイルは、ZIPファイルに含まれているファイルと完全に同一である必要があります。
- 内容がわずかでも違う(編集された、一部が破損しているなど)。
- ファイル名は同じだが、元々異なる圧縮設定(圧縮レベルなど)でZIPに追加された。
- テキストファイルの改行コードが違う (WindowsのCRLFとLinux/macOSのLF)。
-
ファイル名の特定:
ZIPアーカイブ内に同名のファイルが複数存在する場合や、パス情報が含まれている場合、cprepair が意図したファイルを見つけられない可能性があります。
unzip -l protected.zip
などでZIPファイル内の構造を確認し、必要であれば既知平文ファイルのファイル名をそれに合わせて変更する必要があるかもしれません。大文字小文字の違いは -c オプションで吸収できる場合があります。 - 処理時間: cprepair 自体の処理は通常非常に高速です。しかし、元のZIPファイルが非常に大きい場合、内部のファイルをスキャンするのに時間がかかることがあります。また、最終的に john で解析するステップも、CPUの性能に依存します(それでも、cprepair を使わない場合に比べれば格段に高速です)。最も時間がかかるのは、多くの場合、適切な「既知平文ファイル」を探し出す作業かもしれません。
- 倫理的な利用: John the Ripper スイートに含まれるツールは、パスワードのセキュリティ強度をテストしたり、自身が所有権を持つファイルやデータへのアクセスを回復したりする目的で使用されるべきです。他人のファイルやシステムに対して、許可なくこれらのツールを使用することは、不正アクセス行為となり、法的に罰せられる可能性があります。常に倫理的な観点を持ち、法律や規則を遵守して使用してください。
まとめ ✨
cprepair は、John the Ripper スイートの中でも特にPKZIP (ZipCrypto) で暗号化されたZIPファイルのパスワード解析において、既知平文攻撃を自動化するための強力なユーティリティです。
適切な条件下、すなわち完全に同一の既知平文ファイルが手元にある場合には、zip2john と john を組み合わせた通常の解析プロセスと比較して、解析時間を劇的に短縮することができます。
その利用手順は、
- cprepair で既知平文ファイルと暗号化ZIPから攻撃用ファイルを生成 (
cprepair -z ... -f ... -o ...
) - zip2john で攻撃用ファイルから高速なハッシュを抽出 (
zip2john attack_file.zip > attack_hash.txt
) - john で高速ハッシュを解析 (
john attack_hash.txt
)
という流れになります。
ただし、AES暗号化には対応していない点や、既知平文ファイルの厳密な要件など、いくつかの制限事項も存在します。これらの特性をよく理解し、適切なシナリオで活用することで、cprepair はパスワード回復作業における大きな助けとなるでしょう。💪
繰り返しになりますが、このツールは正当な目的のためにのみ使用してください。
参考情報
cprepair および John the Ripper に関する詳細情報は、以下の公式リソースをご参照ください。
- John the Ripper 公式ウェブサイト:
https://www.openwall.com/john/
ダウンロード、ドキュメント、メーリングリストなどの情報があります。
- John the Ripper (Jumbo) GitHubリポジトリ:
https://github.com/openwall/john
最新の開発版ソースコードや、Issueトラッカーなどがあります。cprepair のソースコード (
src/cprepair.c
) もここで確認できます。
コメント