環境構築

メインディッシュは hashcat です.

Pythonも入れておきましょう

事前準備

人からウォレットファイルを奪って総当りするのは良くないと思うので,自分で適当なパスワードつきウォレットを作っておきます.

パスワードは4桁と解析しやすいようにしておきました.

Windows環境でElectrumを導入しているならば, C:\Users\ユーザー名\AppData\Roaming\Electrum\wallets にウォレットファイルが入っているので,デスクトップなど適当なフォルダにコピーしておきます.

hashcatで解析できるようにする

ElectrumのウォレットファイルをJohnripper形式に変換する pythonスクリプト をウォレットファイルと同じ階層に置きましょう.

次のようにスクリプトを実行します.

python .\elect2john.py .\wallet_file

すると,一見してよくわからない16進数が表示されます.

wallet_file:$electrum$4*03a0b839b5537e595ffbce8(ながいので省略)d701743

この文字列で最初の$以降をコピーしてhashcat.exeが存在するディレクトリに適当な名前で保存しておきましょう.(electrumhash.txtにしました)

hashcatをつかってみる

hashcatのヘルプで使い方を見ることができます.

hashcat.exe -h

ここでは一部を抜粋して紹介します.

Attack Modes

hashcatでは総当たりや辞書攻撃などを実施することができます. 今回はお手軽コースの総当りでやってみますので,引数としては-a 3を指定すればよいでしょう.

Hash modes

ヘルプを見ると一番印象的なのはこれでしょうか.

(一部抜粋)
  11300 | Bitcoin/Litecoin wallet.dat
  16600 | Electrum Wallet (Salt-Type 1-3)
  21700 | Electrum Wallet (Salt-Type 4)
  21800 | Electrum Wallet (Salt-Type 5)

BitcoinウォレットやElectrumのウォレットにも対応しています.

Electrumにはソルトの違いによってモードを選択する必要があります. ソルトタイプは,先程のスクリプトを実行したときに出力された文字列から得ることができます.

wallet_file:$electrum$4*03a0b839b5537e595ffbce8(ながいので省略)d701743

この場合,$electrum$4*03a...とあり,$4*がソルトタイプになっています.

Built-in Charsets

パスワードの文字列を指定します.

- [ Built-in Charsets ] -

  ? | Charset
 ===+=========
  l | abcdefghijklmnopqrstuvwxyz [a-z]
  u | ABCDEFGHIJKLMNOPQRSTUVWXYZ [A-Z]
  d | 0123456789                 [0-9]
  h | 0123456789abcdef           [0-9a-f]
  H | 0123456789ABCDEF           [0-9A-F]
  s |  !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
  a | ?l?u?d?s
  b | 0x00 - 0xff

と表示されていますが,英字か数字か記号か,それらを含めたものかなどを指定することができます.

今回は4桁の英字ですので,?l?l?l?lを指定すれば良いでしょう.?a?a?a?aでもできます.

実際に解析してみる

私の環境ではRTX3070というGPUを利用することができますので, -D 2でGPUを使って総当りするようにしています.

hashcat.exe -a 3 -D 2 -m 21700 .\electrumhash.txt ?a?a?a?a

実行した結果が以下のようになりました.

(長いので省略)ffdee255858b20dc38338d55b13477dc2c430d81357e:mimo

Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 21700 (Electrum Wallet (Salt-Type 4))
Hash.Target......: $electrum$4*03daade8a4f51da46d57f01fe89eb69c2702202...81357e
Time.Started.....: Wed Dec 28 17:14:58 2022 (2 secs)
Time.Estimated...: Wed Dec 28 17:15:00 2022 (0 secs)
Kernel.Feature...: Pure Kernel
Guess.Mask.......: ?a?a?a?a [4]
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:   368.1 kH/s (8.73ms) @ Accel:32 Loops:15 Thr:256 Vec:1
Speed.#3.........:    21175 H/s (9.78ms) @ Accel:64 Loops:15 Thr:64 Vec:1
Speed.#*.........:   389.3 kH/s
Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress.........: 688128/81450625 (0.84%)
Rejected.........: 0/688128 (0.00%)
Restore.Point....: 0/857375 (0.00%)
Restore.Sub.#1...: Salt:0 Amplifier:1-2 Iteration:1020-1023
Restore.Sub.#3...: Salt:0 Amplifier:1-2 Iteration:330-345
Candidate.Engine.: Device Generator
Candidates.#1....: mari -> mp8x
Candidates.#3....: mw8x -> m3")
Hardware.Mon.#1..: Temp: 42c Util:  0% Core:1582MHz Mem:5995MHz Bus:8
Hardware.Mon.#3..: Util: 95% Core: 400MHz Mem:1600MHz Bus:16

Started: Wed Dec 28 17:14:20 2022
Stopped: Wed Dec 28 17:15:01 202

4桁程度のパスワードでは2秒で解析することができます.

実際に解析されたパスワードはハッシュの最後に追記されている

(長いので省略)ffdee255858b20dc38338d55b13477dc2c430d81357e:mimo

mimoです.

調子に乗ってパスワードを6桁にしてみる

パスワードが4桁だと非常に危険なことがわかりました. 6桁の英字にするとどうなるのでしょうか?

Session..........: hashcat
Status...........: Bypass
Hash.Mode........: 21700 (Electrum Wallet (Salt-Type 4))
Hash.Target......: $electrum$4*03a0b839b5537e595ffbce8f76f8efd6cef7646...701743
Time.Started.....: Wed Dec 28 17:40:14 2022 (2 mins, 3 secs)
Time.Estimated...: Wed Dec 28 17:53:59 2022 (11 mins, 42 secs)
Kernel.Feature...: Pure Kernel
Guess.Mask.......: ?l?l?l?l?l?l [6]
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:   351.9 kH/s (9.37ms) @ Accel:32 Loops:15 Thr:256 Vec:1
Speed.#3.........:    22499 H/s (9.69ms) @ Accel:16 Loops:63 Thr:64 Vec:1
Speed.#*.........:   374.4 kH/s
Recovered........: 0/1 (0.00%) Digests (total), 0/1 (0.00%) Digests (new)
Progress.........: 46022656/308915776 (14.90%)
Rejected.........: 0/46022656 (0.00%)
Restore.Point....: 1728512/11881376 (14.55%)
Restore.Sub.#1...: Salt:0 Amplifier:2-3 Iteration:780-795
Restore.Sub.#3...: Salt:0 Amplifier:0-1 Iteration:1008-1023
Candidate.Engine.: Device Generator
Candidates.#1....: csdgfe -> cyxjss
Candidates.#3....: stxjss -> schtng
Hardware.Mon.#1..: Temp: 70c Util: 99% Core:1468MHz Mem:5995MHz Bus:8
Hardware.Mon.#3..: Util: 76% Core: 400MHz Mem:1600MHz Bus:16

どうやら15分程度で解析可能なようです.(途中で止めましたが…)