signal2john を使って Signal バックアップのパスワードを解析する方法 🕵️‍♂️

セキュリティツール

この記事では、人気の高いパスワード解析ツール「John the Ripper」に含まれるユーティリティスクリプト signal2john の使い方について詳しく解説します。主に、Signal メッセンジャーの暗号化されたローカルバックアップファイルからパスワードハッシュを抽出し、John the Ripper で解析(クラック)する手順を見ていきます。

注意: パスワード解析ツールの使用は、自身が所有するデータや、明示的な許可を得たデータに対してのみ 行ってください。他人のアカウントやデータに不正にアクセスすることは、法律で禁止されており、重大な倫理的問題となります。この記事は教育目的およびパスワードを忘れてしまった場合の回復手段として情報を提供するものであり、不正利用を推奨するものではありません。

Signal とは? 🤔

Signal は、プライバシーを重視したエンドツーエンド暗号化(E2EE)メッセージングアプリです。テキストメッセージ、音声通話、ビデオ通話などを安全に行うことができます。その特徴は、メッセージの内容だけでなく、メタデータも最小限に抑え、ユーザーのプライバシー保護に力を入れている点です。

Signal のローカルバックアップ機能 💾

Signal は、Android 版アプリにおいて、メッセージ履歴をローカル(デバイス上)にバックアップする機能を提供しています。このバックアップは、機種変更時やアプリの再インストール時にメッセージ履歴を復元するために使用されます。

このバックアップ機能はデフォルトでは無効になっており、ユーザーが手動で有効にする必要があります。有効にする際には、30桁のパスフレーズ が生成されます。このパスフレーズはバックアップファイルを暗号化するための鍵であり、復元時に必須となります。非常に重要なので、安全な場所に保管しておく必要があります。 Signal 自身はこのパスフレーズを知らないため、忘れてしまうと Signal 側でリセットしたり回復したりすることはできません。

バックアップファイルは通常、signal-YYYY-MM-DD-HH-MM-SS.backup という形式のファイル名で、指定したフォルダ(デフォルトでは内部ストレージの Signal/Backups)に保存されます。

signal2john とは? 🔧

signal2john は、John the Ripper スイートに含まれる Python スクリプトの一つです。このスクリプトの主な目的は、Signal の暗号化されたローカルバックアップファイル(.backup ファイル)を読み込み、その暗号化に使われているパスフレーズ(30桁の数字)のハッシュ値を抽出することです。

John the Ripper は、さまざまな種類のパスワードハッシュを解析できるツールですが、直接 .backup ファイルを扱うことはできません。signal2john は、この .backup ファイルを John the Ripper が理解できる形式(ハッシュ文字列)に変換する「橋渡し役」となります。

なぜ signal2john が必要なのか? 🤷‍♀️

主な理由は、バックアップ復元に必要な30桁のパスフレーズを忘れてしまった 場合です。前述の通り、Signal はこのパスフレーズを保管しておらず、回復手段を提供していません。もしパスフレーズを紛失し、かつバックアップファイルしか手元にない場合、メッセージ履歴を復元する唯一の方法は、パスフレーズを自力で思い出すか、あるいはパスワード解析ツールを使って見つけ出すことになります。

signal2john と John the Ripper を組み合わせることで、バックアップファイルから抽出したハッシュに対して、考えられるパスフレーズの組み合わせを試行し、元の30桁のパスフレーズを発見できる可能性があります。

ただし、これは計算能力と時間を要するプロセスであり、成功が保証されるわけではありません。特に、パスフレーズがランダムで複雑な場合(Signal が生成するものはこれに該当します)、解析は非常に困難になります。

signal2john を使用して Signal バックアップパスワードの解析を行うには、以下のものが必要です。

  • John the Ripper: パスワード解析ツール本体です。「Jumbo」バージョンを使用することを強く推奨します。Jumbo バージョンは、より多くのハッシュ形式や機能に対応しており、signal2john.py などの多くの *2john スクリプトが含まれています。
  • Python: signal2john.py は Python スクリプトであるため、Python の実行環境が必要です。通常、Python 3 が推奨されます。多くの Linux システムにはプリインストールされています。
  • Signal バックアップファイル (.backup): 解析対象となる、暗号化された Signal のバックアップファイルです。Android デバイスから PC など、John the Ripper を実行する環境にコピーしておく必要があります。ファイル名は通常 signal-YYYY-MM-DD-HH-MM-SS.backup のようになります。
  • (推奨)パスワードリスト(辞書ファイル): John the Ripper がパスワードを試行するための単語リストです。一般的な単語、過去に漏洩したパスワードのリストなどがあります。有名なものに rockyou.txt などがあります。

signal2john.py の場所

signal2john.py は、通常 John the Ripper (Jumbo) のソースコードやインストールディレクトリに含まれています。

  • ソースからコンパイルした場合: JohnTheRipper/run/ ディレクトリ内にあることが多いです。
  • パッケージマネージャでインストールした場合: システムによって異なりますが、/usr/share/john//usr/lib/john/ などのディレクトリ内にある可能性があります。find /usr -name signal2john.pylocate signal2john.py コマンドで探すことができます。

もし見つからない場合は、John the Ripper (Jumbo) の GitHub リポジトリから直接ダウンロードすることも可能です。

# 例: John the Ripper の run ディレクトリに移動
cd /path/to/JohnTheRipper/run

signal2john.py の使い方は非常にシンプルです。Python インタープリタを使ってスクリプトを実行し、引数として Signal のバックアップファイルへのパスを指定します。

基本的なコマンド構文

python /path/to/signal2john.py /path/to/your/signal-YYYY-MM-DD-HH-MM-SS.backup

または、John the Ripper の run ディレクトリにいる場合は、相対パスで指定できます。

./signal2john.py ../path/to/your/signal-YYYY-MM-DD-HH-MM-SS.backup

実行例と出力

例えば、my_signal_backup.backup という名前のバックアップファイルがあるとします。これを signal2john.py で処理すると、以下のような形式の出力が得られます。

$ python ./signal2john.py my_signal_backup.backup
my_signal_backup.backup:$signal$*<バージョン情報など>*<salt>*<iv>*<iterations>*<暗号化されたデータの一部>

この出力全体が、John the Ripper が解析に使用する「ハッシュ文字列」です。重要なのは、ファイル名(my_signal_backup.backup:)も含めて、この行全体をコピーまたはリダイレクトして保存することです。

このハッシュ文字列には、パスワードの検証に必要な情報(ソルト、初期化ベクトル (IV)、反復回数、暗号化されたデータの一部など)が含まれています。

  • $signal$: John the Ripper がハッシュの種類を識別するためのプレフィックスです。
  • <バージョン情報など>: バックアップファイルのバージョンや関連情報が含まれることがあります。
  • <salt>: パスワードハッシュに用いられるソルト(ランダムなデータ)。
  • <iv>: 暗号化に使用される初期化ベクトル。
  • <iterations>: パスワードから鍵を導出する際の反復回数 (PBKDF2)。
  • <暗号化されたデータの一部>: パスワードが正しいか検証するために使用されるデータ。

ハッシュをファイルに保存

John the Ripper で解析を行うために、このハッシュ文字列をテキストファイルに保存します。リダイレクトを使うと便利です。

python /path/to/signal2john.py /path/to/your/signal-backup.backup > signal_hash.txt

これで、signal_hash.txt というファイルに、John the Ripper が読み込める形式でハッシュが保存されました。

💡 ヒント: もし複数のバックアップファイルがある場合は、それぞれに対して signal2john.py を実行し、出力を同じファイルに追加していくことも可能です。

python ./signal2john.py backup1.backup > signal_hashes.txt
python ./signal2john.py backup2.backup >> signal_hashes.txt

signal2john.py でハッシュを抽出しファイルに保存したら、いよいよ John the Ripper を使ってパスフレーズの解析(クラッキング)を行います。

基本的な解析コマンド

最も基本的な使い方は、John the Ripper の実行ファイル (john) に、先ほど作成したハッシュファイル (signal_hash.txt) を指定することです。

john /path/to/signal_hash.txt

John the Ripper の run ディレクトリにいる場合は、

./john ../path/to/signal_hash.txt

これを実行すると、John the Ripper はデフォルトのモード(通常はシングルクラックモード、次に辞書モード、インクリメンタルモードの順)で解析を開始します。

解析モードの指定

より効率的に解析を行うために、モードやオプションを指定することが一般的です。

1. 辞書攻撃モード (Wordlist Mode)

特定の単語リスト(辞書ファイル)を使ってパスフレーズを試行します。Signal のパスフレーズは30桁の数字なので、通常の単語リストは効果が薄いかもしれませんが、数字のみで構成されたリストや、特定のパターンに基づいたリストがあれば有効です。

john --wordlist=/path/to/wordlist.txt signal_hash.txt

rockyou.txt のような有名な辞書ファイルや、数字のみを含むカスタムリストを指定できます。

2. インクリメンタルモード (Incremental Mode)

指定された文字セット(例: 数字のみ、英小文字のみなど)の組み合わせを総当たりで試行します。Signal のパスフレーズは30桁の数字であるため、数字のみを指定するのが最も適切です。

john --incremental=Digits signal_hash.txt

--incremental=Digits は、数字 (0-9) のみの組み合わせを試すモードです。しかし、30桁の数字の組み合わせは天文学的な数 (1030) になり、総当たりで解析するのは現実的に不可能です。

3. マスクモード (Mask Mode)

パスフレーズのパターン(マスク)を指定して試行します。Signal のパスフレーズは30桁の数字なので、以下のように指定できます。

john --mask='?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d' signal_hash.txt

ここで ?d は数字1桁を表します。これを30回繰り返しています。これもインクリメンタルモードと同様、全組み合わせを試すのは現実的ではありません。

解析の現実性について ⏳

Signal が生成する30桁のランダムな数字のパスフレーズは、現在の一般的な計算能力では、総当たり攻撃(インクリメンタルモードやマスクモード)で解析することは事実上不可能です。

成功する可能性があるシナリオとしては、以下のような場合が考えられます。

  • 何らかの理由で、非常に単純な(推測可能な)パスフレーズが使われていた場合(通常、Signal ではありえません)。
  • パスフレーズの一部を覚えており、マスクモードで不明な部分だけを探索する場合(それでも桁数が多いと困難です)。
  • 将来的に、計算能力が飛躍的に向上するか、暗号アルゴリズムに脆弱性が発見された場合。

したがって、signal2john と John the Ripper を使っても、忘れてしまったランダムな30桁のパスフレーズを回復できる可能性は極めて低い、ということを理解しておく必要があります。

解析結果の表示

もし運良くパスフレーズが解析できた場合、John the Ripper はその結果を表示します。後で解析済みのパスフレーズを確認するには、--show オプションを使用します。

john --show signal_hash.txt

出力例:

my_signal_backup.backup:123456789012345678901234567890

1 password hash cracked, 0 left

この例では、my_signal_backup.backup ファイルのパスフレーズが 123456789012345678901234567890 であることが示されています。

セッションの管理

解析には時間がかかる場合があるため、途中で中断・再開することが可能です。John the Ripper はデフォルトでセッション情報を john.rec ファイルに保存します。

  • 中断: Ctrl + C を押します。
  • 再開: 再度同じコマンドを実行するか、--restore オプションを使用します。
    john --restore
  • ステータス確認: 解析中に Enter キーを押すか、別のターミナルから以下のコマンドを実行します。
    john --status
  • 法的・倫理的な問題: 繰り返しになりますが、パスワード解析ツールの使用は、自分自身のデータや正当なアクセス権を持つデータに対してのみ許可されます。他者の Signal バックアップやアカウントに対してこれらのツールを使用することは違法であり、重大なプライバシー侵害となります。
  • 解析の困難性: Signal の30桁のランダムな数字パスフレーズは非常に強力です。総当たり攻撃による解析は現実的に不可能です。パスフレーズを忘れた場合、回復できる可能性は極めて低いことを覚悟してください。
  • PIN との違い: Signal には「PIN」という別のセキュリティ機能もあります。これはアカウント回復(プロフィール、設定、連絡先など)に使われるもので、バックアップパスフレーズとは異なります。PIN は通常4桁以上の数字または英数字で、バックアップパスフレーズ(30桁の数字)とは役割も形式も異なります。signal2john はバックアップパスフレーズの解析用であり、PIN の解析には直接関係しません。
  • 計算リソース: パスワード解析は CPU (または GPU) リソースを大量に消費します。高性能なハードウェアを使用しても、複雑なパスワードの解析には膨大な時間がかかることがあります。
  • 代替手段の検討: パスフレーズを忘れた場合、解析を試みる前に、パスフレーズを記録したメモやパスワードマネージャーなどを再度確認することをお勧めします。Signal の公式サポートでは、パスフレーズを忘れた場合の回復手段は提供されていませんが、新しいバックアップを作成して新しいパスフレーズを設定することは可能です(ただし、古いバックアップのデータは失われます)。
  • ツールのアップデート: John the Ripper や signal2john.py は継続的に開発されています。最新バージョンを使用することで、バグ修正やパフォーマンス改善、新しいアルゴリズムへの対応などの恩恵を受けられる可能性があります。定期的に John the Ripper Jumbo の GitHub リポジトリなどを確認すると良いでしょう。

signal2john.py は、Signal の暗号化されたローカルバックアップファイルからパスワードハッシュを抽出し、John the Ripper で解析可能な形式に変換するための便利なツールです。

このツールは主に、自身が設定した Signal のバックアップパスフレーズ(30桁の数字)を忘れてしまい、バックアップファイルからのデータ復元が必要になった場合に役立つ可能性があります。

しかし、Signal が生成するパスフレーズはそのランダム性と長さから非常に強力であり、John the Ripper を用いても解析に成功する可能性は極めて低いのが現状です。パスワード解析ツールの使用は、技術的な知識と計算リソース、そして何よりも倫理的な配慮と法的遵守が求められます。

パスフレーズを忘れないように、生成された際には必ず安全な方法で記録・保管しておくことが最も重要です。🔒

コメント

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