John the Ripper (通称: John, JtR) は、非常に有名で強力なオープンソースのパスワードクラッキングツールです。1996年にAlexander Peslyak (Solar Designer) によって最初に開発され、現在も活発に開発が続けられています(特にコミュニティによる「Jumbo」バージョン)。主にシステム管理者やセキュリティ専門家が、システムのパスワード強度をテストしたり、忘れてしまったパスワードを回復したりするために使用されます。しかし、その強力さゆえに、悪用される危険性もはらんでいます。
John the Ripperとは何か?
John the Ripperは、オフラインのパスワードクラッカーです。これは、パスワードハッシュ(暗号化されたパスワード)のリストを取得し、それに対応する元のパスワード(平文)を見つけ出そうと試みるツールです。オンラインのパスワードクラッカー(例: Hydra)がネットワーク経由でログイン試行を繰り返すのとは異なり、Johnは手元にあるハッシュデータに対して解析を行うため、ログイン試行回数の制限やアカウントロックの影響を受けません。
主な特徴:
- クロスプラットフォーム: Linux, macOS, Windows, Unix系OSなど、多くのプラットフォームで動作します。
- 多様なハッシュ形式に対応: Unix (DES, MD5, Blowfish), Windows (LM/NTLM), Kerberos AFS, MD4, MD5, SHA-1, SHA-256, SHA-512, bcrypt, そしてJumboバージョンではさらに多くの形式(ZIP, RAR, SSHキー, PDF, Office文書など)に対応しています。
- 自動ハッシュ検出: 多くの場合、Johnは提供されたファイル内のハッシュ形式を自動的に検出できます。
- 複数の攻撃モード: 辞書攻撃、ブルートフォース攻撃(インクリメンタルモード)、シングルクラックモードなど、複数の方法でパスワードを解析します。
- カスタマイズ可能: ルールを用いて辞書攻撃を強化したり、外部スクリプトを利用したりできます。
- オープンソース: 基本的な機能は無料で利用できます(Pro版も存在します)。
ペネトレーションテスターやセキュリティ監査担当者は、このツールを使って組織内の弱いパスワードを特定し、セキュリティポリシーの改善に役立てます。
インストール
John the Ripperのインストール方法はOSによって異なります。多くの場合、「Jumbo」バージョン(コミュニティによって拡張された機能豊富なバージョン)の利用が推奨されます。
Linux (Debian/Ubuntu系)
多くのディストリビューション、特にKali Linuxのようなペネトレーションテスト用OSでは、デフォルトでインストールされている場合があります。
インストールされていない場合は、aptパッケージマネージャを使います:
sudo apt update
sudo apt install john
最新のJumbo版を使いたい場合は、GitHubからソースコードを取得してビルドすることも可能です。
# 必要な依存関係をインストール (例)
sudo apt install build-essential libssl-dev zlib1g-dev
# GitHubからクローン
git clone https://github.com/openwall/john -b bleeding-jumbo john
cd john/src
# ビルドとインストール
./configure && make -s clean && make -sj4
# 必要に応じて `sudo make install`
macOS
Homebrewを使うのが簡単です:
brew install john-jumbo
または、公式サイトからZIPファイルをダウンロードし、手動でセットアップすることもできますが、Homebrewの方が新しいバージョンを管理しやすいでしょう。
Windows
公式サイトのダウンロードページからWindows用のバイナリ(ZIPファイル)をダウンロードできます。解凍して、`run` ディレクトリ内の `john.exe` を使用します。
最新機能(特にGPUサポートなど)が必要な場合は、Windows Subsystem for Linux (WSL) を利用するか、CygwinやVisual Studioを使ってソースからビルドする必要がありますが、手順は複雑になることがあります。
実行ファイルの場所:
インストール後、`john` コマンド(または `john.exe`)が実行パスに含まれているか確認してください。含まれていない場合は、フルパスを指定するか、パスを通す必要があります。
# パスが通っているか確認 (Linux/macOS)
which john
# ヘルプを表示して動作確認
john --help
基本的な使い方
基本的なコマンド構文は以下の通りです:
john [オプション] [パスワードファイル...]
[パスワードファイル]
には、解析したいパスワードハッシュが含まれるファイルを指定します。複数のファイルを指定することも可能です。
パスワードファイルの準備
Johnが解析できる形式でパスワードハッシュを用意する必要があります。
Linuxのパスワードファイル (`/etc/shadow`)
Linuxシステムでは、パスワードハッシュは通常 /etc/shadow
ファイルに保存されています。しかし、/etc/shadow
だけでは、ユーザー名などの情報(GECOS情報)が欠けており、「シングルクラックモード」の効果が低下します。そのため、/etc/passwd
ファイルと結合するのが一般的です。
unshadow
ユーティリティ(Johnに同梱)を使って結合します:
# root権限が必要な場合がある
sudo unshadow /etc/passwd /etc/shadow > mypasswords.txt
これで、mypasswords.txt
にJohnが解析しやすい形式のデータが作成されます。
他の形式のハッシュ
データベースダンプ、特定のアプリケーションのハッシュ、あるいは単純なハッシュリストなど、様々な形式がありえます。Johnが認識できる形式であれば、そのままファイルに保存して渡すことができます。
ZIPファイルやSSHキーなどの場合は、専用のツール(例: `zip2john`, `ssh2john`)を使ってJohnが扱える形式のハッシュを抽出します。
# ZIPファイルからハッシュを抽出
zip2john protected.zip > zip_hash.txt
# SSH秘密鍵からハッシュを抽出
ssh2john id_rsa > ssh_hash.txt
# PDFファイルからハッシュを抽出 (pdf2johnが必要)
pdf2john document.pdf > pdf_hash.txt
クラッキングの実行
準備したパスワードファイルを指定してJohnを実行します:
john mypasswords.txt
デフォルトでは、Johnは以下の順序でクラッキングモードを試します:
- シングルクラックモード (Single Crack Mode): ユーザー名やGECOS情報(フルネームなど)を基に、よく使われる変形パターン(例: username123, Username!)を試します。
- 辞書モード (Wordlist Mode): デフォルトの辞書ファイル (`password.lst`) を使って攻撃します。存在しない場合はスキップされることがあります。
- インクリメンタルモード (Incremental Mode): 全ての可能な文字の組み合わせを試すブルートフォース攻撃です。
解析には時間がかかる場合があります。特にインクリメンタルモードは計算量が多くなります。
結果の表示
クラッキングに成功したパスワードは、`john.pot` というファイル(Johnの実行ディレクトリ、または設定ファイルで指定された場所)に保存されます。
--show
オプションを使って、指定したパスワードファイルに対応するクラック済みのパスワードを表示できます:
john --show mypasswords.txt
出力例:
user1:password123:1001:1001:User One:/home/user1:/bin/bash
user2:monkey:1002:1002:User Two:/home/user2:/bin/bash
2 password hashes cracked, 0 left
この例では、`user1` のパスワードが `password123`、`user2` のパスワードが `monkey` であることが判明しました。
セッション管理
Johnはクラッキングの進行状況を `john.rec` ファイルに自動的に保存します。途中で中断しても、同じコマンドで再開すれば中断したところから続行できます。
# 中断 (Ctrl+C)
# 再開
john mypasswords.txt
特定のセッション名を指定して管理することも可能です:
# セッション名を指定して開始
john --session=my_session mypasswords.txt
# セッションを再開
john --restore=my_session
# セッションの状況を確認
john --status=my_session
実行中にキー(通常はEnterキー)を押すことでも、現在の状況(試行速度、経過時間など)を確認できます。
クラッキングモードの詳細
Johnにはいくつかの主要なクラッキングモードがあり、オプションで明示的に指定できます。
シングルクラックモード (`–single`)
パスワードファイルに含まれるユーザー名やGECOS情報を利用して、パスワード候補を生成します。単純なパスワード(例: ユーザー名をそのまま、あるいは少し変形したもの)を素早く見つけるのに効果的です。
john --single mypasswords.txt
例えば、ユーザー名が `testuser` であれば、`testuser`, `Testuser`, `testuser1`, `retset`, などの候補が試されます。
辞書モード (`–wordlist`)
指定された単語リスト(辞書ファイル)に含まれる単語をパスワード候補として試します。一般的な単語や過去に漏洩したパスワードリストを使うことが多いです。
# 指定した辞書ファイルを使用
john --wordlist=/path/to/custom_wordlist.txt mypasswords.txt
# 標準入力から辞書を読み込む
cat /path/to/wordlist.txt | john --stdin mypasswords.txt
有名な辞書ファイルとして `rockyou.txt` があります。非常に大きなリストですが、効果的な場合が多いです。
ルール (`–rules`)
辞書モードと組み合わせて使うことで、辞書の単語を様々な規則に従って変形させ、より多くの候補を生成します。例えば、大文字小文字変換、数字や記号の追加、単語の反転など。
# デフォルトのルールセットを適用
john --wordlist=/path/to/wordlist.txt --rules mypasswords.txt
# 特定のルールセットを指定 (john.conf で定義)
john --wordlist=/path/to/wordlist.txt --rules=Jumbo mypasswords.txt
ルールを適用することで、`password` という単語から `Password`, `p@ssword`, `password123`, `drowssap` など、多様なバリエーションを試すことができます。
インクリメンタルモード (`–incremental`)
ブルートフォース(総当たり)攻撃を行います。指定された文字セット(例: 数字のみ、英数字、全ASCII文字)と長さの範囲で、考えられるすべての組み合わせを試します。
# デフォルトのインクリメンタルモード (通常は英数字など)
john --incremental mypasswords.txt
# 特定のモードを指定 (john.conf で定義)
john --incremental=Digits mypasswords.txt # 数字のみ
john --incremental=Alnum mypasswords.txt # 英数字のみ
このモードは非常に時間がかかりますが、辞書に載っていないランダムなパスワードを見つけられる可能性があります。文字セットや長さは `john.conf` ファイルでカスタマイズできます。
マスクモード (`–mask`)
特定のパターン(マスク)に一致するパスワード候補のみを試すブルートフォース攻撃の一種です。パスワードの形式について何らかの情報がある場合に有効です。
# 例: 8文字の英大文字で始まるパスワード (残りは小文字)
# ?u = 英大文字, ?l = 英小文字
john --mask='?u?l?l?l?l?l?l?l' mypasswords.txt
# 例: 6桁の数字
# ?d = 数字
john --mask='?d?d?d?d?d?d' mypasswords.txt
独自の文字セットを定義することも可能です。
外部モード (`–external`)
カスタムスクリプトやプログラムを使ってパスワード候補を生成するモードです。非常に柔軟な攻撃が可能になります。
高度なオプションとヒント
ハッシュ形式の指定 (`–format`)
Johnは多くの場合ハッシュ形式を自動検出しますが、誤検出したり、複数の形式が考えられる場合があります。その際は `–format` オプションで明示的に指定します。
# LMハッシュとして解析
john --format=lm my_windows_hashes.txt
# Raw MD5として解析
john --format=raw-md5 my_md5_hashes.txt
# ZIPファイルのハッシュとして解析
john --format=zip zip_hash.txt
サポートされている形式のリストは `–list=formats` で確認できます。
john --list=formats
特定のユーザーのみを対象 (`–users`)
パスワードファイル内の特定のユーザーのみをクラッキング対象にしたい場合に使います。
# user1 と user3 のみを対象
john --users=user1,user3 mypasswords.txt
# root ユーザーのみを除外
john --users=-root mypasswords.txt
マルチコア/マルチプロセス (`–fork`)
複数のCPUコアを利用してクラッキングを高速化します。
# 4つのプロセスで並列実行
john --fork=4 mypasswords.txt
GPUの利用 (OpenCL)
対応するGPUがあれば、OpenCLを使ってさらに高速化できます(Jumbo版で、ビルド時にOpenCLサポートが有効になっている必要があります)。
# 利用可能なOpenCLデバイスを確認
john --list=opencl-devices
# OpenCL対応のハッシュ形式を指定して実行 (例: sha512crypt)
john --format=sha512crypt-opencl --wordlist=wl.txt mypasswords.txt
# 特定のGPUデバイスを指定して実行 (例: デバイス0と1)
john --format=wpapsk-opencl --wordlist=wl.txt --dev=0,1 --fork=2 wifi_hashes.hccapx
Windows環境でのGPU利用はセットアップが複雑な場合があります。
`john.conf` ファイルのカスタマイズ
Johnの動作は `john.conf` (または `john.ini`) ファイルで詳細に設定できます。インクリメンタルモードの文字セット、ルールセットの定義、外部モードの設定などが可能です。
倫理的な考慮事項と合法性
John the Ripperは非常に強力なツールであり、その使用には大きな責任が伴います。
- 許可の取得: 自分自身が所有していないシステムやアカウントに対してJohn the Ripperを使用することは、ほとんどの国や地域で違法行為となります。必ず、対象システムの所有者から書面による明確な許可を得てください。
- 目的の明確化: セキュリティ監査やパスワード強度テスト、パスワード忘れの回復など、正当な目的でのみ使用してください。
- 情報の取り扱い: クラッキングによって得られたパスワード情報は機密情報として扱い、適切に管理・保護し、許可された目的以外には絶対に使用しないでください。
- 意図しない影響: 大量の計算リソースを消費するため、共有システムなどで実行する際は他のユーザーへの影響を考慮してください。
まとめ
John the Ripperは、パスワードセキュリティの評価において非常に有用なツールです。シングルクラック、辞書、インクリメンタルといった多様なモードと、豊富なカスタマイズオプションにより、様々な状況に対応できます。
このツールの使い方を理解することは、自身のシステムのパスワードポリシーがどれだけ堅牢かを確認し、弱いパスワードを使用しているユーザーを特定するのに役立ちます。強力なパスワードポリシー(長く、複雑で、推測困難なパスワードの使用)を導入し、定期的に監査を行うことが、John the Ripperのようなツールによる攻撃からシステムを守るための鍵となります 。
繰り返しになりますが、John the Ripperは倫理的に、そして法的に許可された範囲内で使用してください。責任ある使用を心がけ、サイバーセキュリティの向上に貢献しましょう。
参考情報
- John the Ripper 公式サイト: https://www.openwall.com/john/
- John the Ripper Community Wiki (GitHub): https://github.com/openwall/john/wiki