John the Ripper を使用した ZIP パスワードの解析

HydraBeginner
オンラインで実践に進む

はじめに

この実験では、人気があり強力なパスワード復元ツールである John the Ripper を使用して、パスワードで保護された ZIP ファイルを解析する方法を学びます。この演習では、必要なツールのセットアップから解析されたパスワードの検証まで、パスワード解析プロセスの基本的な手順をガイドします。この実験を終える頃には、パスワードハッシュがどのように抽出され、辞書攻撃やブルートフォース(総当たり)攻撃でどのように使用されるかを理解し、ファイル保護における強力なパスワードの使用がいかに重要であるかを実感できるでしょう。

必要なツールのインストール

パスワードの解析を始める前に、必要なソフトウェアをインストールする必要があります。このステップでは、この実験の主要ツールである John the Ripper (JtR) と、ターゲットファイルを作成するために使用する zip ユーティリティをインストールします。Ubuntu などの Debian 系システムの標準である apt パッケージマネージャーを使用します。

まず、ターミナルで以下のコマンドを実行して、必要な依存関係と zip ユーティリティをインストールします。-y フラグは、インストール時の確認に対して自動的に「はい」と回答するものです。

sudo apt update
sudo apt install -y git build-essential libssl-dev zlib1g-dev zip
sudo apt install -y yasm pkg-config libgmp-dev libpcap-dev libbz2-dev

apt リポジトリにある標準の john パッケージには、今回必要となる zip2john ユーティリティが含まれていません。そのため、公式リポジトリから John the Ripper をクローン(複製)してコンパイルし、完全なツールセットを入手します。

cd ~/project
git clone --depth 1 https://github.com/openwall/john -b bleeding-jumbo john
cd john/src
./configure && make -s clean && make -sj4

警告: コンパイルプロセスには 3〜5 分かかる場合があります。そのままお待ちください。

コンパイルが完了したら、どこからでも John the Ripper のツールを使用できるようにエイリアス(別名)を作成します。

echo 'alias john="$HOME/project/john/run/john"' >> ~/.zshrc
echo 'alias zip2john="$HOME/project/john/run/zip2john"' >> ~/.zshrc
source ~/.zshrc

次に、どのディレクトリからでも johnzip2john が正しく動作することを確認します。

john

John the Ripper が正常にインストールされていれば、以下のような出力が表示されます。

John the Ripper 1.9.0-jumbo-1+bleeding-7a8c81abd9 2025-08-23 23:43:48 +0200 OMP [linux-gnu 64-bit x86_64 AVX-512 AC]
Copyright (c) 1996-2025 by Solar Designer and others
Homepage: https://www.openwall.com/john/

Usage: john [OPTIONS] [PASSWORD-FILES]

Use --help to list all available options.

また、zip2john が利用可能であることも確認します。

zip2john

これにより、zip2john ユーティリティの使用方法(Usage)が表示されるはずです。

確認ができたら、実験の続きを行うためにプロジェクトディレクトリに戻ります。

cd ~/project

必要なツールがインストールされたので、解析演習用のパスワード保護ファイルを作成する準備が整いました。

パスワード保護された ZIP ファイルの作成

パスワード解析を実践するには、まずターゲットが必要です。このステップでは、簡単なテキストファイルを作成し、それをパスワード保護された ZIP アーカイブにまとめます。これにより、機密ファイルがパスワードで保護されている現実のシナリオをシミュレートします。

まず、プロジェクトディレクトリにいることを確認してください。デフォルトでこのディレクトリにいるはずです。

cd ~/project

次に、secret.txt という名前の簡単なテキストファイルを作成します。このファイルは、保護された ZIP アーカイブの中に格納されます。

echo "my secret data" > secret.txt

次に、zip コマンドに -e フラグ(暗号化用)を付けて、secret.txt を含む secret.zip という名前のパスワード保護されたアーカイブを作成します。

zip -e secret.zip secret.txt

コマンドを実行すると、パスワードの入力と確認を求められます。この実験では、デモンストレーション目的で解析プロセスを速くするために、弱いパスワードである password123 を使用してください。

注意: パスワードを入力しても、画面には文字が表示されません。これはシステムのフリーズではなく、通常のセキュリティ機能です。そのままパスワードを入力して Enter キーを押してください。

Enter password:
Verify password:
  adding: secret.txt (stored 0%)

最後に、ディレクトリ内のファイルをリスト表示して、secret.zip が作成されたことを確認します。

ls -l

出力に secret.txtsecret.zip が表示されるはずです。

total 8
-rw-rw-r-- 1 labex labex  15 Aug 29 09:57 secret.txt
-rw-rw-r-- 1 labex labex 213 Aug 29 09:57 secret.zip

これで、以降のステップでターゲットとなるパスワード保護された ZIP ファイルの作成に成功しました。

ZIP ファイルからのハッシュ抽出

John the Ripper は ZIP ファイル自体を直接操作するわけではありません。代わりに、ファイルのパスワードハッシュ(Password Hash)に対して動作します。ハッシュとは、パスワードを表現する一意の文字列のことです。このステップでは、John the Ripper に含まれている zip2john というユーティリティを使用して、このハッシュを抽出します。

secret.zip ファイルに対して zip2john コマンドを実行します。> 演算子を使用して出力をリダイレクトし、ハッシュを zip_hash.txt という名前の新しいファイルに保存します。

zip2john secret.zip > zip_hash.txt

このコマンドを実行すると、ターミナルに ZIP ファイルの構造に関する詳細な情報が表示されます。

ver 1.0 efh 5455 efh 7875 secret.zip/secret.txt PKZIP Encr: 2b chk, TS_chk, cmplen=27, decmplen=15, crc=AF1563E8 ts=4F26 cs=4f26 type=0

この情報には、圧縮や暗号化のパラメータなど、暗号化されたファイルに関する詳細が含まれています。

抽出されたハッシュがどのようなものかを確認するには、cat コマンドを使用して zip_hash.txt の内容を表示します。

cat zip_hash.txt

出力は、次のような 1 行のテキストになります。

secret.zip/secret.txt:$pkzip$1*2*2*0*1b*f*af1563e8*0*44*0*1b*4f26*50dbe9bcf15eafdb00ef774e1eaffef116bf5e0597fa55bb8b364c*$/pkzip$:secret.txt:secret.zip::secret.zip

ハッシュ文字列には、元のファイル名、暗号化タイプ($pkzip$)、および暗号化されたデータが含まれています。このハッシュファイルが作成されたことで、John the Ripper を使用してパスワードを解析する準備が整いました。

パスワードの解析

パスワードハッシュを入手したので、John the Ripper を使用して解析を行います。JtR はデフォルト設定を使用します。これには、一般的なパスワードの辞書と、ハッシュに一致するものを見つけるためのルールが含まれています。

解析プロセスを開始するには、john コマンドを実行し、入力としてハッシュファイル zip_hash.txt を指定します。

john zip_hash.txt

非常に弱いパスワードを使用したため、John the Ripper はすぐに解析を完了するはずです。出力には進行状況と結果が表示されます。John はさまざまな攻撃モードを試します。まず「シングル(single)」モード、次に「ワードリスト(wordlist)」モードです。

Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 4 OpenMP threads
Note: Passwords longer than 21 [worst case UTF-8] to 63 [ASCII] rejected
Proceeding with single, rules:Single
Press 'q' or Ctrl-C to abort, 'h' for help, almost any other key for status
Almost done: Processing the remaining buffered candidate passwords, if any.
0g 0:00:00:00 DONE 1/3 (2025-08-29 10:24) 0g/s 2619Kp/s 2619Kc/s 2619KC/s Txtsecret1900..Tzip1900
Proceeding with wordlist:/home/labex/project/john/run/password.lst
Enabling duplicate candidate password suppressor using 256 MiB
password123      (secret.zip/secret.txt)
1g 0:00:00:00 DONE 2/3 (2025-08-29 10:24) 8.333g/s 286541p/s 286541c/s 286541C/s 123456..nelly1
Use the "--show" option to display all of the cracked passwords reliably
Session completed

password123 (secret.zip/secret.txt) という行は、パスワードの解析に成功したことを示しています。John は最初に「シングル」モードを試しましたが(ここでは見つかりませんでした)、次にワードリストモードに移行し、そこでパスワードを正常に見つけたことに注目してください。

パスワードが解析されると、John はそれをファイルに保存します。特定のハッシュファイルに対して解析されたパスワードを表示するには、--show オプションを使用します。

john --show zip_hash.txt

このコマンドは、解析されたパスワードをソースファイルと関連付けて、わかりやすい形式で表示します。

secret.zip/secret.txt:password123:secret.txt:secret.zip::secret.zip

1 password hash cracked, 0 left

John the Ripper を使用して ZIP ファイルのハッシュからパスワードを復元することに成功しました。最後のステップは、このパスワードが実際に機能することを確認することです。

解析されたパスワードによるアクセスの検証

このプロセスの最後のステップは、解析したパスワードが正しいことを確認することです。解析したパスワードを使用して secret.zip アーカイブの内容を展開することで、これを確認します。このステップにより、パスワード解析の結果が妥当であることが証明されます。

unzip コマンドを使用してアーカイブを展開します。

unzip secret.zip

コマンドを実行するとパスワードを求められます。John the Ripper が復元したパスワードである password123 を入力してください。

Archive:  secret.zip
[secret.zip] secret.txt password:
replace secret.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: yes
 extracting: secret.txt

(ステップ 2 で作成した)既存の secret.txt ファイルを置き換えるかどうかを尋ねるプロンプトが表示される場合があります。その場合は yes と入力して上書きを確定してください。パスワードが正しければ、unzip コマンドはエラーなしで secret.txt を現在のディレクトリに展開します。

検証を完了するために、展開されたファイルの内容を表示して、データが損なわれていないことを確認します。

cat secret.txt

出力は、ステップ 2 で作成した元のテキストと一致するはずです。

my secret data

ファイルを正常に展開し、元の内容を確認できたことで、John the Ripper によって復元されたパスワードが正しいことが確認されました。これで、保護されたファイルの作成、パスワードの解析、および結果の検証という一連のサイクルが完了しました。

まとめ

この実験では、John the Ripper を使用したパスワード解析の実地体験を積みました。必要なツールのインストール方法、パスワード保護された ZIP ファイルの作成方法、および zip2john を使用したパスワードハッシュの抽出方法を学びました。その後、John the Ripper を使用してハッシュからパスワードを解析することに成功し、最後にそのパスワードを使用して保護されたファイルにアクセスすることで、解析結果を検証しました。この演習は、セキュリティテストにおける基本的な手法を示すとともに、弱いパスワードの脆弱性を浮き彫りにしています。