John the Ripper を使用した Linux シャドウパスワードのクラッキング

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

はじめに

この実験では、強力なツールである John the Ripper を使用して、Linux のパスワードハッシュを抽出、準備、クラックするプロセスを探求します。パスワードクラッキングの仕組みを理解することは、堅牢なセキュリティ対策を実装するために不可欠です。/etc/shadow ファイルについて、それを /etc/passwd と組み合わせてクラック可能なファイルを作成する方法、そして John the Ripper を使用して弱いパスワードを見つける方法を学びます。最後に、shadow ファイルの構造と、Linux システムでユーザーパスワードを保護するためのベストプラクティスについての洞察を得ます。

/etc/shadow ファイルの抽出

このステップでは、/etc/shadow ファイルの内容にアクセスして抽出する方法を学びます。/etc/shadow ファイルは、暗号化されたユーザーパスワードやその他のセキュリティ関連情報を格納しています。その機密性の高い性質上、root ユーザーのみがこのファイルへの読み取りアクセス権を持っています。この実験では、/etc/shadow への直接アクセスに root 権限を必要とせずに、実際のファイルをシミュレートするために、~/project ディレクトリにダミーの passwd_dummy および shadow_dummy ファイルを作成しました。

まず、ダミーの passwd_dummy ファイルの内容を表示しましょう。このファイルには基本的なユーザーアカウント情報が含まれていますが、パスワードハッシュは含まれていません。

cat ~/project/passwd_dummy

以下のような出力が表示されるはずです。

root:x:0:0:root:/root:/bin/bash
labex:x:1000:1000:LabEx User,,,:/home/labex:/bin/bash
testuser:x:1001:1001:Test User,,,:/home/labex/testuser:/bin/bash

次に、ダミーの shadow_dummy ファイルの内容を表示しましょう。このファイルには実際のパスワードハッシュが含まれています。

cat ~/project/shadow_dummy

以下のような出力が表示されるはずです。2 番目のフィールドがハッシュ化されたパスワードです。

root:$6$rounds=40000$abcdefghijklmnop$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./:18000:0:99999:7:::
labex:$6$rounds=40000$fedcba9876543210$ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./:18000:0:99999:7:::
testuser:$6$rounds=5000$testsalt$testpasswordhash:18000:0:99999:7:::

実際のシナリオでは、通常 sudo cat /etc/shadow を使用して shadow ファイルを抽出しますが、この実験ではダミーファイルを使用します。

パスワードファイルのアンシャドウ化

このステップでは、John the Ripper スイートの一部である unshadow ユーティリティを使用して、passwd_dummy ファイルと shadow_dummy ファイルを結合し、John the Ripper が処理できる単一のファイルを作成します。unshadow ツールは、パスワードファイルからのユーザー情報と shadow ファイルからのパスワードハッシュをマージし、クラッキングに適した統一された形式を作成します。

次のコマンドを実行して、passwd_dummyshadow_dummy を結合し、~/project ディレクトリに unshadowed.txt という名前の新しいファイルを作成します。

unshadow ~/project/passwd_dummy ~/project/shadow_dummy > ~/project/unshadowed.txt

次に、新しく作成された unshadowed.txt ファイルの内容を表示して、その形式を理解しましょう。

cat ~/project/unshadowed.txt

各行がユーザー名で始まり、その後にパスワードハッシュ、そしてその他のユーザー情報が続く出力が表示されるはずです。例:

root:$6$rounds=40000$abcdefghijklmnop$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./:0:0:root:/root:/bin/bash
labex:$6$rounds=40000$fedcba9876543210$ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./:1000:1000:LabEx User,,,:/home/labex:/bin/bash
testuser:$6$rounds=5000$testsalt$testpasswordhash:1001:1001:Test User,,,:/home/labex/testuser:/bin/bash

この unshadowed.txt ファイルは、パスワードクラッキングのために John the Ripper で使用する準備ができました。

John the Ripper によるシャドウハッシュのクラッキング

このステップでは、John the Ripper を使用して、unshadowed.txt ファイルに含まれるパスワードハッシュをクラッキングします。John the Ripper は、辞書攻撃(定義済みのリストから単語を試すこと)を含むさまざまな種類の攻撃を実行できます。セットアップ中に、~/project ディレクトリに wordlist.txt という名前の簡単な単語リストを既に作成しました。

wordlist.txt ファイルを使用してパスワードのクラッキングを開始するには、次のコマンドを実行します。

john --wordlist=~/project/wordlist.txt ~/project/unshadowed.txt

John the Ripper はハッシュのクラッキングを試みます。一致するものが見つかった場合、クラッキングされたパスワードが表示されます。ダミーファイルでは、testuserwordlist.txt に存在する弱いパスワードを持っています。

以下のような出力が表示され、パスワードがクラッキングされたことを示します。

Using default input encoding: UTF-8
Loaded 3 password hashes with no different salts to test (sha512crypt, crypt(3) $6$)
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
testpassword     (testuser)
3g 0:00:00:00 DONE (2024-01-01 12:00) 100.0% (ETA: 00:00:00) 3.000g/s 180.0p/s 180.0c/s 180.0C/s testpassword
Session completed.

クラッキング後、--show オプションを使用して、John the Ripper が見つけたクラッキングされたパスワードを表示できます。

john --show ~/project/unshadowed.txt

このコマンドは、セッションから正常にクラッキングされたすべてのパスワードを表示します。

testuser:testpassword

1 password hash cracked, 2 left

これにより、容易に入手可能なツールと単語リストを使用して、弱いパスワードがどれほど簡単にクラッキングされるかがわかります。

シャドウファイルのフォーマットを理解する

このステップでは、/etc/shadow ファイル内のフィールドの構造と意味について詳しく見ていきます。このフォーマットを理解することは、Linux がユーザーのパスワード情報をどのように安全に保存および管理しているかを理解するために不可欠です。

/etc/shadow ファイルは、ユーザーごとに 1 行を持ち、各行は 9 つのコロン区切りのフィールドで構成されています。shadow_dummy ファイルからの行を再確認してみましょう。

testuser:$6$rounds=5000$testsalt$testpasswordhash:18000:0:99999:7:::

各フィールドの内訳は以下の通りです。

  1. ユーザー名 (Username): testuser - ユーザーのログイン名です。
  2. 暗号化されたパスワード (Encrypted Password): $6$rounds=5000$testsalt$testpasswordhash - これは最も重要なフィールドです。ハッシュ化されたパスワードが含まれています。
    • $6 は使用されているハッシュ化アルゴリズム(この場合は SHA-512)を示します。その他の一般的なタイプには、$1 (MD5)、$2a (Blowfish)、$5 (SHA-256) などがあります。
    • rounds=5000 はハッシュ化のラウンド数を指定しており、クラッキングの計算コストを増加させます。
    • testsalt はソルト(salt)であり、レインボーテーブル攻撃を防ぐためにハッシュ化前にパスワードに追加されるランダムな文字列です。
    • testpasswordhash は実際のハッシュ化されたパスワードです。
  3. 最終パスワード変更日 (Last Password Change): 18000 - パスワードが最後に変更されてからの日数(1970 年 1 月 1 日からの経過日数)です。
  4. 最小パスワード年齢 (Minimum Password Age): 0 - パスワード変更間に必要な最小日数です。値が 0 の場合、ユーザーはいつでもパスワードを変更できます。
  5. 最大パスワード年齢 (Maximum Password Age): 99999 - パスワードが有効な最大日数です。この期間を過ぎると、ユーザーはパスワードを変更することを強制されます。99999 は通常、パスワードの有効期限がないことを意味します。
  6. パスワード警告期間 (Password Warning Period): 7 - パスワードの有効期限が切れる前にユーザーに警告が表示される日数です。
  7. パスワード非アクティブ期間 (Password Inactive Period): (空欄) - パスワードが期限切れになった後、アカウントが無効になるまでの日数です。空欄の場合、パスワードの非アクティブ化によってアカウントが無効になることはありません。
  8. アカウント有効期限 (Account Expiration Date): (空欄) - アカウントが無効になる日付(1970 年 1 月 1 日からの経過日数)です。空欄の場合、アカウントの有効期限はありません。
  9. 予約フィールド (Reserved Field): (空欄) - このフィールドは将来の使用のために予約されています。

これらのフィールドを理解することは、パスワードポリシーの設定やシステムセキュリティの強化に役立ちます。

シャドウファイルのセキュリティに関するベストプラクティスの実装

このステップでは、Linux システムにおける /etc/shadow ファイルとユーザーパスワードを保護するためのベストプラクティスについて学び、理解します。シャドウファイルは機密性が高いため、その保護はシステムセキュリティにとって最重要です。

以下に、主要なベストプラクティスをいくつか示します。

  1. 強力なパスワードポリシー:

    • 複雑性: 強力なパスワードの複雑性要件(例:最小長、大文字、小文字、数字、特殊文字の組み合わせ)を強制します。
    • 一意性: ユーザーが古いパスワードを再利用できないようにします。
    • 定期的な変更: 定期的なパスワード変更のポリシーを実装しますが、現代のセキュリティアドバイスでは、特権のないアカウントに対しては、頻繁な変更よりも長く強力で一意なパスワードの使用が推奨される場合もあります。
    • パスフレーズ: 短く複雑なパスワードの代わりに、覚えやすくクラッキングされにくい長いパスフレーズの使用を奨励します。
  2. ファイルパーミッション:

    • /etc/shadow ファイルは非常に厳格なパーミッションである 0640 (-rw-r-----) であるべきです。これは、root のみが読み書きでき、shadow グループのメンバーが読み取れることを意味します。他のユーザーはアクセスできないようにします。
    • パーミッションは ls -l /etc/shadow を使用して確認します(実際のシステムで、ダミーファイルではありません)。
  3. ハッシュ化アルゴリズム:

    • 常に SHA-512 ($6) や Blowfish ($2a$2b$2y) のような最新の強力なハッシュ化アルゴリズムを使用します。MD5 ($1) や DES のような古い弱いアルゴリズムは避けてください。
    • システムの PAM (Pluggable Authentication Modules) 設定が、強力なハッシュ化アルゴリズムを使用するように構成されていることを確認します。
  4. ソルト (Salting):

    • 常に各パスワードに一意のソルトを使用します。これは現代のハッシュ化アルゴリズムによって自動的に処理され、レインボーテーブル攻撃を防ぎます。
  5. アカウントロックアウトポリシー:

    • ブルートフォース攻撃を防ぐために、アカウントロックアウトポリシーを実装します。一定回数ログインに失敗した後、アカウントは一時的にロックされるべきです。
  6. 不審なアクティビティの監視:

    • 異常なログイン試行や /etc/shadow ファイルへの変更がないか、システムログを定期的に監視します。AIDETripwire のようなツールは、ファイルの整合性の変更を検出できます。
  7. ユーザー教育:

    • ユーザーに、強力で一意なパスワードの重要性、およびフィッシングやソーシャルエンジニアリングのリスクについて教育します。

これらのベストプラクティスを実装することで、ユーザーアカウントのセキュリティを大幅に強化し、Linux システム上の機密性の高いパスワード情報を保護することができます。

まとめ

この実験では、John the Ripper を使用した Linux システムでのパスワードクラッキングのプロセスについて実践的な経験を積みました。unshadow を使用して /etc/passwd ファイルと /etc/shadow ファイルを抽出し結合する方法を学び、その後、単語リストとともに John the Ripper を使用して弱いパスワードハッシュをクラックしました。さらに、/etc/shadow ファイルの詳細なフォーマットを探求し、特にハッシュ化アルゴリズムとソルトの各フィールドの重要性を理解しました。最後に、強力なパスワードポリシー、適切なファイルパーミッション、堅牢なハッシュ化アルゴリズムの使用を含む、ユーザーパスワードとシャドウファイルを保護するための不可欠なベストプラクティスを確認しました。この知識は、攻撃的なセキュリティ(システムがどのように侵害されるかを理解する)と防御的なセキュリティ(そのような攻撃から保護するための対策を実装する)の両方にとって非常に重要です。