はじめに
John the Ripper (JtR) は、強力で広く使用されているオープンソースのパスワードクラッキングツールです。非常に効果的ですが、特に初心者ユーザーは、進行を妨げる一般的な問題に遭遇することがあります。これらの問題は、難解なエラーメッセージからパフォーマンスの低下まで多岐にわたります。
この実験では、John the Ripper を使用する際に遭遇する最も一般的な問題のいくつかをトラブルシューティングする方法を学びます。「No hashes loaded」のようなエラー、無効なハッシュ形式の処理、パフォーマンスのボトルネックへの対処、破損したセッションファイルの処理、そして行き詰まったときにヘルプを見つける場所について説明します。この実験の終わりには、JtR の問題を効率的に診断し解決するための準備が整っているでしょう。
「No hashes loaded」エラーの解決
このステップでは、John the Ripper で最も一般的なエラーの 1 つである No password hashes loaded について調査します。このエラーは通常、2 つの主な理由で発生します。それは、John が提供されたファイル内のすべてのハッシュをすでにクラックしたか、またはファイルが John が理解できる形式ではない場合です。
まず、有効なハッシュファイルで John を実行してみましょう。セットアップスクリプトは、現在のディレクトリ (~/project) に shadow.txt という名前のファイルをすでに作成しており、このファイルには John が認識する形式のユーザーのパスワードハッシュが含まれています。
簡単な単語リストを使用して、それをクラックしてみましょう。
john --wordlist=pass.list shadow.txt
John が 1 つのハッシュをロードし、それをクラックしようとしていることを示す出力が表示されるはずです。パスワードはすぐに発見されるはずです。
Using default input encoding: UTF-8
Loaded 1 password hash (descrypt, traditional crypt(3) [DES 128/128 SSE2-16])
Cost 1 (algorithm [1:descrypt]...
Press 'q' or Ctrl-C to abort, almost any other key for status
password123 (dummyuser)
1g 0:00:00:00 DONE (2023-10-27 10:30) 100.0g/s 100.0p/s 100.0c/s 100.0C/s password123
Use the "--show" option to display all of the cracked passwords reliably
Session completed
パスワードがクラックされたので、John はそれを john.pot という名前のファイルに保存します。まったく同じコマンドをもう一度実行してみましょう。
john --wordlist=pass.list shadow.txt
今回は、エラーが表示されます。
Using default input encoding: UTF-8
No password hashes loaded (see FAQ)
これは、John が開始前に john.pot ファイルをチェックし、すでにクラックされたハッシュを無視するためです。確認するために john.pot ファイルの内容を表示できます。
cat ~/.john/john.pot
出力には、ハッシュとクラックされたパスワードが表示されます。
$1$notarealhash$b5gQ1P2kPiyP2t.OqI0kS1:password123
このエラーのもう 1 つの理由は、無効なファイル形式です。ハッシュが含まれていないファイルを作成してみましょう。
echo "this is just a text file" > plain.txt
次に、それに John を実行してみましょう。
john plain.txt
John は、パスワードハッシュのように見えるデータをファイルで見つけられなかったため、同じ「No password hashes loaded」エラーを表示します。ターゲットファイルにサポートされている形式のハッシュが含まれていることを常に確認してください。
「Invalid hash type」エラーのデバッグ
このステップでは、ハッシュタイプに関連する問題に対処します。John がハッシュタイプを自動検出できない場合や、ユーザーが --format フラグを使用して間違ったタイプを指定した場合、エラーが発生したり、クラッキングが失敗したりすることがあります。
まず、John が不正な形式のハッシュ文字列を含むファイルに遭遇した場合に何が起こるかを見てみましょう。この目的のために invalid_hashes.txt という名前のファイルを用意しました。
john invalid_hashes.txt
John はファイルを分析し、前のステップのエラーと同様に、有効なハッシュをロードできなかったと報告します。
Using default input encoding: UTF-8
No password hashes loaded (see FAQ)
次に、有効なハッシュを含むファイルを使用しますが、間違った形式を指定します。私たちのファイル hashes_md5.txt には標準の raw-MD5 ハッシュが含まれていますが、John にはそれが NT ハッシュであると伝えます。
john --wordlist=pass.list --format=nt hashes_md5.txt
ハッシュデータが指定された形式と一致しないため、John は警告またはエラーを生成します。
Warning: invalid ciphertext ignored: user1:5d41402abc4b2a76b9719d911017c592
No password hashes loaded (see FAQ)
これを修正するには、正しいハッシュ形式を指定する必要があります。形式が raw-MD5 であることがわかっている場合は、直接指定できます。これは、John に自動検出させるよりも高速な場合が多いです。
正しい形式でコマンドを実行してみましょう。
john --wordlist=pass.list --format=raw-md5 hashes_md5.txt
今回は、コマンドは成功し、パスワードをクラックします。
Using default input encoding: UTF-8
Loaded 1 password hash (raw-MD5 [MD5 128/128 SSE2-16])
Cost 1 (iteration count) is 1 for all loaded hashes
Press 'q' or Ctrl-C to abort, almost any other key for status
labex (user1)
1g 0:00:00:00 DONE (2023-10-27 10:35) 100.0g/s 1234Kp/s 1234Kc/s 1234KC/s 123..labex
Use the "--show" option to display all of the cracked passwords reliably
Session completed
ハッシュタイプが不明な場合は、--format フラグを省略して、John に自動検出を試させることができます。ただし、曖昧なハッシュや標準的でないハッシュの場合は、形式を指定することが成功を確実にする最善の方法です。
パフォーマンスのボトルネックへの対処
このステップでは、パフォーマンスの問題を特定し、対処する方法を探ります。パスワードクラッキングは非常にリソースを大量に消費するタスクであり、パフォーマンスが遅いと実用的でなくなります。
John the Ripper におけるパフォーマンスの主要な指標は、「candidates per second」(c/s)です。ベンチマークを実行して、さまざまなハッシュアルゴリズムでシステムがどの程度パフォーマンスを発揮するかを確認できます。
john --test
このコマンドは一連のベンチマークを実行します。さまざまなアルゴリズムの c/s レートに関する出力を確認してください。
Benchmarking: descrypt, traditional crypt(3) [DES 128/128 SSE2-16]... DONE
Many salts: 1234K c/s real, 1234K c/s virtual
Only one salt: 1111K c/s real, 1111K c/s virtual
... (他の多くのアルゴリズム) ...
Benchmarking: raw-MD5 [MD5 128/128 SSE2-16]... DONE
Raw: 45678K c/s real, 45678K c/s virtual
マルチコアシステムでパフォーマンスを向上させる最も効果的な方法の 1 つは、並列処理を使用することです。John は、--fork=N オプション(N は生成するプロセスの数)を使用してこれを実行できます。
これをテストする前に、john.pot ファイルをクリアして、ステップ 1 のハッシュを再クラックできるようにしましょう。
rm ~/.john/john.pot
次に、shadow.txt に対してシングルコアのクラッキングセッションを実行してみましょう。実行中に、任意のキー(Enter など)を押してステータスを表示します。c/s レートに注目してください。
john --wordlist=pass.list shadow.txt
しばらくしてから、Enter キーを押します。ステータス行が表示されます。次に Ctrl+C を押して停止します。
次に、2 つの並列プロセスで再度試してみましょう。
john --fork=2 --wordlist=pass.list shadow.txt
今回は、John は 2 つの CPU コアを使用してタスクに取り組みます。ステータスを確認すると、全体的な c/s レートは大幅に高くなり、シングルコアレートのほぼ 2 倍になるはずです。これにより、クラッキングセッションに必要な時間を劇的に短縮できます。
その他のパフォーマンスのヒントは次のとおりです。
- ターゲットを絞った単語リストの使用: 大規模で汎用的な単語リストよりも、小さくて関連性の高い単語リストの方が高速です。
- 形式の指定: ステップ 2 で見たように、
--formatを使用すると、自動検出のオーバーヘッドを回避できます。
セッションファイルの破損への対処
このステップでは、破損したセッションファイルを処理する方法を学びます。John the Ripper は、~/.john/ ディレクトリにあるセッションファイル(.rec 拡張子付き)に進行状況を自動的に保存します。これにより、長時間実行されるクラッキングセッションを一時停止して再開できます。ただし、このファイルが破損した場合、セッションを復元できなくなります。
新しいセッションを開始しましょう。セッション名を my_session とします。
john --session=my_session --wordlist=pass.list corrupt_me.txt
コマンドを数秒間実行させ、その後 Ctrl+C を押して正常に停止させます。John は進行状況を保存します。
Session aborted
作成されたセッションファイルを確認できます。
ls ~/.john/
john.log john.pot my_session.rec
次に、ゴミデータを追加してファイルを破損させてみましょう。
echo "THIS IS CORRUPTED DATA" >> ~/.john/my_session.rec
セッションファイルが破損した状態で、作業を再開してみましょう。
john --restore=my_session
John はリカバリファイルを解析できず、エラーメッセージとともに終了する可能性が高いです。正確なエラーは異なる場合がありますが、.rec ファイルの問題を示します。
Error in recovery file: ~/.john/my_session.rec
このような場合、唯一の解決策は破損したセッションファイルを削除することです。これは、その特定のセッションの進行状況を失い、最初からやり直す必要があることを意味します。ただし、既に正常にクラックされたパスワードは john.pot ファイルに安全に保存されています。
問題のあるファイルを削除しましょう。
rm ~/.john/my_session.rec
これで、セッションを最初から再度開始できます。これは、クラッキング試行中に予期しないクラッシュやシステムシャットダウンから回復するための重要なトラブルシューティング手順です。
John the Ripper コミュニティからのヘルプを求める
このステップでは、すべてを試しても行き詰まった場合にどうすればよいかを説明します。John the Ripper コミュニティは優れたリソースですが、効果的なヘルプを得るには、適切な情報を提供する必要があります。
コミュニティサポートの主な場所は、john-users メーリングリストです。投稿する前に、アーカイブを検索して、質問が既に回答されているかどうかを確認するのが良い習慣です。
ヘルプを求める必要がある場合は、明確で完全な情報を提供することが重要です。以下は、リクエストに常に含めるべきものです。
- John the Ripper のバージョン: バージョンごとに機能やバグが異なります。
- 正確なコマンド: John を実行するために使用した完全なコマンド。
- 完全な出力: エラーメッセージを含む、コマンドからのすべての出力。
- オペレーティングシステム: 使用している OS (例:Ubuntu 22.04, Windows 10)。
- ハッシュのサンプル: クラックしようとしているハッシュの例(機密情報でない場合)。
--version フラグを使用して、John the Ripper のバージョンを取得できます。今すぐ実行してみましょう。
john --version
出力は次のようになります。
John the Ripper 1.9.0-jumbo-1 [linux-gnu 64-bit x86_64 AVX2 AC]
これらの情報を収集する方法を知ることで、コミュニティメンバーが問題を理解し、役立つ解決策を提供することがはるかに容易になります。オープンソースコミュニティにヘルプを求める際は、丁寧で忍耐強くあることを忘れないでください。
まとめ
この実験では、John the Ripper の最も一般的な問題のいくつかを実際にトラブルシューティングする経験を積みました。
以下の方法を学びました。
No hashes loadedエラーの診断:john.potファイルで既にクラックされたパスワードを確認し、入力ファイルの形式を検証します。- ハッシュタイプの問題の解決:
--formatフラグを使用して正しいアルゴリズムを指定します。 - パフォーマンスのボトルネックへの対処:ベンチマークを実行し、並列処理のために
--forkオプションを使用します。 - クラッキングの失敗からの回復:破損したセッション(
.rec)ファイルを削除します。 - コミュニティから効果的にヘルプを求めるために必要な情報(JtR のバージョンやコマンド出力など)を収集します。
これらのスキルを習得したことで、John the Ripper をより効果的に使用し、問題が発生した際に解決できるようになりました。


