John the Ripper 辞書攻撃の理解

Kali LinuxBeginner
オンラインで実践に進む

はじめに

この実験では、強力なパスワードクラッキングツールである John the Ripper を使用した辞書攻撃に関する実践的な理解を深めます。効果的な辞書の選択と組み合わせ方法、この攻撃手法に内在する限界、そしてクラッキング能力を向上させるためのカスタム辞書の生成方法についても学びます。この実験の終わりには、辞書攻撃の成功率を分析し、サイバーセキュリティにおけるその役割を理解できるようになります。

適切な辞書の選択

このステップでは、John the Ripper の辞書攻撃に適した辞書ファイルを選択して使用する方法を学びます。辞書攻撃は、事前に定義されたリスト(辞書)内の単語をすべて試すことでパスワードをクラックしようとします。この攻撃の有効性は、使用される辞書の品質と関連性に大きく依存します。

まず、John the Ripper がインストールされており、ダミーパスワードファイル passwords.txt および辞書ファイル rockyou.txt~/project ディレクトリに存在することを確認しましょう。

john --version
ls -l ~/project/passwords.txt ~/project/rockyou.txt

以下のような出力が表示され、ファイルの存在が確認できるはずです。

John the Ripper password cracker, version 1.9.0-jumbo-1 ...
-rw-r--r-- 1 labex labex XX Mar XX:XX /home/labex/project/passwords.txt
-rw-r--r-- 1 labex labex XX Mar XX:XX /home/labex/project/rockyou.txt

次に、passwords.txt ファイルに対して rockyou.txt 辞書を使用した基本的な辞書攻撃を実行しましょう。--wordlist オプションは、使用する辞書ファイルを指定します。

john --wordlist=/home/labex/project/rockyou.txt /home/labex/project/passwords.txt

John the Ripper がパスワードのクラッキングを試みます。成功した場合、クラックされたパスワードが表示されます。以下のような出力が表示される場合があります。

Using default input encoding: UTF-8
Loaded 4 password hashes with no different salts (MD5 [MD5])
Will run till all hashes are cracked, or till a key is found for each (whichever comes first)
Press 'q' or Ctrl-C to abort, almost any other key for status
password         (user1)
admin            (user2)
123456           (user3)
labex            (user4)
4g 0:00:00:00 DONE (2023-03-15 10:30) 100.0% (ETA: 2023-03-15 10:30) 4g/s 16.0p/s 16.0c/s 16.0C/s password...labex
Session completed.

いつでもクラックされたパスワードを表示するには、--show オプションを使用できます。

john --show /home/labex/project/passwords.txt

このコマンドは、クラックされたパスワードと対応するユーザー名を表示します。

user1:password (user1)
user2:admin (user2)
user3:123456 (user3)
user4:labex (user4)

4 password hashes cracked, 0 left

これにより、基本的な攻撃のための辞書の選択と使用方法が示されました。rockyou.txt ファイルは、よく使われるパスワードを含む辞書の一般的な例です。

複数の辞書を組み合わせて包括的な攻撃を行う

このステップでは、複数の辞書を組み合わせて、John the Ripper 用のより包括的な単語リストを作成する方法を学びます。辞書を組み合わせることで、特にターゲットのパスワードが単一の辞書に見つからない場合に、パスワードをクラックする可能性を大幅に高めることができます。

まず、~/project ディレクトリに common_words.txt という名前の別の小さな辞書ファイルを作成しましょう。

echo "welcome" > ~/project/common_words.txt
echo "security" >> ~/project/common_words.txt
echo "network" >> ~/project/common_words.txt

次に、rockyou.txtcommon_words.txt を組み合わせて、combined_dictionary.txt という新しいファイルを作成します。cat コマンドを使用してファイルを連結し、その後 sortuniq を使用して重複を削除できます。

cat ~/project/rockyou.txt ~/project/common_words.txt | sort | uniq > ~/project/combined_dictionary.txt

新しい combined_dictionary.txt の内容を確認して、両方の元の辞書からの単語が含まれており、重複がないことを確認しましょう。

cat ~/project/combined_dictionary.txt

rockyou.txtcommon_words.txt の両方からのソートされたユニークな単語のリストが表示されるはずです。

123456
admin
labex
network
password
secret
security
test
welcome

それでは、この combined_dictionary.txt を使用して辞書攻撃を実行しましょう。このデモンストレーションのために、まず John の以前のクラッキングセッションをクリアして、最初からやり直せるようにします。

john --session=clear

次に、結合された辞書を使用して攻撃を実行します。

john --wordlist=/home/labex/project/combined_dictionary.txt /home/labex/project/passwords.txt

John the Ripper は、拡張された単語リストを使用してパスワードをクラックしようとします。common_words.txt に含まれるパスワードが passwords.txt に追加されていた場合、それらは現在クラックされているでしょう。私たちの passwords.txt には rockyou.txt のパスワードのみが含まれているため、出力は前のステップと同様になりますが、結合された辞書を使用するプロセスを示しています。

Using default input encoding: UTF-8
Loaded 4 password hashes with no different salts (MD5 [MD5])
Will run till all hashes are cracked, or till a key is found for each (whichever comes first)
Press 'q' or Ctrl-C to abort, almost any other key for status
password         (user1)
admin            (user2)
123456           (user3)
labex            (user4)
4g 0:00:00:00 DONE (2023-03-15 10:35) 100.0% (ETA: 2023-03-15 10:35) 4g/s 16.0p/s 16.0c/s 16.0C/s password...labex
Session completed.

このプロセスは、効果的なパスワードクラッキングのために、多様で包括的な辞書を持つことの重要性を強調しています。

辞書攻撃の限界を理解する

このステップでは、辞書攻撃の限界について探求します。辞書攻撃は強力ですが、辞書内に存在するパスワードに対してのみ有効です。単語リストに含まれていない、複雑でユニークな、またはランダムに生成されたパスワードに対しては効果がありません。

この限界を実証するために、passwords.txt ファイルに強力でランダムなパスワードを持つ新しいユーザーを追加しましょう。標準的な辞書には見つかる可能性が非常に低いパスワードを使用します。例えば、P@ssw0rd!23AbC です。このパスワードの MD5 ハッシュを生成します。

echo "user5:$(echo -n 'P@ssw0rd!23AbC' | md5sum | awk '{print $1}')" >> /home/labex/project/passwords.txt

次に、John の以前のセッションをクリアし、combined_dictionary.txt を使用して再度パスワードのクラッキングを試みましょう。

john --session=clear
john --wordlist=/home/labex/project/combined_dictionary.txt /home/labex/project/passwords.txt

出力を観察してください。John the Ripper は、おそらく最初の 4 つのパスワード(user1、user2、user3、user4)をクラックしますが、user5 のパスワードは、P@ssw0rd!23AbC が辞書に含まれていないため、クラックに失敗します。

Using default input encoding: UTF-8
Loaded 5 password hashes with no different salts (MD5 [MD5])
Will run till all hashes are cracked, or till a key is found for each (whichever comes first)
Press 'q' or Ctrl-C to abort, almost any other key for status
password         (user1)
admin            (user2)
123456           (user3)
labex            (user4)
4g 0:00:00:00 DONE (2023-03-15 10:40) 80.0% (ETA: 2023-03-15 10:40) 4g/s 16.0p/s 16.0c/s 16.0C/s password...labex
Session completed.

確認するために、--show オプションを使用します。

john --show /home/labex/project/passwords.txt

user5 のパスワードがクラックされていないことがわかります。

user1:password (user1)
user2:admin (user2)
user3:123456 (user3)
user4:labex (user4)

4 password hashes cracked, 1 left

これにより、辞書攻撃は辞書の内容によって制限されることが示されました。辞書に含まれていないパスワード、特に強力でユニークなパスワードは、この方法ではクラックされません。これは、強力で予測不可能なパスワードを使用することの重要性を強調しています。

カスタム辞書の生成を実装する

このステップでは、カスタム辞書を生成する方法を学びます。rockyou.txt のような大規模な既製辞書は便利ですが、特定のターゲットやシナリオに合わせて調整された辞書を作成する必要がある場合もあります。これには、ターゲットに関する既知の情報(例:会社名、一般的なフレーズ、日付)を使用して、可能性のあるパスワードを生成することが含まれます。

ここでは、指定された文字セットとパターンに基づいて単語リストを生成するのに優れたツールである crunch を使用します。crunch はデフォルトではインストールされていないため、まずインストールしましょう。

sudo apt install -y crunch

次に、簡単なカスタム辞書を生成しましょう。例えば、特定の長さの小文字のすべての可能な組み合わせを生成できます。ここでは、すべての 4 文字の小文字の単語の辞書を作成します。

crunch 4 4 -o ~/project/custom_4char_dictionary.txt -t @@@@
  • 4 4: 生成する単語の最小長と最大長を指定します(ここでは両方とも 4)。
  • -o ~/project/custom_4char_dictionary.txt: 出力ファイルを指定します。
  • -t @@@@: パターンを指定します。@ は小文字を表します。

このコマンドは大きなファイルを生成します。デモンストレーションのために、より小さく管理しやすいカスタム辞書を生成しましょう。ここでは、長さ 3 から 4 の単語を、小文字のみを使用し、「a」で始まるものを生成します。

crunch 3 4 abcdefghijklmnopqrstuvwxyz -o ~/project/custom_small_dictionary.txt -t a%@
  • 3 4: 最小長 3、最大長 4。
  • abcdefghijklmnopqrstuvwxyz: 使用する文字セットを指定します。
  • -o ~/project/custom_small_dictionary.txt: 出力ファイル。
  • -t a%@: パターン。a はリテラルの 'a'、% は数字、@ は小文字を表します。小文字のみを生成するように修正しましょう。

カスタム辞書として、より関連性の高い例を試してみましょう。「labex」のような既知の単語に数字を付加したバリエーションを生成します。ここでは、一般的なパスワードのバリエーションに非常に実用的な、john の組み込み単語リストルールを使用します。

まず、「labex」のみを含むベース単語リストを作成します。

echo "labex" > ~/project/base_word.txt

次に、John の --rules オプションと一般的なルールセット(例:Wordlist)を使用してバリエーションを生成します。これは、ベース単語リストと組み合わせてよく使用されます。

john --wordlist=/home/labex/project/base_word.txt --rules=Wordlist --stdout > ~/project/labex_variations.txt
  • --wordlist: ベース単語リスト。
  • --rules=Wordlist: デフォルトの単語リストルール(例:数字の追加、大文字小文字の変更など)を適用します。
  • --stdout: 生成された単語を標準出力に出力します。
  • > ~/project/labex_variations.txt: 出力をファイルにリダイレクトします。

生成されたバリエーションを確認しましょう。

head -n 10 ~/project/labex_variations.txt

labex1Labexlabex! などのバリエーションが表示されるはずです。

labex
Labex
LABEX
labex1
labex2
labex3
labex4
labex5
labex6
labex7

これにより、ターゲットに関する特定のパターンや既知の情報が利用可能な場合に重要な、カスタム辞書または単語のバリエーションを生成する方法が示されました。

辞書攻撃の成功率を分析する

このステップでは、使用する辞書とターゲットパスワードの複雑さに基づいて、辞書攻撃の成功率を分析します。成功率を理解することは、クラッキングの取り組みの有効性とシステムのセキュリティ体制を評価するのに役立ちます。

単純な辞書単語は簡単にクラックされるのに対し、複雑なパスワードはそうではないことをすでに確認しました。これを定量化するために、クラックされたパスワードの数とハッシュの総数を比較してみましょう。

まず、John のセッションがクリアされていることを確認します。

john --session=clear

次に、passwords.txt(現在は強力なパスワードを持つ user5 が含まれています)に対して、combined_dictionary.txt を使用して再度攻撃を実行しましょう。

john --wordlist=/home/labex/project/combined_dictionary.txt /home/labex/project/passwords.txt

攻撃が完了したら、--show オプションを使用して結果を表示します。

john --show /home/labex/project/passwords.txt

出力には、クラックされたパスワードと、クラックされたハッシュの数と総数が表示されます。

user1:password (user1)
user2:admin (user2)
user3:123456 (user3)
user4:labex (user4)

4 password hashes cracked, 1 left

この出力から、成功率を計算できます。(クラックされたハッシュの数 / ハッシュの総数) _ 100%。 この場合、(4 / 5) _ 100% = 80% です。

この 80% の成功率は、多くの一般的なパスワードがクラックされた一方で、user5 の強力なパスワードはこの辞書攻撃に対して安全であったことを示しています。これは、辞書攻撃が弱い、一般的、または辞書ベースのパスワードに対しては非常に効果的ですが、強力でユニークなパスワードに対しては失敗することを示しています。

さらに分析するために、異なる辞書(例:非常に小さい特定の辞書と非常に大きい一般的な辞書)で実験し、成功率がどのように変化するかを観察することができます。辞書が大きく、より関連性が高いほど、一般的なパスワードに対する潜在的な成功率は高くなります。しかし、真にランダムで複雑なパスワードに対しては、辞書攻撃の成功率は常に低くなるため、他のクラッキング手法(ブルートフォースなど)や、さらに重要なこととして、強力なパスワードポリシーの必要性が強調されます。

この分析は、そのような攻撃から保護するために、推測されにくく、一般的な辞書に見つからない、強力でユニークなパスワードを使用することの重要性を裏付けています。

まとめ

この実験では、John the Ripper と辞書攻撃について実践的な経験を積みました。クラッキングの取り組みを強化するために、辞書の選択と組み合わせ方を学びました。また、辞書攻撃の固有の限界、特に強力でユニークなパスワードに対する限界についても理解しました。さらに、カスタム辞書の生成方法を探求し、これらの攻撃の成功率を分析しました。この実験により、基本的なパスワードクラッキング技術に関する実践的な洞察が得られ、堅牢なパスワードセキュリティの実践の重要性が再確認されました。