単語リストにルールを適用して高度なクラッキングを行う

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

はじめに

この実験 (Lab) では、John the Ripper (JtR) の強力なルールベースのクラッキング機能を探求します。単純な辞書攻撃も効果的ですが、実際のパスワードには大文字小文字の使い分け、末尾の数字、特殊文字などのバリエーションが含まれることがよくあります。JtR のルールエンジンを使用すると、単語リスト内の単語に適用する複雑な変換を定義でき、辞書に直接存在しないパスワードをクラックできる可能性が大幅に高まります。JtR ルールの基本的な構文を学び、独自のカスタムルールを作成し、単語リストに適用してその効果を確認します。

John the Ripper ルール構文の理解

このステップでは、John the Ripper (JtR) のルールの基本的な構文を学びます。JtR のルールは、通常 john.conf という設定ファイルで定義されるか、簡単なケースではコマンドラインから直接渡すことができます。各ルールは、単語を変更する単一文字コマンドのシーケンスです。

一般的なルールコマンドには以下のようなものがあります。

  • c: 最初の文字を大文字にします。
  • C: 全ての文字を大文字にします。
  • l: 最初の文字を小文字にします。
  • L: 全ての文字を小文字にします。
  • t: 最初の文字の大文字/小文字を切り替えます。
  • T: 全ての文字の大文字/小文字を切り替えます。
  • p<N>: 文字 <N> を先頭に追加します。
  • a<N>: 文字 <N> を末尾に追加します。
  • s<old><new>: <old> の最初の出現箇所を <new> に置換します。
  • S<old><new>: <old> の全ての出現箇所を <new> に置換します。
  • x<N>: 先頭から長さ N の部分文字列を抽出します。
  • z<N>: 末尾から長さ N の部分文字列を抽出します。
  • D: 最初の文字を削除します。
  • M: 最後の文字を削除します。
  • r: 単語を反転させます。

まず、デフォルトの john.conf ファイルを表示して、組み込みルールの例を見てみましょう。

nano を使用して john.conf ファイルを開きます。

nano /etc/john/john.conf

ファイル内をスクロールして [List.Rules:Wordlist] セクションを見つけます。そこに定義されている様々なルールセットが表示されます。例えば、c (最初の文字を大文字にする) や a[0-9] (数字を末尾に追加する) のようなルールが見られるでしょう。

Ctrl+X を押して nano を終了します。

次に、JtR の --stdout オプションを使用して、簡単なルールをコマンドラインから直接試してみましょう。このオプションは、単語リストにルールを適用し、ハッシュのクラッキングを試みずに結果を標準出力に表示します。これはルールのテストに便利です。

以下のコマンドを実行して、wordlist.txtc (最初の文字を大文字にする) ルールを適用します。

john --wordlist=~/project/wordlist.txt --rules=single --stdout

wordlist.txt の単語の最初の文字が大文字になったものが表示されるはずです。例えば、"password" は "Password" になります。

Password
Secret
Labex
Test

これは、単純なルールが単語をどのように変換できるかを示しています。次のステップでは、より複雑なルールを作成し、組み合わせます。

大文字化のためのシンプルなルールの作成

このステップでは、大文字化ルールを適用するためのカスタムルールファイルを作成します。JtR の single ルールセットには基本的な大文字化が含まれていますが、独自のルールファイルを作成することで、より詳細な制御が可能になり、より具体的な変換を行えるようになります。

まず、~/project ディレクトリに my_rules.rule という名前の新しいファイルを作成します。このファイルにカスタムルールを記述します。

nano ~/project/my_rules.rule

my_rules.rule ファイルに以下の行を追加します。これらのルールは以下の処理を行います。

  • c: 最初の文字を大文字にします。
  • C: 全ての文字を大文字にします。
  • t: 最初の文字の大文字/小文字を切り替えます(例:「password」→「Password」、「Password」→「password」)。
c
C
t

Ctrl+O を押してファイル名を指定し Enter を押して保存し、Ctrl+X を押して nano を終了します。

次に、--rules オプションを使用して、新しいルールファイルを指定してこれらのカスタムルールを wordlist.txt に適用します。

john --wordlist=~/project/wordlist.txt --rules=file:~/project/my_rules.rule --stdout

出力を確認してください。wordlist.txt の各単語が、定義した各ルールによって変換されているのが見えるはずです。例えば、「password」は「Password」、「PASSWORD」、「Password」(元の「password」に t ルールが適用されたため)として表示されます。

Password
SECRET
LABEX
TEST
password
PASSWORD
secret
SECRET
labex
LABEX
test
TEST
Password
Secret
Labex
Test

これは、カスタムルールファイルを定義して使用する方法を示しています。ファイル内の各ルールは、単語リスト内のすべての単語に順番に適用されます。

数字追加のためのルールの適用

このステップでは、JtR ルールを使用して単語に数字を付加する方法を学びます。数字の追加は非常に一般的なパスワードのバリエーションであり、JtR はこれらのバリエーションを効率的に生成するための強力なコマンドを提供しています。

a<N> コマンドは文字 <N> を追加します。数字を追加するには、a[0-9] のような文字範囲を使用して、0 から 9 までの単一の数字を追加できます。これを他のルールと組み合わせることも可能です。

my_rules.rule に数字を追加するルールを追加しましょう。ルールファイルを再度開きます。

nano ~/project/my_rules.rule

ファイルの末尾に以下の行を追加します。これらのルールは以下の処理を行います。

  • a[0-9]: 単語に単一の数字 (0-9) を追加します。
  • a[0-9][0-9]: 単語に 2 つの数字 (00-99) を追加します。このルールは、各単語に対して 100 のバリエーションを生成します。
a[0-9]
a[0-9][0-9]

ファイルを保存 (Ctrl+OEnter) し、nano を終了 (Ctrl+X) します。

次に、これらの更新されたルールを wordlist.txt に適用します。a[0-9][0-9] は多くのバリエーションを生成するため、デモンストレーション目的で head を使用して出力を制限します。

john --wordlist=~/project/wordlist.txt --rules=file:~/project/my_rules.rule --stdout | head -n 50

「password0」、「password1」、「...」、「password00」、「password01」などの単語が表示されるはずです。head -n 50 コマンドは、完全な出力は非常に長くなるため、最初の 50 行に制限します。

Password
SECRET
LABEX
TEST
password
PASSWORD
secret
SECRET
labex
LABEX
test
TEST
Password
Secret
Labex
Test
password0
password1
password2
password3
password4
password5
password6
password7
password8
password9
secret0
secret1
secret2
secret3
secret4
secret5
secret6
secret7
secret8
secret9
labex0
labex1
labex2
labex3
labex4
labex5
labex6
labex7
labex8
labex9
test0
test1
test2
test3
test4
test5

これは、一般的なパスワードパターンをクラックする上で重要な、数字が付加されたバリエーションを効果的に生成する方法を示しています。

複数のルールを組み合わせて複雑な変換を行う

このステップでは、複数のルールコマンドを組み合わせて、より複雑なパスワード変換を作成します。JtR では、単一行でルールコマンドをチェーン化し、各単語に順番に適用することができます。

最初の文字を大文字化し、その後で単一の数字を付加するルールを作成しましょう。

my_rules.rule ファイルを再度開きます。

nano ~/project/my_rules.rule

ファイルの末尾に以下のルールを追加します。このルール ca[0-9] は以下の意味を持ちます。

  1. c: 最初の文字を大文字にします。
  2. a[0-9]: 単一の数字 (0-9) を追加します。
ca[0-9]

ファイルを保存 (Ctrl+OEnter) し、nano を終了 (Ctrl+X) します。

次に、これらの更新されたルールを wordlist.txt に適用し、出力を確認します。ここでも、出力を制限するために head を使用します。

john --wordlist=~/project/wordlist.txt --rules=file:~/project/my_rules.rule --stdout | head -n 50

「Password0」、「Password1」、「Secret0」、「Secret1」などのバリエーションが表示されるはずです。

Password
SECRET
LABEX
TEST
password
PASSWORD
secret
SECRET
labex
LABEX
test
TEST
Password
Secret
Labex
Test
password0
password1
password2
password3
password4
password5
password6
password7
password8
password9
secret0
secret1
secret2
secret3
secret4
secret5
secret6
secret7
secret8
secret9
labex0
labex1
labex2
labex3
labex4
labex5
labex6
labexex7
labex8
labex9
test0
test1
test2
test3
test4
test5
Password0
Password1
Password2
Password3
Password4
Password5
Password6
Password7
Password8
Password9

これはルールの組み合わせの強力さを示しています。コマンドをチェーン化することで、非常に具体的で効果的なルールセットを作成できます。例えば、s@a!ca[0-9] は '@' を '!' に置換し、最初の文字を大文字化してから数字を付加します。

単語リストでカスタムルールをテストする

この最終ステップでは、カスタムルールを使用してダミーハッシュをクラックしようと試みます。これは、実際のパスワードクラッキングシナリオをシミュレートします。

セットアップで、「password」という単語のハッシュが作成され、~/project/hashes.txt に保存されたことを思い出してください。ハッシュは user1:5f4dcc3b5aa765d61d8327deb882cf99 (「password」の MD5 ハッシュ) です。

まず、my_rules.rule ファイルに、「password」またはそれに一致するバリエーションを生成するルールが含まれていることを確認します。この例では、ハッシュが元の「password」単語のものであると仮定します。もし「Password0」のハッシュがあった場合、ca[0-9] ルールが役立つでしょう。

このデモンストレーションでは、元の wordlist.txtmy_rules.rule を使用してハッシュをクラックしようと試みます。

ハッシュファイル、単語リスト、カスタムルールを指定して John the Ripper を実行します。

john ~/project/hashes.txt --wordlist=~/project/wordlist.txt --rules=file:~/project/my_rules.rule

John the Ripper は単語リストの処理を開始し、ルールを適用し、生成された単語をハッシュと比較します。一致が見つかった場合、クラックされたパスワードが表示されます。

パスワードがクラックされたことを示す、以下のような出力が表示されるはずです。

Using default input encoding: UTF-8
Loaded 1 password hash (md5crypt, crypt(3) $1$ [MD5 SSSP])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password         (user1)
1g 0:00:00:00 DONE (2023-10-27 10:30) 100% (ETA: 00:00:00)
Session completed.

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

john --show ~/project/hashes.txt

このコマンドは、JtR が正常にクラックし、その pot ファイルに保存したパスワードを表示します。

user1:password

1 password hash cracked, 0 left

この最終ステップは、パスワードクラッキングにおけるカスタムルールの実践的な応用を示しています。インテリジェントにルールを作成することで、さまざまなパスワードパターンに対する辞書攻撃の効果を大幅に向上させることができます。

まとめ

この実験では、John the Ripper の強力なルールエンジンを活用して高度なパスワードクラッキングを行う方法を習得しました。JtR ルールの基本的な構文、大文字化や大文字・小文字の切り替えコマンドなどを理解することから始めました。次に、独自のカスタムルールファイルを作成し、一般的なパスワードのバリエーションである数字の追加ルールを追加しました。最後に、複数のルールコマンドを組み合わせてより複雑な変換を作成し、カスタムルールをダミーハッシュに適用して、実際のシナリオをシミュレートしました。この実践的な経験により、洗練されたルールセットを定義および適用する知識が身につき、標準的な単語リストに直接存在しないパスワードをクラックする能力が大幅に向上しました。