zip2john の使い方:ZIPファイルのパスワードハッシュを取得する 🕵️‍♂️

セキュリティツール

はじめに

現代のデジタル社会では、ファイルを圧縮してパスワードで保護することは一般的です。しかし、そのパスワードを忘れてしまうこともありますよね?そんな時、あるいはセキュリティテストの一環として、パスワード保護されたZIPファイルの強度を評価する必要があるかもしれません。ここで登場するのが zip2john というツールです。

zip2john は、有名なオープンソースのパスワードクラッキングツールである John the Ripper (JtR) スイートの一部です。JtRは、様々な種類のパスワードハッシュに対して、辞書攻撃やブルートフォース攻撃(総当たり攻撃)などの手法を用いて元のパスワードを特定しようと試みる強力なツールです。

zip2john の主な役割は、パスワードで保護されたZIPファイルから、John the Ripperが解析できる形式の「ハッシュ」情報を抽出することです。このハッシュは、実際のパスワードそのものではなく、パスワードを検証するためにZIPファイル内に保存されているデータやチェックサムを特定の形式に変換したものです。このハッシュがあれば、元のZIPファイルがなくても (一部の形式を除く)、John the Ripperを使ってパスワードのクラッキングを試みることができます。

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

John the Ripperおよび zip2john は非常に強力なツールですが、その使用は自分が所有しているファイル、または明確な許可を得ているファイルに対してのみ行うべきです。他人のファイルに対して無断で使用することは、プライバシーの侵害や法的な問題を引き起こす可能性があります。このブログは、教育目的および正当な理由(パスワード忘れ、セキュリティ監査など)での利用を前提としています。ツールの悪用は絶対にしないでください。

この記事では、zip2john の基本的な使い方から、出力されるハッシュの形式、そしてそのハッシュをJohn the Ripperでどのように利用するかまでを詳しく解説していきます。パスワード回復やセキュリティ評価のスキルを向上させたい方は、ぜひ読み進めてください。

John the Ripper (と zip2john) のインストール

zip2john は単体で配布されているわけではなく、John the Ripperスイートに含まれています。したがって、zip2john を使うためには、まずJohn the Ripperをインストールする必要があります。

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

多くのLinuxディストリビューションでは、パッケージマネージャを使って簡単にインストールできます。特にKali LinuxやParrot OSのようなペネトレーションテスト用のディストリビューションには、最初からJohn the Ripperが含まれていることが多いです。

DebianやUbuntuベースのシステムでは、ターミナルを開いて以下のコマンドを実行します。

sudo apt update
sudo apt install john -y

これで、john コマンドと、zip2john などの関連ツールがインストールされます。場合によっては、zip2john など一部のツールは john-data パッケージに含まれていることもあります。

これらのシステムでは、dnfyum パッケージマネージャを使用します。

sudo dnf install john -y
# または
sudo yum install john -y

macOSでは、Homebrew というパッケージマネージャを使うのが一般的です。Homebrewがインストールされていない場合は、まず Homebrewの公式サイト の指示に従ってインストールしてください。

Homebrewがインストールできたら、ターミナルで以下のコマンドを実行します。より多くの機能が含まれている “jumbo” バージョンをインストールするのがおすすめです。

brew install john-jumbo

注意: macOS (特にApple Silicon M1/M2など) でHomebrewを使ってインストールした場合、zip2john などのツールが通常のパス (/usr/local/bin/opt/homebrew/bin) に直接配置されないことがあります。2021年頃の情報では、/opt/homebrew/Cellar/john-jumbo/<バージョン>/share/john/ のような場所に配置される場合がありました。もし zip2john コマンドが見つからない場合は、このパスを確認し、必要であればフルパスで実行するか、このディレクトリを環境変数 $PATH に追加してください。

# 例: フルパスで実行
/opt/homebrew/Cellar/john-jumbo/1.9.0/share/john/zip2john your_archive.zip

# 例: PATHに追加 (一時的)
export PATH="/opt/homebrew/Cellar/john-jumbo/1.9.0/share/john:$PATH"
zip2john your_archive.zip

(バージョン番号 1.9.0 は適宜読み替えてください)

Windowsの場合は、John the Ripperの公式サイトからコンパイル済みのバイナリをダウンロードするのが最も簡単です。

  1. John the Ripper 公式サイトにアクセスします。
  2. “Windows binaries” のセクションを探し、最新の “jumbo” バージョン (例: 1.9.0-jumbo-1 64-bit Windows binaries) のZIPまたは7zファイルをダウンロードします。
  3. ダウンロードしたファイルを任意のフォルダに解凍します。
  4. 解凍したフォルダの中にある run というサブフォルダに、john.exezip2john.exe などの実行ファイルが含まれています。

Windowsでコマンドを実行するには、コマンドプロンプトまたはPowerShellを開き、cd コマンドで run フォルダに移動してから、zip2john.exe などを実行します。

# 例: runフォルダへの移動
cd path\to\john-1.9.0-jumbo-1-win64\run

# zip2johnの実行
.\zip2john.exe C:\path\to\your_archive.zip > C:\path\to\hash.txt

上記の方法でうまくいかない場合や、最新の開発版を使いたい場合は、GitHubリポジトリからソースコードをクローンして自分でビルドすることも可能です。これには通常、開発ツール(コンパイラ、makeなど)が必要です。

git clone https://github.com/openwall/john.git
cd john/src
./configure
make -s clean && make -sj4 # -sj4 は並列ビルド数を指定 (CPUコア数に合わせる)
cd ../run

ビルド後、run ディレクトリ内に実行ファイルが生成されます。

これで、zip2john を使う準備が整いました 🎉。

基本的な使い方 🚀

zip2john の基本的な使い方は非常にシンプルです。ターミナル(またはコマンドプロンプト)を開き、以下の形式でコマンドを実行します。

zip2john [オプション] <ZIPファイル名>

最も簡単な例として、secret.zip という名前のパスワード保護されたZIPファイルからハッシュを抽出してみましょう。

zip2john secret.zip

このコマンドを実行すると、以下のような形式の文字列が標準出力(通常はターミナル画面)に出力されます。これがJohn the Ripperが解析できるハッシュ形式です。

secret.zip:$zip2$*0*1*0*d7f9a9f7ab9d9a9e*eda1*0*28*8*d7f9*eda1*51e9*5c2e2a8e499edb83d350a9838c166f8971a681b6c6e808a02f266fa90d4652395a35*$/zip2$:::secret.zip

(注意: 上記のハッシュはあくまで例であり、実際のハッシュはファイルの内容や暗号化方式によって異なります。)

この出力されたハッシュ文字列を、後でJohn the Ripperで使うためにファイルに保存するのが一般的です。リダイレクト演算子 > を使ってファイルに保存しましょう。

zip2john secret.zip > zip_hash.txt

これにより、zip2john の出力が zip_hash.txt という名前のファイルに書き込まれます。ファイル名は任意ですが、どのZIPファイルのハッシュか分かるようにしておくと良いでしょう。

zip2john にはいくつかのオプションがありますが、日常的に使うものは限られています。

オプション 説明
-o <ファイル名> ZIPアーカイブ内に複数の暗号化されたファイルが含まれており、それらが異なるパスワードで保護されている可能性がある場合に使用します。このオプションで特定のファイル名を指定すると、そのファイルのみからハッシュを生成しようと試みます。デフォルトでは、アーカイブ内のすべてのファイルが同じパスワードで保護されていると仮定してハッシュが生成されるため、異なるパスワードが混在していると、生成されたハッシュではパスワードを解読できない可能性があります。
-a <ファイル名> (旧PKZIP形式のみ) アーカイブ内の特定のファイルが、純粋なASCIIテキストで始まっていることが分かっている場合に指定します。これにより、既知平文攻撃 (Known-Plaintext Attack) の一種として解析速度が向上する可能性がありますが、確実でない場合は使用を避けるべきです。
-c (旧PKZIP形式のみ) チェックサム情報のみを含むハッシュを生成します。アーカイブ内に多数のファイルが含まれている場合に有効なことがあります。ファイルデータ自体を含まないため、プライバシーの観点からはより安全ですが、解読可能性は低下する可能性があります。
-m (旧PKZIP形式のみ) ファイルの「マジックナンバー」(ファイル形式を識別するための先頭バイト列)を既知平文として利用しようと試みます。特定の状況下で高速化する可能性がありますが、常に安全とは限りません。
-s 中央ディレクトリ(ZIPファイルの最後に記録されるファイル一覧)ではなく、アーカイブの先頭からローカルファイルヘッダーを探査します。破損したアーカイブや分割されたアーカイブで有効な場合がありますが、信頼性は低くなります。

多くの場合、オプションなしで zip2john <ZIPファイル名> > <出力ファイル名> の形式で十分です。特に、アーカイブ内のファイルがすべて同じパスワードで保護されている場合は、これで問題ありません。

💡 ヒント

zip2john がエラーを出す場合(例: “is not encrypted!”)、ZIPファイル自体がパスワードで保護されていないか、あるいは zip2john が対応していない特殊な形式や破損したファイルである可能性があります。また、非常に大きなZIPファイルの場合、生成されるハッシュも非常に大きくなることがあり(数GBに達することも!)、メモリやディスク容量に注意が必要です。

出力されるハッシュ形式の理解 🧩

zip2john が出力する文字列は、一見するとランダムなデータのように見えますが、John the Ripperがパスワードを検証するために必要な情報が構造化されて含まれています。ハッシュの形式は、ZIPファイルの暗号化方式によって主に2つの種類があります。

これは伝統的なZIP暗号化(ZipCrypto)で保護されたファイルに対する形式です。Windowsの標準機能などで作成したパスワード付きZIPファイルは、多くの場合この形式になります。

例:

archive.zip:$pkzip2$1*1*2*0*28*8*79b5*a415*534713e432360974045a4a540a0e36a39e84*$/pkzip2$:::archive.zip

この形式には、以下のような情報が含まれています(詳細なフィールドはバージョンによって変化することがあります):

  • ファイル名: 元のZIPファイル名 (例: archive.zip)
  • フォーマット識別子: $pkzip$ または $pkzip2$
  • ファイル数 (C): ハッシュ生成に使用されたファイル数
  • チェックサムバイト数 (B): チェックサムのバイト数 (1または2)
  • ファイルごとの情報 (配列):
    • データタイプ (DT): データの種類 (例: 1=完全データ, 2=チェックサムのみ, 3=データなし)
    • モードタイプ (MT): 暗号化モードに関する情報
    • 圧縮後サイズ (CL): 圧縮・暗号化されたデータの長さ
    • 展開後サイズ (UL): 元のデータの長さ
    • CRC32チェックサム (CR): ファイルのCRC32チェックサム (一部)
    • オフセット (OF, OX): ファイルデータの位置情報
    • 圧縮タイプ (CT): 0=無圧縮, 8=Deflateなど
    • データ長 (DL): 続くデータ(DA)の長さ
    • チェックサムデータ (CS, TC): パスワード検証に使われる短いチェックサム (CRCの一部やタイムスタンプ由来)
    • データ (DA): 暗号化されたファイルデータの一部(または全部、あるいはファイル名)
  • 終端識別子: $/pkzip$ または $/pkzip2$
  • 追加情報: ::: の後に再度ファイル名など

重要なのは、この形式には実際のパスワードのハッシュそのものは含まれていないということです。代わりに、暗号化されたデータの一部とチェックサムが含まれており、John the Ripperはパスワード候補を使ってデータを復号し、チェックサムが一致するかどうかでパスワードの正しさを検証します。このため、zip2john の出力は非常に長くなることがあります(特にアーカイブ内の最小ファイルが大きい場合)。

WinZip 9以降で導入されたAES(AES-128, AES-192, AES-256)暗号化を使用している場合の形式です。7-ZipなどのツールでAES暗号化を指定した場合もこの形式になることがあります。

例:

secure.zip:$zip2$*0*1*0*e0dfb7f4b91d2b5a*f7e1*0*28*8*e0df*f7e1*9d3e*a54a1a08797a295530580f330e7f346a32a8212b4e08d6e8832e8e93a7360f717e2a*$/zip2$:::secure.zip

この形式のフィールド構造は $pkzip2$ と似ていますが、AES暗号化に特有の情報が含まれます。

  • ファイル名: 元のZIPファイル名
  • フォーマット識別子: $zip2$
  • タイプ (Ty): 暗号化タイプ (通常は0)
  • モード (Mo): AESのビット長を示す (1=128bit, 2=192bit, 3=256bit)
  • マジック (Ma): ファイルマジック用 (現在は通常0)
  • ソルト (Sa): パスワードから鍵を生成するためのソルト値 (16進数)
  • 検証バイト (Va): パスワードを素早く検証するための2バイトの値 (16進数)
  • データ長 (Le): 暗号化されたデータの実際の長さ (16進数)
  • データ (DF): 暗号化されたデータ、またはデータへのポインタ情報 (*ZFILE*...)
  • 終端識別子: $/zip2$
  • 追加情報: ::: の後に再度ファイル名など

AES形式の場合、パスワードから鍵を導出するための「ソルト」と、パスワードが正しいかを素早くチェックするための「検証バイト」が含まれているのが特徴です。これにより、ZipCrypto形式よりも効率的なパスワードクラッキングが可能になる場合があります。

重要: データフィールド(DF)が非常に長い場合、ハッシュ文字列内に実際のデータを含める代わりに、*ZFILE*<元のZIPファイル名>*<オフセットなど>* という形式のポインタが含まれることがあります。この場合、John the Ripperを実行する際には、元のZIPファイルが同じ場所にある必要があります。ハッシュファイルだけを別の場所に移動しても動作しません。

これらのハッシュ形式を正確に理解する必要はありませんが、どの形式 ($pkzip2$ or $zip2$) が使われているか、そして元のZIPファイルが必要になるケースがあることを知っておくと、トラブルシューティングに役立ちます。

John the Ripperでのハッシュ利用方法 🔑

zip2john でZIPファイルからハッシュを抽出し、ファイル(例: zip_hash.txt)に保存したら、いよいよJohn the Ripper (john コマンド) を使ってパスワードのクラッキングを試みます。

John the Ripperにはいくつかのクラッキングモードがありますが、ここでは主要なモードでの使い方を紹介します。

最も基本的な使い方は、ハッシュファイル名を指定して john コマンドを実行するだけです。

john zip_hash.txt

このコマンドを実行すると、John the Ripperは以下の順番で自動的に複数のモードを試します。

  1. シングルクラックモード (Single Crack Mode): ハッシュファイル内の情報(ファイル名など)や、一般的な変換ルール(大文字小文字変換、数字付加など)を使ってパスワードを推測します。非常に高速ですが、単純なパスワードしか見つけられないことが多いです。
  2. ワードリストモード (Wordlist Mode): デフォルトで内蔵されている辞書ファイル (password.lst) を使って攻撃します。一般的な単語やよく使われるパスワードが含まれています。
  3. インクリメンタルモード (Incremental Mode): 指定された文字セット(例: 英小文字、数字など)を使って、短いものから順にすべての組み合わせを試すブルートフォース(総当たり)攻撃です。非常に時間がかかりますが、理論上は見つけられる可能性が最も高いモードです。

John the Ripperはクラッキングの進行状況をターミナルに表示します。パスワードが見つかると、以下のように表示されます。

Loaded 1 password hash (PKZIP, ...)
Will run 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password123      (secret.zip)
1g 0:00:00:05 DONE (2025-03-31 06:10) 0.1886g/s (12345p/s) ...
Session completed

この例では、パスワード password123 が見つかったことを示しています。見つかったパスワードは john.pot というファイルにも記録され、次回同じハッシュを解析しようとしても、既に解析済みとして結果がすぐに表示されます。

より効果的なクラッキングを行うためには、大規模な辞書ファイル(ワードリスト)を使用することが推奨されます。例えば、有名な rockyou.txt などのワードリストをダウンロードして使用できます。(rockyou.txt は過去に漏洩したパスワードを集めたもので、非常に強力ですが、入手と利用は自己責任で行ってください。)

特定のワードリストファイル (my_wordlist.txt) を使ってクラッキングするには、--wordlist オプションを使用します。

john --wordlist=my_wordlist.txt zip_hash.txt

Kali Linuxなどでは、rockyou.txt/usr/share/wordlists/rockyou.txt.gz などに圧縮されて配置されていることが多いです。使用する前に解凍する必要があります。

sudo gzip -d /usr/share/wordlists/rockyou.txt.gz
john --wordlist=/usr/share/wordlists/rockyou.txt zip_hash.txt

特定の文字種(例: 数字のみ、英小文字のみなど)で、特定の長さのパスワードを総当たりで試したい場合は、--incremental オプションや --mask オプションを使用します。

例: 4桁の数字のみを試す場合

john --incremental=Digits --max-length=4 zip_hash.txt
# またはマスクを使用
john --mask='?d?d?d?d' zip_hash.txt

マスクでは、?d は数字、?l は英小文字、?u は英大文字、?s は記号、?a はそのすべてを表します。桁数が増えると、試行回数は指数関数的に増加するため、非常に時間がかかります。

通常、John the Ripperはハッシュの形式を自動で検出しますが、明示的に指定することも可能です。ZIPファイルの場合は --format=zip を使用します。(内部的にはPKZIPやWinZip AESなど、より具体的な形式に解決されます。)

john --wordlist=my_wordlist.txt --format=zip zip_hash.txt

ハッシュの自動検出がうまくいかない場合や、複数の形式として認識されてしまう場合に指定すると有効です。

  • --show: 既にクラックされたパスワードを表示します (john --show zip_hash.txt)。
  • --fork=N: N個のプロセスを並列実行してクラッキングを高速化します(CPUコア数に合わせると効果的)。
  • --rules: ワードリストモードと組み合わせて、辞書の単語に様々な変換ルール(例: l33t変換、大文字化、数字付加)を適用し、より複雑なパスワードを試します。

John the Ripperは非常に多機能なツールであり、ここで紹介したのは基本的な使い方の一部です。より詳しいオプションやテクニックについては、公式ドキュメントや関連資料を参照してください。重要なのは、適切なモードとオプションを選択することで、効率的にパスワードクラッキング(または強度評価)を行えるということです💪。

高度な利用と注意点 🤔

zip2john と John the Ripper を使う上で、いくつかの高度なシナリオや注意点があります。

前述の通り、1つのZIPアーカイブ内に複数のファイルが含まれており、それらが異なるパスワードで保護されている場合、単純に zip2john archive.zip を実行して得られたハッシュでは、いずれのパスワードも見つけられない可能性があります。

このような場合は、zip2john-o オプションを使って、アーカイブ内の特定のファイル名を指定し、ファイルごとにハッシュを生成する必要があります。

# アーカイブ内の file1.txt のハッシュを生成
zip2john -o file1.txt archive.zip > hash_file1.txt

# アーカイブ内の file2.docx のハッシュを生成
zip2john -o file2.docx archive.zip > hash_file2.txt

# それぞれのハッシュに対してJohn the Ripperを実行
john hash_file1.txt
john hash_file2.txt

どのファイルが暗号化されているか、またどのファイルで試すべきか不明な場合は、アーカイブ内のファイルをリスト表示 (unzip -l archive.zip など) して確認し、いくつか試してみる必要があるかもしれません。

ZIPファイルの暗号化には、伝統的なZipCryptoやWinZip AES以外にも、比較的新しい方式や特殊な方式が存在する可能性があります。zip2john は多くの一般的な形式に対応していますが、すべての形式に対応しているわけではありません。

もし zip2john がハッシュを生成できない、あるいは生成されたハッシュでJohn the Ripperがエラーを出す場合は、使用されている暗号化形式がサポートされていない可能性があります。最新版のJohn the Ripper (jumboバージョン) を使うことで、対応範囲が広がることがあります。

パスワード保護されたZIPファイル、特に $pkzip$ 形式の場合、zip2john が生成するハッシュ文字列は、アーカイブ内の(通常は最小の)暗号化ファイルのデータを含むため、非常に大きくなることがあります。元のZIPファイルが数GBの場合、ハッシュファイルも同程度かそれ以上になる可能性があります。

これは、John the Ripperがパスワードを試す際に、その都度データの一部を復号してチェックサムを検証する必要があるためです。ハッシュファイルが大きいと、ディスクI/Oがボトルネックになったり、メモリ使用量が増加したりする可能性があります。

また、John the Ripperによるクラッキング速度は、CPUの性能に大きく依存します。複雑なパスワードや長いパスワードの場合、クラッキングには膨大な時間がかかる可能性があります(数日、数週間、あるいはそれ以上)。GPUアクセラレーションに対応したパスワードクラッキングツール(例: Hashcat)と組み合わせることで速度を向上させることも可能ですが、zip2john で生成したハッシュをHashcatで使う場合は、対応するモード番号(例: 17200, 17210, 13600など)を正しく指定する必要があります。

zip2john で生成したハッシュは、John the Ripperだけでなく、GPUを活用できる高速なパスワードクラッキングツールである Hashcat でも利用できます。

ただし、Hashcatで利用する際には、zip2john の出力から不要な部分(ファイル名やコメントなど)を取り除き、$zip2$...$/zip2$$pkzip2$...$/pkzip2$ の部分だけを抽出する必要がある場合があります。

そして、Hashcatの -m オプションで適切なハッシュモードを指定する必要があります。主なZIP関連のモードは以下の通りです。

モード番号 説明
13600 WinZip (AES)
17200 PKZIP (Compressed) – ZipCrypto, 圧縮あり
17210 PKZIP (Uncompressed) – ZipCrypto, 無圧縮
17220 PKZIP (Compressed Multi-File) – 複数ファイル、圧縮あり
17225 PKZIP (Mixed Multi-File) – 複数ファイル、圧縮/無圧縮混在
17230 PKZIP (Compressed Multi-File Checksum-Only) – 複数ファイル、チェックサムのみ
20500 PKZIP Master Key (SecureZIP AES-128)
20510 PKZIP Master Key (SecureZIP AES-192/256)

zip2john の出力にある情報(圧縮されているか、AESかなど)を元に、適切なモードを選択します。例えば、zip2john の出力に cmplen (圧縮後サイズ) と decmplen (展開後サイズ) があり、これらが異なる場合は圧縮されている (-m 17200 など)、同じ場合は無圧縮 (-m 17210) と判断できます。

Hashcatでの実行例 (ブルートフォース):

# WinZip AESの場合
hashcat -m 13600 -a 3 zip_hash_for_hashcat.txt '?a?a?a?a?a?a'

# PKZIP (ZipCrypto) 圧縮ありの場合
hashcat -m 17200 -a 3 zip_hash_for_hashcat.txt '?d?d?d?d'

Hashcatの利用はJohn the Ripperよりも設定が複雑になる場合がありますが、GPUのパワーを最大限に活用できるため、より高速な解析が期待できます。

🚨 再度、倫理的な注意

これらのツールは、パスワードを忘れてしまった自分のファイルへのアクセス回復や、組織内でのセキュリティ強度評価など、正当な目的のためにのみ使用してください。許可なく他者のファイルやシステムにアクセスしようとする行為は、法律や倫理に反します。

まとめ ✨

この記事では、John the Ripperスイートに含まれる zip2john ツールの使い方について解説しました。

  • zip2john は、パスワードで保護されたZIPファイルから、John the Ripperが解析できる形式のハッシュ情報を抽出するツールです。
  • 基本的な使い方は zip2john <ZIPファイル名> > <出力ファイル名> です。
  • 出力されるハッシュ形式は、主に旧ZipCrypto ($pkzip2$) と WinZip AES ($zip2$) があります。
  • 生成されたハッシュファイルは、john <ハッシュファイル名> コマンドでパスワードクラッキングを試みることができます。
  • --wordlist--incremental/--mask オプションを使って、より効果的な攻撃が可能です。
  • 複数のファイルが異なるパスワードで保護されている場合や、ファイルサイズが大きい場合には注意が必要です。
  • 生成されたハッシュは、Hashcatなどの他のツールでも利用できる場合があります。

zip2john と John the Ripper は、パスワードで保護されたZIPファイルのセキュリティ強度を評価したり、忘れてしまったパスワードを回復したりするための強力なツールです。しかし、その力を理解し、常に倫理的かつ合法的な範囲で使用することが極めて重要です。

この情報が、皆さんの学習や正当な業務に役立つことを願っています。🔒

参考情報 📚

より詳しい情報や最新の情報については、以下の公式リソースをご参照ください。

コメント

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