John the RipperでLUKSパスフレーズを解析する方法
はじめに
Linux環境で広く使われているディスク暗号化技術「LUKS (Linux Unified Key Setup)」。重要なデータを保護するために非常に有効ですが、万が一パスフレーズを忘れてしまった場合、データへのアクセスが不可能になってしまいます。
そんな時に役立つ(かもしれない)のが、パスワード解析ツール「John the Ripper」と、その補助ツールである「luks2john
」です。
この記事では、luks2john
を使ってLUKS暗号化ボリュームからパスワードハッシュ情報を抽出し、John the Ripperでパスフレーズの解析を試みる方法について、詳しく解説していきます。
パスワード解析は、設定されたパスフレーズの強度によっては非常に時間がかかる、あるいは現実的な時間内では完了しない可能性があることを念頭に置いてください。特にLUKSでは、総当たり攻撃(Bruteforce attack)を防ぐためにPBKDF2(Password-Based Key Derivation Function 2)などの鍵導出関数が使用されており、意図的にパスワード検証に時間がかかるように設計されています。
LUKSとJohn the Ripperについて
LUKS (Linux Unified Key Setup)とは?
LUKSは、Linuxカーネルのデバイスマッパーサブシステムを利用したディスク暗号化の標準的な仕様です。dm-cryptを基盤としており、単なるディスク暗号化だけでなく、複数のユーザーキー(パスフレーズやキーファイル)の管理、パスフレーズの変更、キーの追加・削除などの機能を提供します。
LUKSは、暗号化されたデータ本体とは別に、ヘッダー情報を持っています。このヘッダーには、使用されている暗号化方式、ハッシュアルゴリズム、ソルト(Salt)、そしてマスターキーを暗号化するための複数のキースロットなどが格納されています。ユーザーが入力したパスフレーズは、PBKDF2などのプロセスを経てキースロット内の暗号化されたマスターキーの復号を試み、成功すればそのマスターキーを使ってデータ本体を復号・マウントできる仕組みです。
LUKSには主にLUKS1とLUKS2の2つのバージョンが存在します。LUKS2はより新しいバージョンで、ヘッダーサイズの柔軟性向上や、より高度な機能(例:オンラインでのヘッダー再暗号化)をサポートしています。
cryptsetup luksDump <デバイスファイル>
コマンドを使用すると、LUKSヘッダーの詳細情報を確認できます。
# cryptsetup luksDump /dev/sdXN
LUKS header information
Version: 2
Epoch: 3
Metadata area: 16384 [bytes]
Keyslots area: 16744448 [bytes]
UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Label: (no label)
Subsystem: (no subsystem)
Flags: (no flags)
Data segments:
0: crypt
offset: 2097152 [bytes]
length: (whole device)
cipher: aes-xts-plain64
sector: 512 [bytes]
Keyslots:
0: luks2
Key: 512 bits
Priority: normal
Cipher: aes-xts-plain64
Cipher key: 512 bits
PBKDF: pbkdf2
Hash: sha256
Iterations: 137500
Salt: ...
AF stripes: 4000
Area offset:32768 [bytes]
Area length:258048 [bytes]
Digest ID: 0
Tokens:
Digests:
0: pbkdf2
Hash: sha256
Iterations: 1000
Salt: ...
Digest: ...
John the Ripper (JtR)とは?
John the Ripper(略称: JtR)は、オープンソースで開発されている強力なパスワードクラッキングツールです。もともとはUNIX系のパスワードハッシュ(/etc/shadow
に格納されているものなど)を解析するために開発されましたが、現在では「Jumbo」と呼ばれる拡張版を中心に、非常に多くのハッシュ形式や暗号化フォーマットに対応しています。
JtRは主に以下の攻撃モードを持っています。
- Wordlist mode (辞書攻撃): パスワードとして使われそうな単語を集めたリスト(辞書ファイル)を使って攻撃します。JtRにはデフォルトの辞書が付属していますが、より大規模な辞書や、ターゲットに関連する単語を集めたカスタム辞書を使うことで成功率を高められます。さらに、辞書の単語に特定のルール(例:数字を追加する、大文字小文字を変換する)を適用する「マングリングルール」を組み合わせることで、より複雑なパスワードにも対応できます。
- Single crack mode: ユーザー名などの情報からパスワードを推測するモードです。ユーザー名そのものや、それを少し変更した文字列(例:user123)などを試します。
- Incremental mode (総当たり攻撃 / ブルートフォース攻撃): 指定された文字セット(例:英小文字、英大文字、数字、記号)の組み合わせを全て試すモードです。非常に時間がかかりますが、理論上はあらゆるパスワードを発見できます。文字数や文字セットを適切に絞り込むことが重要です。
- External mode: 外部のプログラムやスクリプトを利用してパスワード候補を生成するモードです。特殊なパスワード生成ロジックを使いたい場合に利用します。
JtRはCPUリソースを効率的に使用して解析処理を行います。LUKSのように計算コストの高いハッシュ形式の場合、解析には相応のマシンパワーと時間が必要になります。
luks2john の役割と使い方
luks2john とは?
luks2john
は、John the Ripper (Jumbo バージョン) に含まれるユーティリティスクリプト(主にPythonで書かれています)の一つです。その主な役割は、LUKSで暗号化されたデバイスやヘッダーファイルから、John the Ripperが解析できる形式の「ハッシュ情報」を抽出することです。
John the Ripper本体は、直接LUKSデバイスを読み込んで解析することはできません。事前にluks2john
を使って、パスフレーズの検証に必要な情報(キースロット情報、PBKDF2のパラメータ、ソルト、暗号化されたマスターキーの断片など)を特定のテキスト形式に変換しておく必要があります。
この抽出されたハッシュ情報には、元のパスフレーズそのものは含まれていません。しかし、この情報とパスフレーズ候補があれば、JtRはその候補が正しいかどうかを検証することができます。
luks2john
は通常、John the Ripperのrun
ディレクトリ内に配置されています。
必要なもの
- John the Ripper (Jumbo version):
luks2john
が含まれているJumbo版が必要です。多くのLinuxディストリビューションではパッケージ管理システムからインストールできます(例:sudo apt install john
やsudo dnf install john
)。ソースからビルドすることも可能です。 - LUKSデバイスまたはヘッダーファイル: 解析対象のLUKSで暗号化されたパーティション(例:
/dev/sda3
)または、dd
コマンドなどで事前にバックアップしたLUKSヘッダーファイルが必要です。
luks2john の基本的な使い方
luks2john
の基本的なコマンド構文は非常にシンプルです。
/path/to/john/run/luks2john <LUKSデバイスまたはヘッダーファイル> > <出力ファイル名>
例えば、John the Ripperが /opt/john
にインストールされており、解析対象が /dev/sda3
の場合、以下のように実行します。
sudo /opt/john/run/luks2john /dev/sda3 > luks_hash.txt
または、バックアップしたヘッダーファイル luks_header.img
を使う場合は、root権限は不要です。
/opt/john/run/luks2john luks_header.img > luks_hash.txt
このコマンドは、/dev/sda3
(またはluks_header.img
)からLUKSヘッダー情報を読み込み、JtRが理解できる形式に変換して標準出力に出力します。リダイレクト(>
)を使って、その出力を luks_hash.txt
というファイルに保存しています。
出力される luks_hash.txt
の中身は、通常、以下のような形式になっています(内容はLUKSのバージョンや設定によって異なります)。
device:$luks$0$....(非常に長い文字列)....
この一行に、パスフレーズ解析に必要な情報がエンコードされて含まれています。$luks$
はJtRがLUKSハッシュであることを認識するための識別子です。
/dev/sda3
)に対して luks2john
を実行する場合、そのデバイスへの読み取りアクセス権が必要です。通常は sudo
を使ってroot権限で実行する必要があります。ヘッダーファイルに対して実行する場合は、そのファイルへの読み取り権限があれば十分です。
John the Ripperでのパスワード解析
luks2john
でハッシュ情報を抽出したら、いよいよJohn the Ripper本体を使ってパスフレーズの解析を行います。
基本的な実行方法
最も基本的な実行方法は、抽出したハッシュファイルをJtRに渡すだけです。
/path/to/john/run/john <ハッシュファイル>
先ほどの例で作成した luks_hash.txt
を使う場合は、以下のようになります。
/opt/john/run/john luks_hash.txt
これを実行すると、JtRはデフォルトのモード(通常は single crack mode → wordlist mode → incremental mode の順)で解析を開始します。
解析の進捗状況は、実行中に任意のキー(スペースキーなど)を押すことで確認できます。解析が成功し、パスフレーズが見つかると、画面に表示され、$JOHN/john.pot
というファイル(Potファイル)に記録されます。
Loaded 1 password hash (LUKS [PBKDF2-SHA256 AES 256/256 AVX2 8x])
Cost 1 (iteration count) is 137500 for all loaded hashes
Will run 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:00:10 DONE (2025-03-31 09:55) 0g/s 1.5p/s 1.5c/s 1.5C/s password123..secretword
Session started
Session completed
上記の例では、10秒後にパスフレーズが見つかったことを示唆しています(実際にはLUKSの解析はもっと時間がかかります)。見つかったパスフレーズは password123
と secretword
のようです(これはあくまで例です)。
解析を中断した場合でも、再度同じコマンドを実行すれば、中断した箇所から解析を再開できます。これはPotファイルに進捗が記録されているためです。
解析結果の表示
解析が完了した後や、過去に見つけたパスフレーズを確認するには --show
オプションを使います。
/opt/john/run/john --show <ハッシュファイル>
/opt/john/run/john --show luks_hash.txt
これにより、Potファイルに記録されている、指定したハッシュファイルに対応する解析結果(見つかったパスフレーズ)が表示されます。
device:CorrectPassword123: ... (省略) ...
1 password hash cracked, 0 left
この例では、CorrectPassword123
というパスフレーズが見つかったことを示しています。
攻撃モードの指定
特定の攻撃モードを指定して解析を行うことも可能です。
-
辞書攻撃 (Wordlist mode):
/opt/john/run/john --wordlist=/path/to/password.lst luks_hash.txt
/path/to/password.lst
にある単語リストを使って解析します。--rules
オプションを組み合わせることで、マングリングルールを適用することもできます。/opt/john/run/john --wordlist=/path/to/password.lst --rules=Jumbo luks_hash.txt
-
総当たり攻撃 (Incremental mode):
デフォルトの文字セットで総当たり攻撃を開始します。特定の文字セット(例: 数字のみ)を指定することも可能です。/opt/john/run/john --incremental luks_hash.txt
/opt/john/run/john --incremental=Digits luks_hash.txt
john.conf
ファイルでカスタムの文字セットやルールを定義することもできます。
フォーマットの指定 (オプション)
通常、JtRはハッシュファイルの内容から自動的にフォーマット(この場合はLUKS)を判別しますが、明示的に指定することもできます。
/opt/john/run/john --format=LUKS luks_hash.txt
これにより、JtRが確実にLUKSフォーマットとしてハッシュを解釈するようになります。
考慮事項とヒント
- 解析時間: LUKSはPBKDF2の反復回数(Iterations)を多く設定することで、意図的にパスフレーズ検証の計算コストを高めています。
cryptsetup luksDump
で表示される Iterations の値が大きいほど、1秒間に試行できるパスフレーズの数は少なくなり、解析には膨大な時間がかかる可能性があります。強力なCPUや、場合によってはGPUを利用できるツール(Hashcatなど)を使っても、複雑で長いパスフレーズの解析は非現実的な時間が必要になることが多いです。 - パスフレーズの複雑さ: 解析の成功率は、元のパスフレーズの複雑さに大きく依存します。短くて単純なパスフレーズ(辞書にある単語、簡単な数字の並びなど)は比較的短時間で見つかる可能性がありますが、長くてランダムな文字列(大文字、小文字、数字、記号を含む)は、総当たり攻撃でも発見が極めて困難です。
- メモリ使用量: 解析プロセス、特に複雑なルールを使用する辞書攻撃では、相応のメモリを消費する場合があります。
- 他のキースロット: LUKSは最大8つのキースロットを持つことができます。もし忘れたパスフレーズ以外に、有効なパスフレーズやキーファイルが他のスロットに登録されていれば、それを使ってボリュームを開き、忘れたパスフレーズのスロットを無効化したり、新しいパスフレーズを追加したりできます。
cryptsetup luksDump
でキースロットの状態を確認しましょう。 - 他のツール (Hashcat): HashcatもLUKSパスフレーズの解析に対応している有名なツールです (モード14600など)。HashcatはGPUアクセラレーションに強く、対応するGPUがあればJtRよりも高速な解析が期待できる場合があります。ただし、対応しているLUKSのバージョンや暗号化方式に制限がある可能性があります。Hashcatを使用する場合も、
luks2john
や、Hashcatに付属するluks2hashcat.py
のようなツールでハッシュ情報を抽出する必要があります。 - 倫理と法律: 再三になりますが、これらのツールは正当な目的(忘れたパスワードの回復、セキュリティ監査など)のためにのみ使用してください。不正な目的での使用は法的に罰せられる可能性があります。
- データ復旧の専門家: 自力での解析が困難な場合や、重要なデータで失敗が許されない場合は、データ復旧の専門業者に相談することも検討してください。ただし、暗号化されたデータの復旧は非常に困難であり、高額な費用がかかるか、不可能である場合も多いです。
まとめ
luks2john
は、John the Ripperを使用してLUKS暗号化ボリュームのパスフレーズ解析を行うための重要な前処理ツールです。LUKSヘッダーからJtRが扱えるハッシュ形式を抽出し、様々な攻撃モードでパスフレーズの回復を試みることができます。
しかし、LUKSの設計上、特に強力なパスフレーズが設定されている場合、解析には非常に長い時間と計算リソースが必要となることを理解しておく必要があります。成功が保証されるものではありません。
パスフレーズを忘れないように、安全な場所に記録しておく、あるいは信頼できるパスワードマネージャーを使用することが、最も確実な対策と言えるでしょう。
この記事が、luks2john
と John the Ripper の使い方を理解する一助となれば幸いです。
参考情報
- John the Ripper official website: https://www.openwall.com/john/
- cryptsetup/LUKS documentation (Man page): Linuxシステムで
man cryptsetup
を実行 - Arch Wiki – dm-crypt/Device encryption: https://wiki.archlinux.org/title/Dm-crypt/Device_encryption