resticリポジトリのパスワード解析ツール: restic2john の完全ガイド 🔑

セキュリティツール

はじめに: resticとパスワード復旧の重要性

restic は、高速で効率的、かつ安全なバックアップツールとして多くのユーザーに支持されています。Go言語で書かれており、クロスプラットフォームで動作します。データは重複排除され、AES-256暗号化によって保護されるため、セキュリティも非常に高いレベルにあります 🛡️。

resticリポジトリを作成する際には、リポジトリ全体を保護するための強力なパスワードを設定します。このパスワードは、リポジトリ内のデータへのアクセス、バックアップの作成、復元など、すべての操作に不可欠です。しかし、人間は忘れる生き物です。万が一、この重要なパスワードを忘れてしまった場合、通常の方法ではリポジトリ内のデータにアクセスできなくなり、バックアップが役に立たなくなってしまいます。これは非常に深刻な事態です 😱。

このような絶望的な状況で最後の望みとなるのが、パスワードクラッキングツール John the Ripper (JtR) と、その補助ツールである restic2john です。restic2john は、resticリポジトリからJohn the Ripperが解析できる形式のハッシュ情報を抽出する役割を担います。この記事では、restic2john の使い方を基礎から応用まで、詳細に解説していきます。

⚠️ 重要: パスワードクラッキングは、自身が所有権を持つ、またはアクセス許可を得ているリポジトリに対してのみ行ってください。他者のリポジトリに対して無断で試みることは、法律や倫理規定に違反する可能性があります。

restic2john と John the Ripper の準備

John the Ripper の入手とインストール

restic2john は、単体のツールではなく、John the Ripper スイートの一部として提供されています。そのため、まず John the Ripper を入手する必要があります。

主な入手方法は以下の通りです。

  • 公式ウェブサイトまたはGitHubから: 最新版や開発版を利用したい場合は、John the Ripper 公式ウェブサイトGitHubリポジトリ からソースコードをダウンロードまたはクローンし、コンパイルするのが一般的です。
    # 例: GitHubからクローンしてコンパイル
    git clone https://github.com/openwall/john.git john-bleeding-jumbo
    cd john-bleeding-jumbo/src/
    ./configure
    make -s clean && make -sj4
    コンパイル後、実行ファイルは通常 ../run/ ディレクトリ内に生成されます。
  • ディストリビューションのパッケージマネージャから: Linuxディストリビューション(Debian, Ubuntu, Fedora, Arch Linuxなど)やmacOSのHomebrewなどでは、パッケージマネージャを通じてインストールできる場合があります。ただし、バージョンが少し古い可能性がある点に注意が必要です。
    # 例: Debian/Ubuntu
    sudo apt update
    sudo apt install john
    
    # 例: Fedora
    sudo dnf install john
    
    # 例: macOS (Homebrew)
    brew install john

restic2john の場所

John the Ripper をソースからコンパイルした場合、restic2john スクリプト(通常はPythonスクリプト)は、コンパイル後に生成される run ディレクトリ内に配置されています。

cd john-bleeding-jumbo/run/
ls restic2john*

パッケージマネージャでインストールした場合、システムの PATH が通った場所(例: /usr/bin/usr/sbin など)にインストールされるか、John the Ripper の関連ファイルが格納される特定のディレクトリ(例: /usr/share/john//opt/john/run/ など)にある可能性があります。見つからない場合は、find コマンドなどで探してみてください。

# システム全体から探す例
sudo find / -name restic2john 2>/dev/null

restic の仕組みと restic2john の動作原理

restic2john が何をしているかを理解するために、resticリポジトリの基本的な構造と暗号化について少し触れておきましょう。

resticリポジトリは、特定のディレクトリ構造を持っています。リポジトリのルートには、以下のようなファイルやディレクトリが存在します(一部)。

  • config: リポジトリの基本的な設定情報(リポジトリID、暗号化チャンクサイズなど)と、パスワードから派生した鍵を検証するための情報が含まれています。restic2john が主に利用するのがこのファイルです。
  • data/: 暗号化および重複排除されたデータチャンクが格納されます。
  • index/: バックアップされたファイルのメタデータやデータチャンクの場所を示すインデックス情報が格納されます。
  • keys/: リポジトリへのアクセスに使われる暗号鍵(パスワードから生成されるマスターキーで暗号化されている)が格納されます。
  • locks/: 同時アクセスを防ぐためのロックファイルが格納されます。
  • snapshots/: 各バックアップ(スナップショット)のメタデータが格納されます。

resticでは、ユーザーが設定したパスワードから、scrypt という鍵導出関数 (KDF: Key Derivation Function) を用いてマスターキーを生成します。scryptは、意図的に計算コスト(メモリ使用量とCPU時間)を高くすることで、総当たり攻撃や辞書攻撃に対する耐性を高めています。

restic2john は、リポジトリ内の config ファイルを読み取ります。このファイルには、リポジトリIDなどの情報と共に、scryptのパラメータ(N, r, p)やソルト (salt)、そしてパスワードが正しければ導出されるはずの鍵(またはその一部を検証するためのMAC)が含まれています。restic2john はこれらの情報を抽出し、John the Ripper が理解できる特定のフォーマット($restic$ で始まる形式)に整形して出力します。

💡 KDFとハッシュの違い

単純なハッシュ関数(例: SHA-256)は高速に計算できますが、パスワードのような低エントロピーの入力に対しては、高速さが逆に総当たり攻撃を容易にしてしまいます。一方、KDF(例: scrypt, PBKDF2, Argon2)は、ソルトを加えて計算コストを意図的に高くすることで、パスワードからの鍵導出を安全に行い、攻撃を困難にします。

restic2john の基本的な使い方

restic2john の基本的な構文は非常にシンプルです。

# John the Ripper の run ディレクトリから実行する場合
./restic2john /path/to/your/restic/repository

# PATHが通っている場合
restic2john /path/to/your/restic/repository

/path/to/your/restic/repository の部分には、パスワードを忘れてしまったresticリポジトリのルートディレクトリのパスを指定します。

成功すると、標準出力に $restic$ で始まる長い文字列が出力されます。これがJohn the Ripperで解析するためのハッシュ情報です。

# 出力例 (実際の値は異なります)
repository_basename:$restic$0*repository_id*salt*N*r*p*mac

この出力形式は、以下の要素を含んでいます(* は区切り文字)。

  • repository_basename: リポジトリディレクトリのベース名(例: my_backup)。John the Ripper がハッシュの種類を識別しやすくするために付与されることがあります。
  • $restic$: John the Ripper にこれがresticのハッシュであることを示す識別子。
  • 0: ハッシュフォーマットのバージョン(現在のところ 0)。
  • repository_id: リポジトリ固有のID(config ファイルから取得)。
  • salt: scryptで使用されるソルト(16進数表記)。
  • N, r, p: scryptのパラメータ(整数)。
  • mac: パスワードが正しいか検証するためのメッセージ認証コード (MAC) の一部(16進数表記)。

通常、この出力はファイルにリダイレクトして保存し、後でJohn the Ripperに渡します。

./restic2john /path/to/my/secret/backup > restic_hash.txt

これで restic_hash.txt というファイルに、解析用のハッシュ情報が保存されました。🎉

John the Ripper を使ったパスワードクラッキング

restic2john でハッシュ情報を抽出したら、いよいよ John the Ripper の出番です。John the Ripper は非常に多機能なツールであり、様々なモードやオプションがありますが、ここでは基本的な使い方を紹介します。

まず、John the Ripper が restic フォーマットを認識できるか確認しておくと良いでしょう。

# John the Ripper の run ディレクトリから実行する場合
./john --list=formats | grep -i restic

# PATHが通っている場合
john --list=formats | grep -i restic

リストに `restic` が含まれていれば、John the Ripper はこのフォーマットに対応しています。

基本的なクラッキング手順

最も一般的な方法は、辞書ファイル(パスワードに使われそうな単語を集めたリスト)を使った辞書攻撃です。

# John the Ripper の run ディレクトリから実行する場合
./john --wordlist=/path/to/password.lst restic_hash.txt

# PATHが通っている場合
john --wordlist=/path/to/password.lst restic_hash.txt
  • --wordlist=/path/to/password.lst: 使用する辞書ファイルを指定します。password.lst は、John the Ripper に付属している基本的な辞書ファイルや、SecLists のような大規模な公開辞書リスト、あるいは自分で作成したパスワード候補リストのパスに置き換えてください。
  • restic_hash.txt: restic2john で生成したハッシュ情報が含まれるファイル。

John the Ripper は、指定された辞書ファイル内の単語を一つずつ試し、ハッシュ情報と照合します。resticのハッシュはscryptを使用しているため、計算に時間がかかります。パスワードが見つかるまでには、辞書のサイズ、パスワードの複雑さ、そして何よりマシンの計算能力に応じて、数分から数時間、数日、あるいはそれ以上かかる可能性があります ⏳。

💡 高速化のヒント:

  • 強力なCPU、特にコア数が多いCPUを使用する。
  • 可能であれば、GPU (OpenCL や CUDA) を利用したクラッキングを試す (John the Ripper が対応している場合)。
  • 辞書だけでなく、ルール (例: 単語の末尾に数字を追加する、大文字小文字を変換するなど) を組み合わせて試行範囲を広げる (--rules オプション)。
  • インクリメンタルモード (--incremental オプション) を使用して、文字種を指定した総当たり攻撃を試す (非常に時間がかかる可能性があります)。

進捗の確認と結果の表示

クラッキングの実行中に Enter キーなどを押すと、現在の進捗状況(試行したパスワード数、速度など)が表示されます。

パスワードが見つかると、John the Ripper はそれを画面に表示し、john.pot というファイル(通常は John the Ripper の実行ディレクトリかホームディレクトリの .john/ 内に作成される)に記録します。

一度見つかったパスワードを再度表示するには、以下のコマンドを使用します。

# John the Ripper の run ディレクトリから実行する場合
./john --show restic_hash.txt

# PATHが通っている場合
john --show restic_hash.txt

これにより、restic_hash.txt に対応するクラック済みのパスワードが表示されます。

# 表示例
repository_basename:CorrectPassword123

1 password hash cracked, 0 left

これで、忘れてしまったresticリポジトリのパスワードを見つけることができました!🙌 早速このパスワードを使って、リポジトリにアクセスし、必要なデータを復元しましょう。

注意点と考慮事項

restic2john と John the Ripper は強力なツールですが、利用にあたっては以下の点に注意してください。

  • 倫理的・法的側面: 繰り返しになりますが、これらのツールは自身が管理する、または正当なアクセス権を持つデータに対してのみ使用してください。不正アクセスは法的に罰せられる可能性があります。
  • 計算コスト: resticが採用しているscryptは、パスワードクラッキングを困難にするように設計されています。特に、長く複雑なパスワードを使用していた場合、クラッキングには膨大な時間と計算リソースが必要になる可能性があります。成功が保証されるわけではありません。
  • John the Ripper のバージョン: restic フォーマットのサポートは、比較的新しいバージョンの John the Ripper (特に bleeding-jumbo ブランチ) で追加・改善されています。古いバージョンでは動作しない可能性があります。
  • リポジトリの破損: restic2john はリポジトリを読み取るだけですが、操作ミスなどでリポジトリファイルを誤って変更・削除しないよう、作業前にはリポジトリのバックアップを取っておくとより安全です。
  • パスワードの複雑さの重要性: このプロセスを経験すると、強力でユニークなパスワードを設定し、それを安全な方法(パスワードマネージャーなど)で管理することの重要性を改めて認識するでしょう。

🚨 scrypt パラメータの影響: resticリポジトリ作成時の restic init コマンドでは、--tune=lowmem のようなオプションでscryptの計算コストを調整できます(デフォルトは中程度)。もし計算コストが高い設定でリポジトリが初期化されていた場合、restic2john で抽出したハッシュのクラッキングはさらに時間がかかることになります。

まとめ

restic2john は、パスワードを忘れてアクセスできなくなったresticリポジトリから、John the Ripper で解析可能なハッシュ情報を抽出するための重要なツールです。John the Ripper と組み合わせることで、失われたパスワードを回復できる可能性があります。

この記事では、restic2john の役割、John the Ripper の準備、基本的な使い方、そして実際にパスワードクラッキングを行う手順を解説しました。resticの強力な暗号化(特にscrypt KDF)により、クラッキングは容易ではありませんが、適切なツールと知識、そして根気があれば、絶望的な状況を打開できるかもしれません 💪。

最後に、パスワードの適切な管理が最も重要であることを忘れないでください。パスワードマネージャーを活用するなどして、このような事態を未然に防ぐ努力をしましょう。それでも万が一の事態が発生した際には、この記事が助けとなれば幸いです。

コメント

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