このブログ記事では、強力なパスワードクラッキングツールであるJohn the Ripperスイートに含まれるユーティリティスクリプト、htdigest2john
について詳しく解説します。Apache HTTP ServerのDigest認証で使用されるhtdigest
ファイルのパスワードハッシュを、John the Ripperが解析できる形式に変換する方法を学びます。🔐
はじめに:htdigestとJohn the Ripper
htdigest2john
の役割を理解するために、まず関連する2つの要素、Apacheのhtdigest
ファイルとJohn the Ripperについて知っておく必要があります。
Apache Digest認証とhtdigestファイル
Apache HTTP Serverは、ウェブサイトの特定ディレクトリへのアクセスを制限するための認証機能を提供しています。その一つがDigest認証です。Digest認証は、Basic認証よりも安全性が高いとされる認証方式です。Basic認証ではユーザー名とパスワードがBase64エンコードされて送信されますが、これは容易にデコードできるため、通信が暗号化(HTTPS)されていない場合は盗聴のリスクがあります。
一方、Digest認証では、サーバーからのチャレンジ(nonceと呼ばれる一度限りのランダムな値)と、ユーザー名、パスワード、レルム(保護領域の名前)などを組み合わせてMD5ハッシュを計算し、その結果をサーバーに送信します。これにより、パスワード自体がネットワーク上を平文で流れることを防ぎます。
Digest認証で使用されるユーザー名、レルム、およびパスワードのハッシュ情報を格納するファイルがhtdigest
ファイルです(慣習的に.htdigest
という名前が使われることもあります)。このファイルは通常、htdigest
コマンドを使用して作成・管理されます。ファイル内の各行は以下の形式になっています。
username:realm:hash
ここでのhash
は、MD5(username:realm:password)
という形式で計算されたMD5ハッシュ値です。例えば、ユーザー名が「testuser」、レルムが「RestrictedArea」、パスワードが「secret123」の場合、まず「testuser:RestrictedArea:secret123」という文字列を作成し、そのMD5ハッシュを計算してファイルに保存します。
John the Ripper (JtR)
John the Ripper(通称JohnまたはJtR)は、非常に有名で強力なオープンソースのパスワードクラッキングツールです。元々はUNIX系のパスワードハッシュ(crypt)を解析するために開発されましたが、現在では「Jumbo」バージョンを中心に、WindowsのLM/NTLMハッシュ、各種アプリケーションのパスワードハッシュ、ZIPファイルやPDFファイルのパスワードなど、非常に多くの形式に対応しています。
John the Ripperは主に以下のような目的で使用されます。
- パスワード強度監査: システム管理者が、ユーザーが設定したパスワードの強度を評価するために使用します。弱いパスワードが見つかった場合、ユーザーに警告し、より強固なパスワードへの変更を促します。
- パスワードリカバリ: 正規のユーザーが忘れてしまったパスワードを回復するために使用されることがあります(ただし、倫理的・法的な配慮が必要です)。
- ペネトレーションテスト: セキュリティ専門家が、システムの脆弱性を評価する一環として、パスワードクラッキング耐性をテストするために使用します。
John the Ripperは、辞書攻撃、ブルートフォース(総当たり)攻撃、インクリメンタル攻撃など、様々な攻撃手法をサポートしています。また、「ルール」と呼ばれる機能を使って、辞書の単語を様々に変化させ(例: 大文字小文字変換、数字や記号の追加)、より複雑なパスワードも効率的に試行できます。
htdigest2johnの役割
ここでhtdigest2john
の登場です。John the Ripper本体は、様々な形式のハッシュを直接解析できますが、特定のファイル形式(例えばApacheのhtdigest
ファイル)をそのまま入力として受け付けるわけではありません。John the Ripperが理解できる標準的なハッシュ形式に変換する必要があります。
htdigest2john
は、htdigest
ファイルの内容を読み込み、John the Ripperが解析可能な形式(具体的にはusername:$digest$realm$hash
のような形式)に変換するためのコンバータースクリプトです。このスクリプトを使うことで、htdigest
ファイルに保存されているパスワードハッシュに対して、John the Ripperの強力なクラッキング機能を適用できるようになります。 💪
htdigest2johnの入手とインストール
htdigest2john
は、独立したツールではなく、John the Ripperスイートの一部として提供されています。したがって、htdigest2john
を使用するには、まずJohn the Ripper(通常は機能豊富な「Jumbo」バージョン)をインストールする必要があります。
John the Ripperのインストール方法
John the Ripperの入手方法はいくつかあります。
-
公式サイトからのダウンロード:
OpenwallのJohn the Ripper公式サイトから、ソースコードまたはコンパイル済みのバイナリ(対応プラットフォームがあれば)をダウンロードできます。「Jumbo」バージョンは、コミュニティによってメンテナンスされており、より多くのハッシュ形式や機能が含まれています。通常はこちらの利用が推奨されます。ソースコードからコンパイルする場合は、サイトの指示に従ってください。 -
パッケージマネージャの使用 (Linux/macOS):
多くのLinuxディストリビューションやmacOSのHomebrewでは、パッケージマネージャを使って簡単にインストールできます。- Debian/Ubuntu:
sudo apt update && sudo apt install john
- Fedora/CentOS/RHEL:
sudo dnf install john
またはsudo yum install john
- macOS (Homebrew):
brew install john-jumbo
またはbrew install john
Kali Linuxのようなペネトレーションテスト用ディストリビューションには、通常、John the Ripper (Jumbo)がプリインストールされています。
- Debian/Ubuntu:
-
GitHubリポジトリ:
最新の開発版はGitHubリポジトリから取得できます。
htdigest2johnスクリプトの場所
John the Ripperをインストールすると、htdigest2john
スクリプト(多くの場合Pythonスクリプト htdigest2john.py
)は、通常、John the Ripperの実行ファイル(john
)と同じディレクトリ、またはその中のrun
ディレクトリやextra
ディレクトリなどに配置されます。
例えば、ソースからコンパイルした場合、John the Ripperを展開したディレクトリ内のrun
フォルダに多くの補助スクリプトが含まれています。パッケージマネージャでインストールした場合、/usr/bin/
や/usr/sbin/
、あるいは/opt/john/
のような場所にインストールされ、htdigest2john
もその近く(例: /usr/share/john/
や/opt/john/
)に見つかることが多いです。
見つからない場合は、find
コマンドなどで検索してみてください。
find / -name htdigest2john.py 2>/dev/null
スクリプトを実行するには、Pythonがインストールされている必要があります(通常、現代的なシステムにはインストールされています)。
htdigest2johnの基本的な使い方
htdigest2john
の使い方は非常にシンプルです。基本的なコマンド構文は以下の通りです。
/path/to/htdigest2john.py /path/to/your_htdigest_file > output_hash_file.txt
または、John the Ripperのrun
ディレクトリにいる場合は、
./htdigest2john.py ../path/to/your_htdigest_file > output_hash_file.txt
入力ファイル (htdigestファイル)
入力として、Apacheのhtdigest
コマンドで生成されたファイルを指定します。このファイルには、前述の通りusername:realm:hash
形式のデータが含まれている必要があります。
例えば、以下のような内容のmy_htdigest.users
ファイルがあるとします。
alice:SecureZone:a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6
bob:AdminArea:f0e9d8c7b6a5b4c3d2e1f0a9b8c7d6e5
出力ファイル (John the Ripper形式)
htdigest2john
スクリプトは、この入力ファイルを読み込み、各行をJohn the Ripperが認識できる形式に変換して標準出力に出力します。リダイレクト演算子>
を使って、この出力をファイル(例: output_hash_file.txt
)に保存します。
上記のmy_htdigest.users
ファイルを入力としてhtdigest2john
を実行すると、output_hash_file.txt
には以下のような内容が書き込まれます。
alice:$digest$SecureZone$a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6
bob:$digest$AdminArea$f0e9d8c7b6a5b4c3d2e1f0a9b8c7d6e5
この形式は、ユーザー名:ハッシュ情報
というJohn the Ripperの基本的な入力形式に従っています。$digest$realm$hash
の部分が、John the Ripperに対して「これはApache Digest認証のハッシュであり、レルムはこれで、MD5ハッシュ値はこれである」という情報を伝えています。John the Ripperはこの情報をもとに、正しい方法でパスワードの試行と比較を行います。
実行例
John the Ripperのrun
ディレクトリにいると仮定し、htdigest
ファイルが/etc/apache2/.htdigest-users
にある場合、以下のように実行します。
cd /path/to/john/run
./htdigest2john.py /etc/apache2/.htdigest-users > ~/digest_hashes.txt
これで、ホームディレクトリにdigest_hashes.txt
という名前で、John the Ripper用のハッシュファイルが作成されます。✅
John the Ripperでのパスワードクラック
htdigest2john
でJohn the Ripper用のハッシュファイルを作成したら、いよいよJohn the Ripper本体を使ってパスワードクラックを試みます。
基本的なクラックコマンド
最も基本的なコマンドは、John the Ripperの実行ファイル(john
)に、先ほど作成したハッシュファイルを引数として渡すだけです。
/path/to/john/run/john ~/digest_hashes.txt
または、run
ディレクトリにいる場合は、
./john ~/digest_hashes.txt
これを実行すると、John the Ripperはまずデフォルトの攻撃モード(Single Crackモード、Incrementalモード、Wordlistモードの順)を試します。
- Single Crackモード: ユーザー名やGecos情報(フルネームなど、もしあれば)から派生したパスワード候補を試します。
- Wordlistモード (デフォルト辞書): John the Ripperに同梱されているデフォルトの辞書ファイル (
password.lst
) を使って辞書攻撃を行います。ルールも適用されます。 - Incrementalモード: 設定された文字セット(例: すべての表示可能ASCII文字)を使って、短いものから順に総当たり攻撃を試みます。
よく使われるオプション
より効率的にクラックを行うために、いくつかのオプションを指定することが一般的です。
-
--wordlist=<辞書ファイル>
: 指定した辞書ファイルを使って辞書攻撃を行います。有名な辞書ファイルにはrockyou.txt
などがあります。./john --wordlist=/usr/share/wordlists/rockyou.txt ~/digest_hashes.txt
-
--rules=<ルール名>
: 辞書攻撃に適用するルールを指定します。--rules=Default
(デフォルト)、--rules=Wordlist
(大規模辞書向け)、--rules=KoreLogic
など、様々なルールセットがjohn.conf
ファイルで定義されています。./john --wordlist=/path/to/my_dict.txt --rules=Best64 ~/digest_hashes.txt
-
--format=<ハッシュ形式>
: 解析するハッシュの形式を明示的に指定します。htdigest2john
で生成されたファイルの場合、John the Ripperは通常自動的にdigest
形式(Apache htdigest MD5)を検出しますが、問題がある場合や他の形式と混同される可能性がある場合に指定すると良いでしょう。./john --format=md5_gen --wordlist=dict.txt ~/digest_hashes.txt
(注意: John the Ripperのバージョンや設定によっては、htdigest形式が
md5_gen
または特定のサブフォーマット名で認識される場合があります。./john --list=formats | grep -i digest
などで確認してください。) -
--incremental=<モード名>
: インクリメンタルモード(総当たり)の種類を指定します(例:--incremental=Digits
で数字のみ)。./john --incremental=Alnum ~/digest_hashes.txt
-
--fork=<プロセス数>
: マルチコアCPUを活用するために、指定した数のプロセスで並列処理を行います。./john --fork=4 --wordlist=rockyou.txt ~/digest_hashes.txt
クラック結果の表示
John the Ripperはクラックに成功したパスワードをjohn.pot
(John the Pot)ファイルに記録します。クラックが完了した後、または途中で、どのパスワードがクラックされたかを確認するには--show
オプションを使用します。
./john --show ~/digest_hashes.txt
これにより、クラックされたユーザー名とパスワードのペアが表示されます。
alice:secret123:1000:1000::/home/alice:/bin/bash
bob:password:1001:1001::/home/bob:/bin/bash
2 password hashes cracked, 0 left
一度クラックされたハッシュはjohn.pot
に記録されるため、再度同じハッシュファイルでjohn
コマンドを実行しても、既にクラック済みのものはスキップされます。「No password hashes left to crack」と表示された場合は、--show
で結果を確認してください。
特定の形式でクラックした結果を表示したい場合は、--format
オプションも併用します。
./john --show --format=md5_gen ~/digest_hashes.txt
htdigestファイルの形式について(再確認)
htdigest2john
を効果的に使うために、htdigest
ファイルの形式とその意味を再確認しておきましょう。
htdigestファイル形式
各行はコロン(:
)で区切られた3つのフィールドから構成されます。
<username>:<realm>:<hash>
<username>
: 認証に使用されるユーザー名。<realm>
: 保護領域(レルム)の名前。Apacheの設定ファイル(httpd.conf
や.htaccess
)のAuthName
ディレクティブで指定された値と一致する必要があります。レルムは、同じサーバー上の異なる保護領域を区別するために使用されます。<hash>
: パスワードから計算されたハッシュ値。具体的には、MD5(username:realm:password)
という形式の文字列のMD5ハッシュ(16進数表記)です。
例えば、htdigest -c /etc/apache2/.htusers SecureRealm user1
というコマンドを実行し、パスワードとして “P@sswOrd” を入力した場合、/etc/apache2/.htusers
ファイルには以下のような行が生成されます(ハッシュ値は例です)。
user1:SecureRealm:9e107d9d372bb6826bd81d3542a419d6
これは、文字列 “user1:SecureRealm:P@sswOrd” のMD5ハッシュが 9e107d9d372bb6826bd81d3542a419d6
であることを意味します。
htdigest2john
は、この情報をJohn the Ripperが理解できる user1:$digest$SecureRealm$9e107d9d372bb6826bd81d3542a419d6
という形式に変換します。John the Ripperはこれを受け取ると、辞書やルールから生成したパスワード候補(例: “password123″)を使って、MD5("user1:SecureRealm:password123")
を計算し、ファイル中のハッシュ値と比較します。一致すれば、パスワードがクラックされたことになります。🎉
注意点とベストプラクティス
htdigest2john
やJohn the Ripperは強力なツールですが、その使用には注意が必要です。また、パスワードセキュリティ全般に関するベストプラクティスも念頭に置くべきです。
セキュリティベストプラクティス
- 強固なパスワードの使用: Digest認証自体が現代的な基準では推奨されにくくなっていますが、もし使用する場合でも、ユーザーは長く、複雑で、推測困難なパスワードを設定すべきです。パスワードマネージャーの使用を推奨します。
-
htdigestファイルの保護:
htdigest
ファイルにはパスワードのハッシュ情報が含まれています。このファイルへのアクセス権限を最小限に絞り、ウェブサーバーのプロセスが必要とする最低限の権限のみを与えるべきです。ウェブからアクセス可能なディレクトリに置かないでください。たとえハッシュ化されていても、このファイルが漏洩すると、オフラインでのパスワードクラック攻撃(まさにJohn the Ripperで行うような攻撃)が可能になります。 - HTTPSの強制: Digest認証を使用する場合でも、通信経路での盗聴や改ざん、中間者攻撃のリスクを低減するために、常にHTTPS(SSL/TLS)を使用するべきです。
- 代替認証方式の検討: 可能であれば、より現代的で安全な認証方式(例: OAuth 2.0, OpenID Connect, SAMLなど)や、多要素認証(MFA)の導入を検討してください。Basic認証やDigest認証は、レガシーなシステムや特定の内部用途を除き、推奨されなくなっています。
- ツールの定期的な更新: John the Ripperは活発に開発が続けられています。新しいハッシュ形式への対応、パフォーマンスの向上、バグ修正などが行われるため、定期的に最新バージョンに更新することが推奨されます。
- パスワード強度監査の実施: システム管理者は、John the Ripperのようなツールを倫理的に使用して、定期的に自組織のパスワード強度を監査し、弱いパスワードを持つユーザーに警告・教育を行うべきです。
まとめ
htdigest2john
は、ApacheのDigest認証で使用されるhtdigest
ファイルを、強力なパスワードクラッキングツールJohn the Ripperで解析可能な形式に変換するための便利なユーティリティスクリプトです。
この記事では、以下の点について解説しました。
- Apache Digest認証と
htdigest
ファイルの概要 - John the Ripperの基本的な機能と目的
htdigest2john
の役割と入手方法htdigest2john
の基本的な使い方と出力形式- John the Ripperを使用したパスワードクラックの手順とオプション
htdigest
ファイルの形式の詳細- ツール使用上の注意点とセキュリティベストプラクティス
htdigest2john
とJohn the Ripperは、パスワードセキュリティの評価や、正当な目的(自身が管理するシステムの監査やパスワードリカバリなど)において非常に役立つツールです。しかし、その強力さゆえに、悪用されると大きな被害をもたらす可能性もあります。常に法と倫理に従い、責任ある使い方を心がけてください。🛡️
パスワードセキュリティは継続的な取り組みです。定期的な監査、ユーザー教育、そして適切な技術的対策を通じて、システム全体の安全性を高めていきましょう。
参考情報
- John the Ripper 公式サイト: https://www.openwall.com/john/
- Apache HTTP Server ドキュメント (認証・認可): https://httpd.apache.org/docs/current/howto/auth.html
- mod_auth_digest モジュール (Apache): https://httpd.apache.org/docs/current/mod/mod_auth_digest.html
コメント