はじめに
この実験では、John the Ripper のルールエンジンの高度な機能について深く掘り下げていきます。John the Ripper は強力なパスワードクラッキングツールであり、そのルールエンジンは高度にカスタマイズされ効率的な攻撃を可能にします。効果的なルールを作成する方法を理解することは、その潜在能力を最大限に引き出すために不可欠です。この実験では、ルールの連鎖、Leet Speak のような一般的な変換のためのルールの作成、典型的なパスワードパターンのためのルールの開発、複雑なルールセットのテスト、およびルールパフォーマンスの最適化について学びます。この実験の終わりには、より洗練されたパスワードクラッキングシナリオのために John the Ripper のルールエンジンを活用する方法について、確かな理解を得ていることでしょう。
ルールチェーンの理解
このステップでは、John the Ripper におけるルールチェーンについて学びます。ルールチェーンを使用すると、複数のルールを組み合わせて、より複雑な変換を作成できます。これは、単語リストのエントリに一連の変更を適用する必要がある場合に特に役立ちます。
まず、John the Ripper がインストールされていることを確認します。インストールされていない場合は、apt を使用してインストールできます。
sudo apt update
sudo apt install -y john
次に、~/project ディレクトリに wordlist.txt という名前の簡単な単語リストファイルを作成します。
echo "password" > ~/project/wordlist.txt
echo "secret" >> ~/project/wordlist.txt
次に、~/project に chain_rules.rule という名前のルールファイルを作成し、基本的なルールチェーンを示します。このルールは、まず単語に "123" を追加し、次に最初の文字を大文字にします。
nano ~/project/chain_rules.rule
chain_rules.rule ファイルに以下の内容を追加します。
: A123 c
:(コロン) はルールの開始を示します。A123は単語の末尾に "123" を追加します。cは単語の最初の文字を大文字にします。
ファイルを保存するには、Ctrl+X、次に Y、次に Enter を押します。
次に、このルールファイルを使用して John the Ripper を実行します。パスワードを実際にクラックすることなく、変換された単語を確認するために --stdout オプションを使用します。
john --wordlist=~/project/wordlist.txt --rules=~/project/chain_rules.rule --stdout
以下のような出力が表示されるはずです。
Password123
Secret123
これは、ルールがどのようにチェーンされているかを示しています。まず A123 が適用され、次にその結果に c が適用されます。
Leet Speak 変換のためのルールの作成
このステップでは、Leet Speak 変換を実行するためのルールを作成します。Leet Speak(または「1337 Speak」)は、文字が似た数字や記号に置き換えられる一般的な慣習です(例:「a」は「4」、「e」は「3」、「s」は「5」)。これはパスワードでよく使用されるテクニックです。
~/project ディレクトリに leet_rules.rule という名前の新しいルールファイルを作成します。このファイルには、一般的な文字を Leet Speak の同等物に変換するためのルールが含まれます。
nano ~/project/leet_rules.rule
leet_rules.rule ファイルに以下の内容を追加します。
: s/a/4 s/e/3 s/i/1 s/o/0 s/s/5
s/old/newは置換ルールです。これはoldの最初の出現をnewに置き換えます。- 複数の置換ルールをチェーンして、いくつかの Leet Speak 変換を適用しています。
ファイルを保存するには、Ctrl+X、次に Y、次に Enter を押します。
次に、これらのルールを wordlist.txt でテストします。
john --wordlist=~/project/wordlist.txt --rules=~/project/leet_rules.rule --stdout
以下のような出力が表示されるはずです。
p4ssw0rd
s3cr3t
これは、一般的な Leet Speak のバリエーションを処理するためのルールを作成する方法を示しており、これらの置換を使用するユーザーに対するパスワードクラッキングの効率を大幅に向上させることができます。
一般的なパスワードパターンのためのルールの開発
このステップでは、年や一般的な数字の追加、または最初の文字の大文字化など、一般的なパスワードパターンを対象とするルールを開発します。これらのパターンは、ユーザーがパスワードの「強度」を真に高めることなく、パスワードを「より強く」するために頻繁に使用されます。
~/project ディレクトリに pattern_rules.rule という名前の新しいルールファイルを作成します。このファイルには、いくつかの一般的な変換が組み合わされます。
nano ~/project/pattern_rules.rule
pattern_rules.rule ファイルに以下の内容を追加します。
: c A2023
: c A!
: c A@
cは最初の文字を大文字にします。A2023は年「2023」を追加します。A!は感嘆符を追加します。A@はアットマークを追加します。
各行は個別のルールを表します。John the Ripper は、単語リスト内の各単語に各ルールを個別に適用します。
ファイルを保存するには、Ctrl+X、次に Y、次に Enter を押します。
次に、これらのルールを wordlist.txt でテストします。
john --wordlist=~/project/wordlist.txt --rules=~/project/pattern_rules.rule --stdout
以下のような出力が表示されるはずです。
Password2023
Secret2023
Password!
Secret!
Password@
Secret@
これは、一般的なパスワードパターンをカバーするルールのセットを作成する方法を示しており、単純な辞書単語を超えて攻撃対象領域を大幅に拡大できます。
複雑なルールセットのテスト
このステップでは、これまでに学んだ概念を組み合わせて、より複雑なルールセットをテストします。これには、Leet Speak 変換と一般的なパターンの追加の両方を含むルールファイルを作成し、複数のルールタイプを一緒に使用する方法を示します。
~/project ディレクトリに complex_rules.rule という名前の包括的なルールファイルを作成しましょう。このファイルには、Leet Speak の置換が含まれ、その後、一般的な数字または記号が追加されます。
nano ~/project/complex_rules.rule
complex_rules.rule ファイルに以下の内容を追加します。
: s/a/4 s/e/3 s/i/1 s/o/0 s/s/5 A123
: s/a/4 s/e/3 s/i/1 s/o/0 s/s/5 A!
- 最初のルールは Leet Speak を適用し、その後「123」を追加します。
- 2 番目のルールは Leet Speak を適用し、その後「!」を追加します。
ファイルを保存するには、Ctrl+X、次に Y、次に Enter を押します。
次に、これらの複雑なルールを wordlist.txt でテストします。
john --wordlist=~/project/wordlist.txt --rules=~/project/complex_rules.rule --stdout
以下のような出力が表示されるはずです。
p4ssw0rd123
s3cr3t123
p4ssw0rd!
s3cr3t!
これは、さまざまな種類のルールを組み合わせて幅広い潜在的なパスワード候補を生成する力のデモンストレーションであり、効果的なパスワードクラッキングに不可欠です。
ルールパフォーマンスの最適化
このステップでは、ルールパフォーマンスの最適化について学びます。複雑なルールは強力ですが、計算負荷が高くなる可能性もあります。John the Ripper は、主に操作の順序を理解し、冗長なルールを回避することによって、ルールの適用を最適化するメカニズムを提供します。
最適化の 1 つの方法は、ルールを可能な限り具体的にし、不要な候補の生成を避けることです。たとえば、パスワードが常に大文字で始まることがわかっている場合、すべての文字を大文字にするルールを適用するのは非効率的です。
前のステップの complex_rules.rule を検討してください。各ルールは、追加する前にすべての Leet Speak 置換を適用します。このようなルールが多数ある場合、置換を一度適用してから分岐する方が、置換を繰り返すよりも効率的である可能性があります。ただし、単純なケースでは、単一のルール内でチェーン化することが多くの場合十分に効率的です。
非常に大規模なルールセットや特定のシナリオでは、John the Ripper はより高度なルール構文と外部ルールファイルを許可します。この実験では、最適化の概念的な理解に焦点を当てます。
一般的な最適化手法は、1 つの巨大で包括的なルールセットではなく、単語リストをフィルタリングするか、個別の小さなルールセットで特定のパターンをターゲットにすることです。
l (length) ルールを使用して、単語が特定の長さより短い場合にのみ適用されるルールを作成することにより、単純な最適化の概念を実証しましょう。これにより、すでに一般的なパスワードには長すぎる単語に複雑なルールを適用するのを防ぐことができます。
~/project ディレクトリに optimized_rules.rule という名前の新しいルールファイルを作成します。
nano ~/project/optimized_rules.rule
optimized_rules.rule ファイルに以下の内容を追加します。
: l<10 s/e/3 A!
l<10は「単語の長さが 10 文字未満の場合にのみこのルールを適用する」という意味です。s/e/3は 'e' を '3' に置換します。A!は感嘆符を追加します。
ファイルを保存するには、Ctrl+X、次に Y、次に Enter を押します。
次に、このルールを wordlist.txt でテストします。
john --wordlist=~/project/wordlist.txt --rules=~/project/optimized_rules.rule --stdout
以下のような出力が表示されるはずです。
s3cr3t!
p4ssw0rd!
"password" (8 文字) と "secret" (6 文字) はどちらも 10 文字未満なので、ルールが適用されます。もし "superlongpassword" (17 文字) のような単語があった場合、このルールはそれに適用されないため、計算を節約できます。
長さなどの条件に基づいてルールを選択的に適用する方法を理解することは、生成される不要な候補の数を減らすことによって、クラッキング試行のパフォーマンスを大幅に向上させることができます。
まとめ
この実験では、John the Ripper の高度なルール作成に関する包括的な理解を得ました。まず、順次変換を可能にするルールチェーンを探索しました。次に、一般的な Leet Speak 変換のための特定のルールを作成する方法を学び、一般的なパスワードパターンをターゲットにするルールを開発しました。さらに、さまざまなルールタイプを組み合わせて複雑なルールセットをテストする練習をしました。最後に、不要な計算を減らすための条件付きルールの使用など、ルールパフォーマンスの最適化の概念を紹介しました。これらのスキルは、実際のパスワード監査およびクラッキングシナリオで John the Ripper を効果的に活用するための基本となります。


