このブログ記事では、人気のあるパスワードクラッキングツール John the Ripper (JtR) スイートに含まれるユーティリティ mosquitto2john
の使い方について詳しく解説します。MQTTブローカーである Mosquitto のパスワードファイルのセキュリティ強度を評価したいと考えているセキュリティ専門家、ペネトレーションテスター、システム管理者にとって、このツールは非常に役立ちます。
はじめに: Mosquitto と John the Ripper
MQTT と Mosquitto とは? 🤔
MQTT (Message Queuing Telemetry Transport) は、軽量なパブリッシュ/サブスクライブ型メッセージングプロトコルで、特にリソースが限られたデバイスや低帯域幅、高遅延、または信頼性の低いネットワーク環境での使用に適しています。IoT (Internet of Things) デバイス間の通信によく利用されます。
Eclipse Mosquitto は、MQTTプロトコル v5.0, v3.1.1, v3.1 を実装したオープンソースのメッセージブローカーです。軽量でありながら強力な機能を提供し、多くのプロジェクトで採用されています。Mosquittoはユーザー認証機能を提供しており、その一つとしてユーザー名とパスワードに基づいた認証があります。
John the Ripper (JtR) とは? ⚙️
John the Ripper は、非常に有名で強力なオープンソースのパスワードクラッキングツールです。元々はUnix系のパスワードハッシュを検出するために開発されましたが、現在では非常に多くのハッシュ形式(Windows LM/NTLM、Kerberos、各種アプリケーションのパスワードハッシュ、暗号化されたファイルなど)に対応しています。システム管理者が弱いパスワードを発見したり、セキュリティ担当者がパスワード強度を監査したりする目的で広く使用されています。
mosquitto2john とは? 💡
mosquitto2john
は、John the Ripper スイートに含まれるPythonスクリプト(または実行可能ファイル)です。その主な目的は、Mosquittoのパスワードファイルからパスワードハッシュを抽出し、John the Ripperが解析(クラック)できる形式に変換することです。これにより、Mosquittoで使用されているユーザーアカウントのパスワード強度を評価することが可能になります。このツールは、John the Ripper の “jumbo” バージョンに含まれています。
前提条件
mosquitto2john
を使用する前に、以下の準備が必要です。
-
John the Ripper のインストール:
mosquitto2john
は JtR の一部です。JtR (特に “jumbo” バージョン) がシステムにインストールされている必要があります。公式ウェブサイト (https://www.openwall.com/john/) からダウンロードするか、Linuxディストリビューションのパッケージマネージャ (例:sudo apt install john
やbrew install john-jumbo
) を使用してインストールできます。Kali Linuxなどのペネトレーションテスト用ディストリビューションには、デフォルトで含まれていることが多いです。 -
Mosquitto パスワードファイルへのアクセス:
解析対象のMosquittoパスワードファイルが必要です。このファイルのデフォルトの場所は
/etc/mosquitto/passwd
や/etc/mosquitto/pwfile
などですが、Mosquittoの設定ファイル (mosquitto.conf
) のpassword_file
ディレクティブで指定された場所に依存します。このファイルへの読み取りアクセス権が必要です。 - 基本的なコマンドライン操作の知識: ターミナルまたはコマンドプロンプトでの基本的な操作に慣れている必要があります。
Mosquitto パスワードファイルの形式について
mosquitto2john
を効果的に使用するためには、Mosquittoのパスワードファイルがどのような形式で保存されているかを理解することが重要です。
Mosquittoのパスワードファイルは、mosquitto_passwd
ユーティリティを使用して作成・管理されます。各行は通常、以下の形式になっています。
<username>:<password_hash_information>
ここでの <password_hash_information>
は、単なる平文のパスワードではなく、ハッシュ化されたパスワードとその関連情報(ソルト、アルゴリズム、イテレーション回数など)を含みます。
Mosquitto バージョン 2.x 以降では、デフォルトで PBKDF2-SHA512 が使用されます。この形式は、より強力なパスワードハッシュ化を提供します。パスワードファイル内のエントリは、以下のような形式になります。
<username>:$7$<iterations>$<salt_base64>$<derived_key_base64>
$7$
: 使用されているアルゴリズム (PBKDF2-SHA512) を示す識別子。<iterations>
: PBKDF2関数が実行された回数(イテレーションカウント)。<salt_base64>
: パスワードハッシュ化に使用されたソルト(Base64エンコード)。ランダムな12バイトの値が生成されます。<derived_key_base64>
: 最終的に生成されたパスワードハッシュ(Base64エンコード)。
例えば、ユーザー ‘testuser’ のエントリは次のようになります(実際の値は異なります)。
testuser:$7$100000$ABCDEFGHIJKLMNOP$qwertzuiopasdfghjklyxcvbnm1234567890QWER
古いバージョンの Mosquitto (1.6以前) では、SHA512-crypt 形式 (識別子 $6$
) や、単なるSHA512 (mosquitto_passwd
の -H sha512
オプション使用時) が使われることもありました。また、TLSサポートなしでコンパイルされた場合など、非常に古い設定では平文パスワード (username:password
) も可能でしたが、これは非推奨です。
mosquitto2john
は、主に PBKDF2-SHA512 形式 ($7$) を処理するように設計されています。
mosquitto2john の使い方
mosquitto2john
の使用方法は非常にシンプルです。基本的な構文は以下の通りです。
mosquitto2john [options] <mosquitto_password_file> [<mosquitto_password_file2> ...]
基本的な使用例
Mosquittoのパスワードファイル (例: /etc/mosquitto/pwfile
) を指定して実行します。
mosquitto2john /etc/mosquitto/pwfile
または、John the Ripper がインストールされているディレクトリ内のスクリプトとして実行する必要がある場合もあります (パスが通っていない場合)。
/path/to/john/run/mosquitto2john /etc/mosquitto/pwfile
(Kali Linuxなどでは /usr/sbin/mosquitto2john
にあるかもしれません)
出力形式
mosquitto2john
は、指定されたパスワードファイルの内容を読み込み、John the Ripperが理解できる形式に変換して標準出力に表示します。出力形式は通常、以下のようになります。
<username>:$mosquitto$7*<salt_base64>*<iterations>*<derived_key_base64>:<username>::<original_filename>
例:
testuser:$mosquitto$7*ABCDEFGHIJKLMNOP*100000*qwertzuiopasdfghjklyxcvbnm1234567890QWER:testuser::/etc/mosquitto/pwfile
この出力には、John the Ripper がパスワードクラッキングに必要なすべての情報(ユーザー名、ハッシュタイプ識別子 `$mosquitto$7`、ソルト、イテレーション回数、ハッシュ本体)が含まれています。
出力をファイルに保存
通常、mosquitto2john
の出力をファイルにリダイレクトして保存し、そのファイルを John the Ripper に渡します。
mosquitto2john /etc/mosquitto/pwfile > mosquitto_hashes.txt
これで、mosquitto_hashes.txt
というファイルに、John the Ripper 用の形式でハッシュが保存されます。
オプション
mosquitto2john
にはいくつかのオプションがあります。-h
または --help
で確認できます。
mosquitto2john -h
主なオプション:
-hc
,--hashcat
: Hashcat と互換性のある形式でハッシュを出力します。John the Ripper の代わりに Hashcat を使用したい場合に便利です。
# Hashcat 形式で出力
mosquitto2john -hc /etc/mosquitto/pwfile > mosquitto_hashes_hashcat.txt
John the Ripper でハッシュをクラックする
mosquitto2john
でハッシュを抽出してファイル (例: mosquitto_hashes.txt
) に保存したら、John the Ripper を使って実際のパスワードクラッキングを行います。
基本的なクラッキングコマンド
最も基本的なコマンドは、ハッシュファイル名を引数として John the Ripper を実行することです。
john mosquitto_hashes.txt
これにより、John the Ripper はデフォルトのクラッキングモード(シングルクラックモード、辞書モード、インクリメンタルモード)を順番に試行します。
辞書ファイルの使用
特定の辞書ファイル(単語リスト)を使用してクラッキングを行う場合は、--wordlist
オプションを使用します。これは最も一般的なクラッキング方法の一つです。
john --wordlist=/path/to/your/wordlist.txt mosquitto_hashes.txt
/path/to/your/wordlist.txt
は、使用したい辞書ファイルへのパスに置き換えてください。有名な辞書ファイルには rockyou.txt
などがあります (通常 /usr/share/wordlists/
ディレクトリなどにあります)。
ルールの適用
辞書ファイルに含まれる単語を基に、大文字小文字の変換、数字や記号の追加などのルール(マングルール)を適用して、より多くのパスワード候補を試すことができます。--rules
オプションを使用します。
john --wordlist=/path/to/your/wordlist.txt --rules mosquitto_hashes.txt
これにより、辞書の単語だけでなく、それらを変化させた候補も試行されるため、クラック成功率が高まる可能性があります。
インクリメンタルモード
--incremental
オプションを使用すると、John the Ripper は定義された文字セットに基づいて総当たり攻撃(ブルートフォースアタック)を行います。特定のモード(例: Digits
, Alnum
, All
)を指定することも可能です。
john --incremental=Digits mosquitto_hashes.txt
クラックされたパスワードの表示
クラッキングが完了した後、または途中でクラックに成功したパスワードを確認するには、--show
オプションを使用します。
john --show mosquitto_hashes.txt
John the Ripper は、クラックに成功したパスワードを $JOHN/john.pot
(通常は ~/.john/john.pot
または John のインストールディレクトリ内) というファイルに保存します。--show
コマンドはこのファイルを参照して結果を表示します。
testuser:CorrectPassword123:testuser::/etc/mosquitto/pwfile
上記のように、ユーザー名とクラックされたパスワードが表示されます。
セッションの中断と再開
クラッキングは時間がかかることがあります。途中で中断したい場合は、Ctrl+C
を押します。John the Ripper は現在の状態を $JOHN/john.rec
ファイルに保存します。後でクラッキングを再開するには、--restore
オプションを使用します。
john --restore
ユースケースとシナリオ
mosquitto2john
と John the Ripper の組み合わせは、以下のようなシナリオで役立ちます。
- ペネトレーションテスト: 外部または内部からのペネトレーションテストにおいて、Mosquittoブローカーへのアクセス権を取得した場合、パスワードファイルを解析して、弱いパスワードが使用されていないかを確認します。これにより、さらなる権限昇格や情報漏洩のリスクを評価できます。
- セキュリティ監査: 定期的なセキュリティ監査の一環として、Mosquittoユーザーアカウントのパスワード強度をチェックします。組織のパスワードポリシーが遵守されているか、容易に推測可能なパスワードが設定されていないかを確認できます。
- インシデント対応とフォレンジック: システム侵害が発生した場合、攻撃者がMosquittoの認証情報を不正利用した可能性を調査する際に、パスワードファイルのハッシュを解析することがあります(法的な許可と手続きが必要です)。
- パスワードリカバリ (限定的): 自身の管理するMosquittoサーバーで、正当な理由によりパスワードを忘れてしまった場合、最後の手段として試みることが考えられますが、通常はパスワードリセットの方が適切な方法です。
セキュリティに関する考慮事項と対策 🔐
mosquitto2john
や John the Ripper のようなツールは強力ですが、その使用には責任が伴います。また、Mosquitto自体のセキュリティを確保するための対策も重要です。
倫理的な使用
繰り返しになりますが、これらのツールは必ず許可されたシステムに対してのみ使用してください。他人のシステムやアカウントに対して無許可で使用することは、重大な法的・倫理的問題を引き起こします。
パスワードファイルの保護
-
ファイルパーミッション: Mosquittoのパスワードファイル (
password_file
で指定されたファイル) へのアクセス権を厳格に管理してください。通常、Mosquittoを実行するユーザーのみが読み取り可能であるべきです (例:chmod 600 /etc/mosquitto/pwfile
,chown mosquitto:mosquitto /etc/mosquitto/pwfile
)。 - 強力なパスワードの使用: Mosquittoユーザーには、複雑で推測困難なパスワードを設定するように徹底してください。パスワードポリシーを導入し、定期的な変更を促すことも有効です。
- パスワードファイルへのアクセス制限: サーバーへの不正アクセスを防ぐことが、パスワードファイル自体の保護につながります。OSのセキュリティ設定、ファイアウォール、侵入検知システムなどを適切に設定・運用してください。
Mosquitto の認証強化
-
TLS/SSLの利用: MQTT通信を暗号化するために、TLS/SSLを有効にすることを強く推奨します。これにより、通信経路上でのパスワードの盗聴を防ぐことができます。
mosquitto.conf
でcafile
,certfile
,keyfile
を設定します。 -
クライアント証明書認証 (mTLS): パスワード認証に加えて、または代わりに、クライアント証明書を使用した相互TLS認証 (mTLS) を導入することで、より強固な認証が実現できます。
require_certificate true
やuse_identity_as_username true
などの設定を使用します。 - 認証プラグインの利用: Mosquittoは認証プラグインをサポートしています。例えば、mosquitto-auth-plug や Dynamic Security Plugin などを使用すると、データベース (MySQL, PostgreSQL, Redisなど) やLDAP、JWTなど、より柔軟で高度な認証・認可メカニズムを実装できます。これにより、パスワードファイルを直接使用するリスクを低減できます。
-
ACL (Access Control List) の設定:
acl_file
を使用して、認証されたユーザーがどのトピックにアクセス(publish/subscribe)できるかを細かく制御します。これにより、万が一アカウントが侵害された場合の影響範囲を限定できます。
クラッキングの限界
John the Ripper によるパスワードクラックの成功は、元のパスワードの強度、使用された辞書ファイルやルールの質、利用可能な計算リソースに大きく依存します。非常に強力なパスワード(長く、ランダムで、辞書に載っていないもの)は、現実的な時間内にクラックできない可能性が高いです。PBKDF2-SHA512 のように計算コストの高いハッシュ関数と高いイテレーション回数が使用されている場合、ブルートフォース攻撃は非常に時間がかかります。
まとめ
mosquitto2john
は、Mosquitto MQTT ブローカーのパスワードファイルからハッシュ情報を抽出し、John the Ripper で解析可能な形式に変換するための便利なツールです。これにより、セキュリティ専門家やシステム管理者は、Mosquittoユーザーアカウントのパスワード強度を評価し、潜在的な脆弱性を特定することができます。
このツールを使用する際は、常に倫理的な観点と法的要件を遵守し、許可されたシステムに対してのみ実行してください。また、パスワードクラッキングによる評価だけでなく、Mosquittoサーバー自体のセキュリティ設定(TLS/SSLの有効化、強力なパスワードポリシーの適用、認証プラグインの利用、ACLによるアクセス制御など)を強化することが、システム全体の安全性を確保する上で不可欠です。💪
コメント