Linux シャドウファイルからのハッシュ抽出とクラッキング

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

はじめに

この実験 (lab) では、Linux のパスワードセキュリティ監査の基本的なプロセスを学びます。Linux がユーザーのパスワード情報をどのように保存しているかを調査し、その情報を抽出し、辞書攻撃を使用してパスワードをクラックすることを試みます。このプロセスは、ペネトレーションテスターやシステム管理者がシステム内の弱いパスワードを特定し、修正するために不可欠です。

ユーザーアカウント情報を保存する /etc/passwd ファイルと、ハッシュ化されたパスワードを安全に保存する /etc/shadow ファイルという、2 つの重要なファイルを使用します。クラッキングプロセスを実行するために、標準的な Linux コマンドラインツールと、unshadow (John the Ripper スイートの一部) や Hashcat のような専門ソフトウェアを使用します。

この実験の終わりまでに、以下の項目について実践的な経験を積むことができます。

  • /etc/shadow ファイルのフォーマットを理解する。
  • ユーザーデータとパスワードデータをクラック可能なフォーマットに結合する。
  • パスワードハッシュの種類を特定する。
  • Hashcat を使用して辞書攻撃を実行する。

/etc/shadow ファイルのフォーマットを理解する

このステップでは、/etc/shadow ファイルを調べます。このファイルには、Linux システム上のユーザーの実際のパスワードハッシュが保存されており、セキュリティ上の理由から root ユーザーのみが読み取ることができます。その構造を理解することが、ハッシュを抽出する最初のステップです。

まず、/etc/shadow ファイルの内容を表示するために必要な権限を取得するために sudo を使用します。

sudo cat /etc/shadow

いくつかの行を含む出力が表示され、各行はユーザーアカウントに対応しています。作成した testuser のエントリを見てみましょう。以下のような形式になります(ソルトとハッシュは異なります)。

root:*:19327:0:99999:7:::
daemon:*:19327:0:99999:7:::
...
testuser:$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn2KkL.D.v5/T6.zT.jC.gB6aB4bY3eZ2aX9cW8dY7eF6gH5iJ4kL3oP2qR1:19422:0:99999:7:::

各行は、コロンで区切られた一連のフィールドです。この実験では、最初の 2 つのフィールドに注目します。

  1. ユーザー名: testuser
  2. ハッシュ化されたパスワード: $6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn2KkL.D.v5/T6.zT.jC.gB6aB4bY3eZ2aX9cW8dY7eF6gH5iJ4kL3oP2qR1

ハッシュフィールドのドル記号 ($) は重要です。最初の 2 つの $ 文字の間の数字は、ハッシュ化アルゴリズムを示します。この場合、$6$ はパスワードが sha512crypt アルゴリズムを使用してハッシュ化されたことを意味します。

unshadow ツールを使用して passwd と shadow ファイルを結合する

このステップでは、unshadow ユーティリティを使用して、Hashcat のようなパスワードクラッキングツールに適した単一のファイルを作成します。クラッキングツールは、/etc/passwd からのユーザー名と /etc/shadow からのハッシュの両方を特定のフォーマットで必要とします。unshadow ツールは、John the Ripper スイートの一部であり、この結合プロセスを自動化します。

次に、unshadow を実行し、/etc/passwd/etc/shadow を入力として提供し、出力を ~/project ディレクトリ内の hashes.txt という新しいファイルにリダイレクトします。

ターミナルで以下のコマンドを実行してください。

sudo unshadow /etc/passwd /etc/shadow > ~/project/hashes.txt

このコマンドは両方のシステムファイルを読み込み、関連情報をマージして ~/project/hashes.txt に保存します。

次に、新しく作成されたファイルの内容を表示して結果を確認しましょう。

cat ~/project/hashes.txt

出力には、クラッキングツールが期待するフォーマットでユーザーとその対応するハッシュのリストが表示されます。testuser の行は以下のようになります。

testuser:$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn2KkL.D.v5/T6.zT.jC.gB6aB4bY3eZ2aX9cW8dY7eF6gH5iJ4kL3oP2qR1:1001:1001::/home/testuser:/bin/bash

このファイルは、Hashcat で使用する準備ができました。

ハッシュタイプの特定 (例:sha512crypt)

このステップでは、ユーザーパスワードに使用されているハッシュのタイプを確認します。これは非常に重要なステップです。なぜなら、Hashcat にクラッキングの試みで使用するハッシュ化アルゴリズムを正確に伝える必要があるからです。間違ったアルゴリズムを指定すると、必ず失敗します。

ステップ 1 で観察したように、ハッシュ文字列自体のフォーマットがアルゴリズムを示しています。hashes.txt ファイルを再度確認しましょう。

cat ~/project/hashes.txt

testuser のハッシュ文字列に注目してください。

testuser:$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn2KkL.D.v5/T6.zT.jC.gB6aB4bY3eZ2aX9cW8dY7eF6gH5iJ4kL3oP2qR1:...

ハッシュは $6$ で始まります。これは特定のハッシュタイプの標準的な識別子です。一般的な Linux ハッシュ識別子の簡単な参照表を以下に示します。

  • $1$ = md5crypt (MD5)
  • $2a$ または $2y$ = bcrypt (Blowfish)
  • $5$ = sha256crypt (SHA-256)
  • $6$ = sha512crypt (SHA-512)

$6$ というプレフィックスに基づいて、ハッシュタイプを sha512crypt であると自信を持って特定できます。これは、次のステップで必要となる情報です。

対応する Hashcat モードの選択

このステップでは、Hashcat が sha512crypt アルゴリズムを識別するために使用する正しいモード番号を見つけます。Hashcat は数百種類の異なるハッシュタイプをサポートしており、それぞれに一意のモード番号が割り当てられています。

sha512crypt のモードを見つけるには、grep を使用して Hashcat のヘルプ情報を検索できます。これは、ヘルプメニュー全体を読むことなく、必要な特定のモードを見つける効率的な方法です。

sha512crypt を検索するには、次のコマンドを実行します。

hashcat --help | grep -i sha512crypt

grep-i フラグは、検索を大文字・小文字を区別しないようにします。これは良い習慣です。出力には、ヘルプメニューからの一致する行が表示されます。

...
1800 | sha512crypt, SHA512(Unix)                  | Operating System
...

この出力から、sha512crypt のモード番号が 1800 であることがわかります。このモード番号を最終ステップで使用して、Hashcat に hashes.txt ファイル内のハッシュをどのように解釈するかを指示します。

Linux ハッシュに対する辞書攻撃の実行

この最終ステップでは、Hashcat を使用してキャプチャされたハッシュに対して辞書攻撃を実行します。辞書攻撃は、潜在的なパスワードのリスト(「辞書」または「単語リスト」)を取得し、ターゲットハッシュと同じアルゴリズムを使用してそれぞれをハッシュ化し、結果を比較することによって機能します。一致が見つかった場合、パスワードはクラックされたことになります。

実験のセットアップ中に ~/project ディレクトリにダウンロードされた rockyou.txt 単語リストを使用します。これは、パスワード監査で非常によく使用される単語リストです。

次に、収集したすべての情報を使用して完全な Hashcat コマンドを構築します。

  • モード (-m): sha512crypt の場合は 1800
  • ハッシュファイル: ~/project/hashes.txt
  • 単語リスト: ~/project/rockyou.txt
  • オプション (--force): これは、仮想化環境または特定のドライバーで Hashcat を実行する際に発生する可能性のあるエラーを防ぐために追加されます。

攻撃を開始するには、コマンドを実行します。

hashcat -m 1800 --force ~/project/hashes.txt ~/project/rockyou.txt

Hashcat が初期化され、クラッキングセッションが開始されます。パスワード password123rockyou.txt リストに含まれているため、プロセスは非常に高速になるはずです。

...
Session..........: hashcat
Status...........: Running
Hash.Name........: sha512crypt, SHA512(Unix)
Hash.Target......: testuser:$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn...
...
Approaching final keyspace - workload adjusted.

Session..........: hashcat
Status...........: Cracked
...

Hashcat がステータスを Cracked または Exhausted と表示したら、攻撃は完了です。クラックされたパスワードを表示するには、同じコマンドで --show オプションを使用できます。

hashcat -m 1800 --force ~/project/hashes.txt --show

出力には、クラックされたハッシュとその対応するプレーンテキストパスワードが明確に表示されます。

testuser:$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn2KkL.D.v5/T6.zT.jC.gB6aB4bY3eZ2aX9cW8dY7eF6gH5iJ4kL3oP2qR1:password123

testuser のパスワードを正常にクラックしました!

まとめ

この実験を完了したこと、おめでとうございます!Linux システムで古典的なパスワード監査ワークフローを正常に実行しました。

この実験では、以下の方法を学びました。

  • ユーザーのパスワードハッシュを格納する /etc/shadow ファイルの構造を読み取り、理解する。
  • unshadow ツールを使用して、/etc/passwd および /etc/shadow からユーザーとハッシュデータを単一のファイルに結合する。
  • ハッシュ形式を検査して、パスワードハッシュアルゴリズム (sha512crypt) を特定する。
  • 特定されたハッシュタイプに対応する Hashcat のモード (1800) を見つける。
  • Hashcat、強力な単語リスト、および抽出されたハッシュを使用して辞書攻撃を実行する。
  • 正常にクラックされたパスワードを表示する。

この演習は、一般的な単語リストに見られない、強力で複雑でユニークなパスワードを使用することの重要性を示しています。システム管理者は、これらの同じ手法を使用して、環境内の弱いパスワードを積極的に見つけて修正することができます。