htdigest2johnの使い方:ApacheのhtdigestファイルをJohn the Ripperで解析する

セキュリティツール

このブログ記事では、強力なパスワードクラッキングツールである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ハッシュを計算してファイルに保存します。

注意点

Digest認証はBasic認証よりは安全ですが、現代の標準から見ると万全ではありません。MD5ハッシュ自体に脆弱性があること、中間者攻撃によってBasic認証にダウングレードさせられる可能性があることなどが指摘されています。現在では、認証が必要な場合はHTTPS(SSL/TLS)で通信全体を暗号化し、Basic認証を使用する方が、サーバー側のパスワード保管方法を含めて総合的に安全であると考えられています。

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の入手方法はいくつかあります。

  1. 公式サイトからのダウンロード:
    OpenwallのJohn the Ripper公式サイトから、ソースコードまたはコンパイル済みのバイナリ(対応プラットフォームがあれば)をダウンロードできます。「Jumbo」バージョンは、コミュニティによってメンテナンスされており、より多くのハッシュ形式や機能が含まれています。通常はこちらの利用が推奨されます。ソースコードからコンパイルする場合は、サイトの指示に従ってください。
  2. パッケージマネージャの使用 (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)がプリインストールされています。

  3. 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は、パスワードセキュリティの評価や、正当な目的(自身が管理するシステムの監査やパスワードリカバリなど)において非常に役立つツールです。しかし、その強力さゆえに、悪用されると大きな被害をもたらす可能性もあります。常に法と倫理に従い、責任ある使い方を心がけてください。🛡️

パスワードセキュリティは継続的な取り組みです。定期的な監査、ユーザー教育、そして適切な技術的対策を通じて、システム全体の安全性を高めていきましょう。

参考情報

コメント

タイトルとURLをコピーしました