John the Ripper の unshadow ツールの使い方 🕵️‍♀️

はじめに: John the Ripper とパスワードクラッキングの世界へようこそ

John the Ripper (しばしば “John” と略されます) は、非常に有名で強力なオープンソースのパスワードクラッキングツールです。セキュリティ専門家、システム管理者、そして倫理的なハッカー (ペネトレーションテスター) たちによって広く利用されており、システムのパスワード強度を監査したり、忘れてしまったパスワードを回復したりする目的で使われます (もちろん、悪用は厳禁です 🚫)。

John the Ripper は、様々なOS (Linux, Windows, macOS など) で動作し、驚くほど多くの種類のパスワードハッシュ形式に対応しています。Unix系のシステムで使われる crypt(3) 形式のハッシュ、Windows の LM/NTLM ハッシュ、MD5 や SHA ファミリーなど、非常に多岐にわたります。

しかし、John the Ripper がその真価を発揮するためには、多くの場合、解析対象となるパスワード情報を適切な形式で準備する必要があります。特に、現代の Linux や Unix ライクなシステムでは、セキュリティ上の理由から、ユーザーアカウント情報とパスワードハッシュ情報が別々のファイルに保存されています。ここで登場するのが、今回解説する `unshadow` ツールです。`unshadow` は、John the Ripper スイートに含まれるユーティリティの一つで、これらの分離された情報を結合し、John が処理できる形式に整える重要な役割を担っています。

このブログ記事では、`unshadow` ツールの基本的な使い方から、なぜそれが必要なのか、そして具体的な使用例までを詳しく解説していきます。パスワードセキュリティ監査の第一歩として、`unshadow` をマスターしましょう! 💪

unshadow とは何か? 🤔

`unshadow` は、John the Ripper パッケージに含まれるシンプルなコマンドラインユーティリティです。その主な機能は、Linux や Unix ライクなシステムで一般的に使用される二つの重要なファイルを結合することです。

  • /etc/passwd: ユーザーアカウント情報 (ユーザー名、ユーザーID (UID)、グループID (GID)、ホームディレクトリ、ログインシェルなど) を格納するファイル。歴史的な理由からこの名前ですが、現代のシステムでは通常、パスワード自体はここには保存されていません。このファイルは一般ユーザーでも読み取り可能なパーミッションが設定されていることが多いです。
  • /etc/shadow: 実際のパスワードハッシュ、パスワードの有効期限情報などを格納するファイル。セキュリティを強化するため、このファイルは通常、root ユーザーしか読み取れないように厳しくパーミッションが設定されています。

`unshadow` は、これら二つのファイルを入力として受け取り、それぞれのユーザーに対応する行を結合して、John the Ripper が解析可能な形式の単一のファイル (または標準出力) に出力します。

なぜ結合が必要なのか?

John the Ripper は、パスワードクラッキングを効率的に行うために、ユーザー名とそれに対応するパスワードハッシュが一行にまとめられた形式の入力を期待します。また、John の強力な機能の一つである「シングルクラックモード (Single Crack Mode)」では、パスワードの推測にユーザー情報 (GECOS フィールドに含まれる氏名など) やホームディレクトリ名を利用します。これらの追加情報は `/etc/passwd` ファイルにしか含まれていないため、`/etc/shadow` ファイルだけを John に渡した場合、シングルクラックモードの効率が低下したり、特定のオプション (例: `–shells` や `–groups`) が利用できなくなったりします。`unshadow` は、これらの情報を適切に組み合わせることで、John the Ripper が最大限の能力を発揮できるようにするのです。

基本的な使い方 ⌨️

`unshadow` の使い方は非常にシンプルです。基本的なコマンド構文は以下の通りです。

unshadow <passwdファイル> <shadowファイル> > <出力ファイル>

各部分の説明です:

  • unshadow: 実行するコマンド名です。
  • <passwdファイル>: ユーザーアカウント情報が含まれるファイルへのパスを指定します。通常は /etc/passwd です。
  • <shadowファイル>: パスワードハッシュ情報が含まれるファイルへのパスを指定します。通常は /etc/shadow です。
  • > <出力ファイル>: 結合された結果を出力するファイル名を指定します。> はリダイレクト演算子で、標準出力をファイルに書き込むことを意味します。任意のファイル名を指定できます (例: `my_passwd_hashes.txt`, `john_input.txt`)。

重要な注意点: `/etc/shadow` ファイルは通常、root ユーザーしか読み取り権限がありません。したがって、`unshadow` コマンドを実行するには、一般的に root 権限が必要です (`sudo` コマンドを使用するなど)。

具体例

現在のシステムの `/etc/passwd` と `/etc/shadow` を結合し、結果を `combined_passwd.txt` というファイルに保存する場合、以下のコマンドを実行します。

sudo unshadow /etc/passwd /etc/shadow > combined_passwd.txt

このコマンドを実行すると、カレントディレクトリに `combined_passwd.txt` というファイルが作成されます。このファイルには、各ユーザーの情報が John the Ripper で処理しやすい形式で一行ずつ格納されています。

パーミッションについて

生成された出力ファイルには、システムのパスワードハッシュが含まれています。これは非常に機密性の高い情報です 🔐。不必要に他のユーザーからアクセスされないように、ファイルのパーミッションを適切に設定することが重要です。例えば、自分だけが読み書きできるようにするには、以下のコマンドを実行します。

chmod 600 combined_passwd.txt

セキュリティ監査などの作業が完了したら、このファイルは安全に削除することを強く推奨します。

実行例: `unshadow` の動作を見てみよう 👀

`unshadow` が実際にどのようにファイルを結合するのか、簡単な例で見てみましょう。

入力ファイル

以下のような内容の `/etc/passwd` ファイルがあるとします (簡略化のため一部フィールドのみ):

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
user1:x:1000:1000:Test User One:/home/user1:/bin/bash
user2:x:1001:1001:Test User Two:/home/user2:/bin/zsh

そして、対応する `/etc/shadow` ファイルの内容が以下のようだとします (ハッシュ部分は例です):

root:$6$rounds=656000$...長いハッシュ...:19780:0:99999:7:::
daemon:*:19720:0:99999:7:::
user1:$6$rounds=656000$...別の長いハッシュ...:19781:0:99999:7:::
user2:$1$abcdefgh$shortHashHere:19781:0:99999:7:::

(注意: `daemon` ユーザーのパスワードフィールドが `*` になっているのは、通常パスワードログインが無効化されていることを示します。)

`unshadow` の実行

これらのファイルを `unshadow` で結合します。

sudo unshadow /etc/passwd /etc/shadow > combined.txt

出力ファイル (`combined.txt`)

生成される `combined.txt` の内容は、以下のようになります。

root:$6$rounds=656000$...長いハッシュ...:0:0:root:/root:/bin/bash
user1:$6$rounds=656000$...別の長いハッシュ...:1000:1000:Test User One:/home/user1:/bin/bash
user2:$1$abcdefgh$shortHashHere:1001:1001:Test User Two:/home/user2:/bin/zsh

لاحظ أن:

  • `passwd` ファイルの第2フィールドにあった `x` が、`shadow` ファイルの実際のパスワードハッシュ (または `*` のようなログイン不可を示す文字列) に置き換えられています。
  • `shadow` ファイルにあったパスワード有効期限などの情報は、John the Ripper が直接必要としないため、通常は結合後のファイルには含まれません (John が必要とするのは主にユーザー名、ハッシュ、そして `passwd` ファイル由来のユーザー情報です)。
  • パスワードログインが無効になっているユーザー (`daemon` など) は、通常、出力ファイルには含まれません (John がクラック対象とする有効なハッシュを持たないため)。
  • 各行は、`ユーザー名:パスワードハッシュ:UID:GID:GECOS:ホームディレクトリ:ログインシェル` という形式になっています。

この `combined.txt` ファイルを John the Ripper に入力として与えることで、パスワードクラッキングのプロセスを開始できます。例えば、以下のように実行します。

john combined.txt

これで、John the Ripper は `combined.txt` を読み込み、パスワードの解析を開始します ✨。

なぜ /etc/passwd と /etc/shadow は分離されているのか? (歴史的背景) 📜

`unshadow` の必要性を理解するには、なぜそもそもパスワード情報が二つのファイルに分離されるようになったのか、その歴史的背景を知ることが役立ちます。

初期の Unix システムでは、ユーザーアカウント情報と暗号化 (実際にはハッシュ化) されたパスワードの両方が、単一のファイル /etc/passwd に格納されていました。このファイルは、ユーザーIDとユーザー名の対応付けや、ホームディレクトリの場所、デフォルトシェルの確認など、OS の様々な機能から参照される必要があったため、全てのユーザーに対して読み取り権限が付与されている必要がありました。

しかし、コンピュータの処理能力が向上するにつれて、たとえハッシュ化されていても、/etc/passwd ファイルの内容を入手できれば、オフラインで辞書攻撃や総当たり攻撃 (ブルートフォースアタック) を仕掛けることで、比較的容易に弱いパスワードをクラックできるようになってきました。これは重大なセキュリティリスクでした 😱。

この問題に対処するため、1980年代中頃 (SunOS などが先駆けとなり、1988年の System V Release 3.2 や 1990年の BSD 4.3 Reno などで広まりました) に「シャドウパスワード」という仕組みが導入されました。

シャドウパスワードシステムの考え方はシンプルです。

  1. 機密性の高いパスワードハッシュ情報を、元の /etc/passwd ファイルから分離する。
  2. 分離したパスワードハッシュ情報を、新しいファイル /etc/shadow に格納する。
  3. /etc/shadow ファイルには、root ユーザー (または特定の管理グループ) のみがアクセスできるように、厳しい読み取り権限を設定する。
  4. 元の /etc/passwd ファイルのパスワードフィールドには、プレースホルダーとして `x` などの文字を入れておく。

これにより、一般ユーザーは引き続き /etc/passwd ファイルを読み取って必要なユーザー情報を取得できますが、肝心のパスワードハッシュにはアクセスできなくなりました。システムがユーザー認証を行う際には、特権プロセスが /etc/shadow ファイルを参照してパスワードを検証します。

この「関心の分離」により、システムのセキュリティは大幅に向上しました。しかし、パスワード監査ツールである John the Ripper が動作するためには、依然としてユーザー情報とパスワードハッシュの両方が必要です。そこで、特権ユーザーがこれらの情報を一時的に結合するための手段として `unshadow` ツールが提供されている、というわけです。

Linux システムでは、Shadow Password Suite が1992年に移植され、初期のディストリビューションから広く採用されています。現在では、ほとんどの Linux ディストリビューションでシャドウパスワードが標準的に利用されています。

`unshadow` のオプションと注意点 ⚠️

`unshadow` コマンド自体は非常にシンプルで、通常は特別なオプションを必要としません。主な機能は前述の通り、passwd 形式のファイルと shadow 形式のファイルを結合することです。

しかし、いくつか注意すべき点や、関連する情報があります。

  • 入力ファイルの正確性: 指定する passwd ファイルと shadow ファイルが、対象システムの正しいファイルであることを確認してください。異なるシステムから取得したファイルを混ぜて使用すると、意図しない結果になる可能性があります。
  • ファイル形式: `unshadow` は標準的な Unix/Linux の passwd/shadow ファイル形式を想定しています。特殊な形式や、破損したファイルを入力すると、正しく動作しない可能性があります。一部の John the Ripper のドキュメントでは、HP-UX (tcb) や AIX など、他の Unix 系 OS のパスワードファイル形式もサポートしている可能性が示唆されていますが、主に Linux 環境での利用が一般的です。
  • root 権限: 再度強調しますが、/etc/shadow へのアクセスには通常 root 権限が必要です。`sudo unshadow …` のように実行することを忘れないでください。
  • 出力ファイルの管理: 生成されたファイルには機密情報が含まれるため、アクセス権を適切に管理し、不要になったら速やかに削除することが不可欠です。
  • 代替手段: システムによっては、ユーザー情報を取得するための他のコマンド (例: `getent passwd`, `getent shadow`) が利用可能な場合もあります。しかし、John the Ripper での使用を目的とする場合、`unshadow` を使うのが最も直接的で標準的な方法です。
  • John the Ripper のバージョン: `unshadow` は John the Ripper 本体と共に配布されています。John the Ripper のバージョンによっては、`unshadow` の挙動や機能に微妙な違いがある可能性もゼロではありませんが、基本的な機能は長年にわたり安定しています。
  • エラーハンドリング: ファイルが見つからない、権限がないなどのエラーが発生した場合、`unshadow` はエラーメッセージを出力して終了します。メッセージをよく読んで対処してください。

倫理的な使用について

John the Ripper や `unshadow` は、非常に強力なツールですが、その使用は倫理的かつ法的に許可された範囲内に限定されなければなりません。自身の管理下にあるシステム、または明確な許可を得たシステムに対してのみ、パスワード強度監査やセキュリティ評価の目的で使用してください。他人のシステムに対して無許可で使用することは、不正アクセス禁止法などの法律に違反する犯罪行為となります 🚫⚖️。ツールを使う際は、常にその影響と責任を理解し、正当な目的のためにのみ利用しましょう。

システム管理者やセキュリティ担当者が正当な監査目的で `unshadow` を使用することは一般的ですが、悪意のある攻撃者も認証情報を窃取するためにこのツールを利用することがあります。そのため、セキュリティ監視システム (SIEM など) では、`unshadow` の不審な実行を検知するルールが設定されている場合があります。

まとめ

`unshadow` は、John the Ripper スイートの中でも地味ながら非常に重要な役割を果たすユーティリティです。現代の Linux/Unix システムにおけるパスワード管理の仕組み (passwd ファイルと shadow ファイルの分離) を理解し、John the Ripper が効率的にパスワードクラッキングを行えるように、必要な情報を適切な形式に結合します。

この記事で学んだこと:

  • `unshadow` は /etc/passwd/etc/shadow ファイルを結合する。
  • 結合は、John the Ripper がパスワードハッシュとユーザー情報を同時に処理するために必要。
  • 基本的な使い方は `unshadow <passwdファイル> <shadowファイル> > <出力ファイル>`。
  • 実行には通常 `sudo` などで root 権限が必要。
  • シャドウパスワードは、セキュリティ向上のために導入された歴史的経緯がある。
  • 生成されたファイルは機密情報として扱い、適切に管理・削除する必要がある。
  • ツールの使用は、倫理的かつ法的に許可された範囲で行うこと。

`unshadow` を正しく使うことで、John the Ripper を用いたパスワード強度監査やセキュリティ評価をスムーズに進めることができます。パスワードセキュリティの維持・向上のために、これらのツールを適切に活用していきましょう!🚀

参考情報

より詳しい情報や John the Ripper の使い方については、以下の公式ドキュメントや関連ページを参照してください。