neo2john: NEOウォレットのパスワード解析をJohn the Ripperで実行する方法

セキュリティツール

はじめに 🤔

NEOブロックチェーンのウォレットを使っている皆さん、パスワードを忘れてしまった経験はありませんか? 😱 あるいは、セキュリティ監査の一環として、ウォレットのパスワード強度をテストする必要があるかもしれません。そんな時に役立つのが、パスワード解析ツール「John the Ripper」とその補助スクリプト「neo2john」です。

John the Ripper(通称John)は、非常に強力で広く使われているオープンソースのパスワードクラッキングツールです。様々な種類のハッシュ化されたパスワードを解析できますが、そのままでは特定のアプリケーションのファイル形式を直接扱えません。

そこで登場するのが「*2john」と呼ばれる一連のユーティリティスクリプト群です。これらは、特定のファイル形式(例えば、ZIPファイル、PDFファイル、そして今回の主役であるNEOウォレットファイル)から、John the Ripperが理解できる形式のハッシュ情報を抽出する役割を担います。

neo2johnは、その名の通り、NEOブロックチェーンのウォレットファイル(通常は.db3という拡張子を持つSQLiteデータベースファイル)からパスワードハッシュを抽出するために特別に設計されたPythonスクリプトです。このスクリプトを使うことで、John the Ripperを用いたNEOウォレットのパスワード解析が可能になります。🔑

このブログ記事では、neo2johnの基本的な使い方から、John the Ripperと連携して実際にパスワード解析を行う手順までを、初心者にも分かりやすく解説していきます。この記事を読めば、万が一パスワードを忘れてしまった場合や、セキュリティテストを行う際に、neo2johnとJohn the Ripperを効果的に活用できるようになるでしょう。

⚠️ 注意点

パスワード解析ツールは、正当な目的(自身が所有するウォレットのパスワード回復、許可を得た上でのセキュリティ監査など)にのみ使用してください。他人のウォレットに対して不正にアクセスを試みることは、法律で禁止されており、重大な犯罪となります。ツールの使用は自己責任で行ってください。

また、NEOウォレットのパスワードを忘れてしまった場合、最も安全で推奨される方法は、ウォレット作成時にバックアップした秘密鍵(Private Key)ニーモニックフレーズ(Secret Recovery Phrase)を使ってウォレットを復元することです。neo2johnとJohn the Ripperによるパスワード解析は、これらのバックアップ手段がない場合の最終手段と考えるべきです。

前提条件と準備 🛠️

neo2johnとJohn the Ripperを使ってNEOウォレットのパスワード解析を行うには、いくつかの準備が必要です。

まず、John the Ripper本体が必要です。多くのLinuxディストリビューションでは、パッケージマネージャーを通じてインストールできますが、neo2johnのような比較的新しいツールや、特定のハッシュ形式に対応するためには、最新の “Jumbo” バージョンをソースコードからコンパイルしてインストールすることが推奨されます。”Jumbo” バージョンは、標準版よりも多くのハッシュ形式や機能、そして*2johnユーティリティを含んでいます。

ソースコードからのコンパイル手順(Linux/macOSの場合):

  1. 必要な開発ツールのインストール: コンパイルにはgit, gcc (またはclang), make, libssl-dev (Debian/Ubuntu) や openssl-devel (Fedora/CentOS) などが必要です。お使いのOSに合わせてインストールしてください。
    # Debian/Ubuntuの場合
    sudo apt-get update
    sudo apt-get install -y git build-essential libssl-dev
    
    # Fedora/CentOSの場合
    sudo dnf update
    sudo dnf install -y git gcc make openssl-devel
  2. John the Ripper (Jumbo) のソースコードを取得: GitHubから最新版をクローンします。
    git clone https://github.com/openwall/john.git john-jumbo
    cd john-jumbo/src
  3. コンパイル: srcディレクトリ内でmakeコマンドを実行します。システムに合わせた最適化オプションが自動で選択されることが多いですが、特定のシステムを指定することも可能です。
    ./configure && make -s clean && make -sj4
    (-sj4の部分はCPUコア数に合わせて調整してください)
  4. 確認: コンパイルが成功すると、../run/ディレクトリに実行ファイルjohnが生成されます。
    cd ../run
    ./john --test
    テストが正常に完了すればインストール成功です。通常、システム全体へのインストールは不要で、このrunディレクトリから直接johnや関連ツールを実行します。

ヒント Kali Linuxなどのペネトレーションテスト用ディストリビューションには、John the Ripper (Jumbo) がプリインストールされていることが多いですが、最新機能を利用するためにソースからビルドすることをお勧めします。

neo2johnはPythonスクリプトです。通常、現代的なLinuxやmacOSにはPythonがプリインストールされていますが、念のため確認してください。Python 3が推奨されます。

python3 --version

パスワードを解析したいNEOウォレットのファイルが必要です。これは通常、.db3という拡張子を持つSQLiteデータベースファイルです。例えば、NEON Walletなどのデスクトップウォレットを使用している場合、そのデータディレクトリ内に保存されています。場所がわからない場合は、各ウォレットのドキュメントを参照してください。

重要: 解析を行う前に、必ずウォレットファイルのバックアップを取ってください!万が一、ファイルが破損した場合でも元に戻せるようにしておくことが重要です。

John the Ripper (Jumbo) をソースからコンパイルした場合、neo2john.pyスクリプトは通常、john-jumbo/run/ディレクトリ(実行ファイルと同じ場所)か、あるいはjohn-jumbo/src/tools/ディレクトリ内にあります。Kali Linuxなどのパッケージでインストールした場合、/usr/share/john//usr/lib/john/などのパスにあることもあります。

見つからない場合は、John the Ripperのインストールディレクトリ内で検索してみてください。

# John the Ripperをソースからコンパイルした場合 (例: ~/john-jumbo にクローン)
find ~/john-jumbo -name neo2john.py

# システムにインストールされている場合 (例)
find /usr -name neo2john.py 2>/dev/null

これ以降の説明では、neo2john.pyがJohn the Ripperのrunディレクトリにあるものとして進めます。必要に応じてパスを読み替えてください。

neo2johnの使い方: ハッシュの抽出 🔍

準備が整ったら、いよいよneo2johnを使ってNEOウォレットファイルからパスワードハッシュを抽出します。操作は非常にシンプルです。

John the Ripperのrunディレクトリに移動し、以下のコマンドを実行します。

cd /path/to/john-jumbo/run  # John the Ripperのrunディレクトリへのパスに置き換えてください

python3 neo2john.py /path/to/your/wallet.db3 > neo_hash.txt

コマンドの各部分を解説します。

  • python3: Python 3インタープリタを使用してスクリプトを実行します。環境によっては単にpythonの場合もあります。
  • neo2john.py: 実行するスクリプトファイルです。もしrunディレクトリにない場合は、スクリプトへのフルパスを指定してください (例: ../src/tools/neo2john.py)。
  • /path/to/your/wallet.db3: 解析対象のNEOウォレットファイルのパスを指定します。実際のファイルパスに置き換えてください。
  • > neo_hash.txt: スクリプトの標準出力をneo_hash.txtという名前のファイルにリダイレクト(保存)します。このファイルにJohn the Ripperが解析できる形式のハッシュが書き込まれます。ファイル名は任意ですが、分かりやすい名前を付けると良いでしょう。

コマンドが正常に実行されると、ターミナルには何も表示されませんが、カレントディレクトリ(この例ではrunディレクトリ)にneo_hash.txtファイルが作成されているはずです。

catコマンドなどで中身を確認してみましょう。

cat neo_hash.txt

以下のような形式の文字列が出力されているはずです(実際のハッシュ値は異なります)。

wallet.db3:$neo$*3*b7a8e1f2d3c4a5b6e7f8d9c0a1b2e3f4*a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2

💡 neo2johnの出力形式について

neo2johnが出力するハッシュ文字列は、John the RipperがNEOウォレットのハッシュであることを認識し、正しく処理できるように特定のフォーマットに従っています。
  • wallet.db3: 元のファイル名(あるいはJohnが認識するためのユーザー名のようなもの)。これは通常、実際のユーザー名とは関係ありません。
  • :: 各フィールドの区切り文字です。
  • $neo$: このハッシュがNEOウォレットのものであることを示す識別子(プレフィックス)です。
  • *3*: NEOウォレットのハッシュタイプを示します。この場合、タイプ3(SHA256を3回繰り返す)であることを示唆しています(注: 実際のアルゴリズムの詳細はソースコード確認が必要ですが、Johnはこの識別子で判断します)。
  • b7a8e1f2d3c4a5b6e7f8d9c0a1b2e3f4: これは「IV(Initialization Vector)」と呼ばれる、暗号化プロセスで使用される値の一部です。NEOウォレットではパスワードハッシュ生成に関連して使われます。16進数で表現されています。
  • *: フィールド区切り文字。
  • a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2: これが実際にパスワードから生成されたハッシュ値(MasterKeyをパスワードで暗号化したもの)です。これも16進数で表現されています。
John the Ripperは、この$neo$*3*...という形式を見て、内部的にneoフォーマット(または互換性のあるフォーマット)を選択し、IVとハッシュ値を使ってパスワードの候補を検証します。

歴史的経緯: 初期の情報では、NEOウォレットのパスワードハッシュはSHA256を3回繰り返すもので、ソルト(salt)がないとされていました。これは当時のパスワードハッシュとしては比較的単純で、高速な解析が可能でした。現在のウォレット実装で変更がないかは注意が必要です。

もしneo2john.pyの実行時にエラーが発生した場合は、以下の点を確認してください。

  • Pythonのバージョンが適切か (Python 3推奨)。
  • NEOウォレットファイルのパスが正しいか、また読み取り権限があるか。
  • ウォレットファイルが破損していないか。
  • John the Ripper (Jumbo) が正しくコンパイルされているか(依存ライブラリが不足していないか)。

John the Ripperによるパスワード解析 🚀

neo2johnによってハッシュファイル (neo_hash.txt) が作成できたら、いよいよJohn the Ripperを使ってパスワードの解析(クラッキング)を開始します。

John the Ripperにはいくつかの解析モードがありますが、ここでは代表的なものを紹介します。

最も簡単な方法は、John the Ripperにハッシュファイルを渡すだけで、内部的に定義された順序(Single Crack -> Wordlist -> Incremental)で自動的に解析モードを実行させる方法です。

./john neo_hash.txt

Johnはまず「Single Crack」モードを試します。これは、ハッシュファイルに含まれるユーザー名(この場合はファイル名wallet.db3)やGECOS情報(もしあれば)を基に、よくある変形パターン(大文字小文字変換、数字の追加など)を試す高速なモードです。NEOウォレットのハッシュ形式ではユーザー名情報が直接パスワードに使われることは考えにくいため、効果は限定的かもしれません。

次に「Wordlist」モードが試されます。これは、指定された辞書ファイル(デフォルトではpassword.lst)に含まれる単語をパスワード候補として試すモードです。ルール(john.confで定義)を適用して、単語を変化させる(例: password -> Password123)ことも行われます。

最後に「Incremental」モードが試されます。これは、定義された文字セット(例: すべての小文字アルファベット、数字、記号など)を使って、可能なすべての組み合わせを総当たりで試すモードです。非常に時間がかかりますが、理論上はどんなパスワードでも見つけられる可能性があります(ただし現実的な時間内に終わるとは限りません)。

解析が進行すると、定期的にステータスが表示されたり、[Press key for status] と表示された場合は何かキーを押すと現在の状況(試行速度、経過時間、現在の候補など)が表示されます。

パスワードが見つかると、ターミナルに表示され、同時にjohn.pot(デフォルトのポットファイル)に記録されます。

Loaded 1 password hash (neo, NEO $neo$*3* [SHA256 128/128 SSE2 4x])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
examplepassword  (wallet.db3)
1g 0:00:00:05 DONE (2025-03-31 12:42) 0.1851g/s (12345.6p/s) 12345.6c/s 12345.6C/s example..guess
Session completed

上記の例では、examplepassword が見つかったパスワードとして表示されています。

特定の辞書ファイルを使って効率的に解析したい場合は、Wordlistモードを明示的に指定します。強力なパスワード辞書(例: RockYouリストなど)を用意すると、成功率が上がることがあります。

./john --wordlist=/path/to/your/dictionary.txt --rules neo_hash.txt
  • --wordlist=/path/to/your/dictionary.txt: 使用する辞書ファイルのパスを指定します。password.lstrockyou.txtなどがよく使われます。
  • --rules: 辞書内の単語にルール(大文字小文字変換、数字や記号の追加・置換など)を適用して、より多くの候補を生成します。これにより、単純な単語だけでなく、Password!secret123 のようなパスワードも見つけやすくなります。ルールセットはjohn.confでカスタマイズ可能です。

おすすめ 辞書攻撃は、比較的短い時間で一般的なパスワードを見つけるのに効果的な方法です。強力な辞書リストを用意することが鍵となります。

辞書攻撃でも見つからない複雑なパスワードの場合、Incrementalモード(総当たり攻撃)を試すことができます。ただし、非常に時間がかかることを覚悟してください。

./john --incremental neo_hash.txt

特定の文字セットを指定することも可能です。例えば、小文字アルファベットのみを試す場合は以下のようにします。

./john --incremental=Lower neo_hash.txt

利用可能な文字セット(モード)はjohn.confファイルで定義されています(例: Alpha, Lower, Upper, Digits, Alnum, Allなど)。

注意: Incrementalモードは、パスワードの長さが長くなるほど、あるいは使用される文字種が増えるほど、完了までの時間が指数関数的に増加します。数文字程度の短いパスワードなら現実的な時間で見つかる可能性もありますが、8文字以上の複雑なパスワードの場合、数日、数週間、あるいはそれ以上かかることも珍しくありません。

John the Ripperは通常、ハッシュファイルの形式から自動的にフォーマット(neo)を検出しますが、明示的に指定することもできます。これは、他の形式と誤認される場合や、特定の最適化(OpenCLなど)を使いたい場合に役立ちます。

./john --format=neo neo_hash.txt

もし、GPU (OpenCL) を使って解析を高速化したい場合は、対応するフォーマット(通常neo-openclのような名前)が利用可能か確認し、指定します。

# 利用可能なフォーマットを確認
./john --list=formats | grep -i neo

# OpenCLフォーマットを指定して実行 (例)
./john --format=neo-opencl --wordlist=password.lst neo_hash.txt

💡 GPU活用 GPUを使用すると、特に総当たり攻撃や大規模な辞書攻撃において、CPUのみの場合と比較して大幅な速度向上が期待できます。ただし、適切なドライバとJohn the RipperのOpenCL対応ビルドが必要です。

  • 解析結果の表示: 解析が完了した後や、途中で見つかったパスワードを確認するには、--showオプションを使います。
    ./john --show neo_hash.txt
    これにより、john.potファイルに記録された、neo_hash.txtに対応するクラック済みのパスワードが表示されます。
    wallet.db3:examplepassword
    
    1 password hash cracked, 0 left
  • 中断: 解析中にCtrl+Cを押すと、現在の状態を保存してセッションを中断できます(通常john.recファイルに保存されます)。再度Ctrl+Cを押すと保存せずに強制終了します。
  • 再開: 中断したセッションを再開するには、--restoreオプションを使用します。
    ./john --restore
    中断した時点から解析を再開します。

ヒントとトラブルシューティング💡🔧

  • 強力な辞書を使う: rockyou.txtのような大規模で実績のある辞書リストを使用しましょう。また、ターゲットに関連する可能性のある単語(名前、誕生日、趣味、関連サービス名など)を含むカスタム辞書を作成するのも効果的です。
  • ルールを活用する: 単純な辞書攻撃だけでなく、--rulesオプションを使って単語を変化させることで、より多くのパスワードパターンをカバーできます。John the Ripperには強力なルールセットが同梱されています。
  • マスク攻撃を試す: もしパスワードの一部(例えば、最初が特定の単語で、最後に数字が4つ付くなど)を覚えている場合は、--maskオプションを使ったマスク攻撃が非常に効果的です。
    # 例: "Password"で始まり、その後に数字が4つ続くパスワードを試す
    ./john --mask='Password?d?d?d?d' neo_hash.txt
    (?dは数字を表すプレースホルダーです。詳細はJohnのドキュメントを参照してください。)
  • GPUを活用する: 可能であれば、OpenCL対応のフォーマットとGPUを使用して解析速度を向上させましょう。
  • 時間をかける: 複雑なパスワードの解析には時間がかかります。特にIncrementalモードは根気が必要です。可能であれば、複数のマシンで分散して解析を行うことも検討できます(JohnのMPI対応など)。
  • エラー: “No password hashes loaded”
    • 原因: John the Ripperがハッシュファイル (neo_hash.txt) 内に解析可能な形式のハッシュを見つけられなかった。
    • 対処法:
      • neo2john.pyが正しく実行され、ファイルに有効なハッシュ文字列が出力されているか確認する (cat neo_hash.txt)。
      • John the RipperがNEOフォーマットをサポートしているか確認する (./john --list=formats | grep -i neo)。Jumboバージョンを使用していることを確認してください。
      • ハッシュファイルが空でないか、または予期せぬ文字が含まれていないか確認する。
      • 場合によっては、--format=neoオプションを明示的に指定してみる。
  • エラー: neo2john.py実行時のPythonエラー
    • 原因: Pythonのバージョンが古い、必要なライブラリがない、スクリプト自体の問題など。
    • 対処法:
      • Python 3を使用しているか確認し、必要であればpython3 neo2john.py ...のように実行する。
      • John the Ripperの最新版を再度取得・コンパイルしてみる。
      • エラーメッセージをよく読み、不足しているライブラリなどがあればインストールする(通常、neo2johnは標準ライブラリ以外に特別な依存関係はないはずですが)。
  • 解析が非常に遅い
    • 原因: パスワードが複雑、CPU/GPUの性能が低い、選択したモード(特にIncremental)が時間のかかるものなど。
    • 対処法:
      • より効率的なモード(Wordlist + Rules, Mask)を試す。
      • 可能であればGPU (OpenCL) を使用する。
      • より高性能なマシンを使用する。
      • 解析にかける時間を長く取る。
  • パスワードが見つからない
    • 原因: パスワードが非常に複雑で強力、使用した辞書やルールが不十分、解析時間が足りないなど。
    • 対処法:
      • より大規模な辞書や、より複雑なルールを試す。
      • Incrementalモードで、より長い時間解析を実行する。
      • マスク攻撃など、思い当たるパターンがあれば試す。
      • 残念ながら、非常に強力なパスワードは、現実的な時間内に解析できない可能性が高いです。その場合は、秘密鍵やリカバリーフレーズによる復元が唯一の方法となります。

セキュリティに関する考察とまとめ 🔐

neo2johnとJohn the Ripperのようなツールは、忘れたパスワードを回復する手段を提供してくれる一方で、悪意のある攻撃者が脆弱なパスワードで保護されたウォレットを侵害するためにも利用され得ることを示しています。

この事実は、私たち自身のデジタル資産を守るために、以下の基本的なセキュリティ対策がいかに重要であるかを改めて教えてくれます。

  • 🔑 強力でユニークなパスワードの使用:
    • 長く(最低12文字以上、できれば16文字以上)、大文字、小文字、数字、記号を組み合わせた複雑なパスワードを設定しましょう。
    • 他のサービスと同じパスワードを使い回さないでください。
    • パスワードマネージャーを使用して、複雑でユニークなパスワードを生成・管理することを強く推奨します。
  • 📝 秘密鍵とリカバリーフレーズの厳重な保管:
    • ウォレット作成時に表示される秘密鍵(Private Key)やニーモニックフレーズ(Secret Recovery Phrase)は、パスワード以上に重要です。これらがあれば、パスワードなしでウォレットを完全に復元できてしまいます。
    • これらは絶対にデジタル形式(PCのファイル、メール、クラウドストレージなど)で保存せず、紙に書き写すなどしてオフラインで、かつ安全な場所(耐火金庫など)に保管してください。
    • 複数の場所に分けて保管することも検討しましょう。
    • 他人には絶対に教えないでください。
  • 🛡️ ウォレットソフトウェアの更新:
    • 使用しているウォレットソフトウェア(NEON Walletなど)は、常に最新の状態に保ちましょう。アップデートにはセキュリティ修正が含まれていることがあります。
  • 🎣 フィッシング詐欺への注意:
    • 秘密鍵やパスワードを尋ねるメールやウェブサイトは詐欺です。公式サイト以外からのソフトウェアダウンロードやリンククリックは避けましょう。

neo2johnは、NEOウォレットファイルからJohn the Ripperが解析可能なハッシュを抽出するための便利なツールです。John the Ripperと組み合わせることで、忘れてしまったパスワードの回復を試みたり、セキュリティ監査の一環としてパスワード強度を評価したりすることが可能になります。

基本的な使い方は、python3 neo2john.py wallet.db3 > hash.txt でハッシュを抽出し、./john hash.txt で解析を開始するという流れです。WordlistモードやIncrementalモード、GPUの活用など、状況に応じて適切な手法を選択することが重要です。

しかし、最も重要なのは、このようなツールに頼らざるを得ない状況を避けることです。強力なパスワードを設定し、そして何よりも秘密鍵とリカバリーフレーズを安全にバックアップ・保管することが、あなたのNEO資産を守るための最善の方法です。👍

このガイドが、neo2johnとJohn the Ripperの理解と適切な利用、そしてデジタル資産のセキュリティ意識向上に役立つことを願っています。

コメント

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