Karakuri.com

Fintechではたらくアプリケーションエンジニアの技術録

仮想通貨のウォレット(wallet.dat)のパスフレーズを忘れたのでリカバリーを試みました

eXperience Point(XP)という仮想通貨を買ったのですが、翌日にパソコンが壊れてしまいました。幸い別のHDDにwallet.datをバックアップしていたのでウォレットをリストアすることはできたのですが、パスフレーズを入力してもウォレットを復号することができません。どうやら手書きのメモが間違っている様子。顔面蒼白です。

パスフレーズをクラックする方法を探す

手書きのメモが間違っているとはいえ、一部の文字を書き間違っているだけのはずです。しかし考えられる間違いを片っ端から手動で入力してみましたが突破できず。こうなると総当たりクラックツールを使ってパスフレーズを特定するしかありません。そこで同じ状況に陥って解決を試みたひとを探してみました。
blog.r622.net
いました。この方はMonacoinのケースですが、ウォレットがXPと同じ外観ですし、対象もwallet.datと名前も完全に同じです。勉強不足で恐縮なのですが、仮想通貨のウォレットはBitcoinのものを改造して作られているものが多いのでwallet.datのフォーマットは仮想通貨によらず同じである場合が多いのではないかと推測しました。そして、この方が使用したクラックツールがこちら。
github.com
BTCやLTCなどに対応していると書かれています。上述した通り、MonecoinやXPにも対応しているようです。

Bruteforce-walletをWindowsにインストールする

さて、このBruteforce-walletですが残念ながらWindowsには対応していません。しかしWindowsで動かすことができます。このツールはUbuntuに対応しているのでWindowsにUbuntuをインストールすれば良いのです。WindowsにUbuntuをインストールする方法については下記記事を参照してください。ちなみにWindows7や8.1にはUbuntuはインストールできないのでご注意ください。
qiita.com
UbuntuをインストールしたらBuruteforce-walletのGithubのREADMEの手順通りにコマンドを実行すればインストールは完了します。結構エラー出ますが、ツールのインストールに必要なプログラムがUbuntuにインストールされていないことが原因なので、都度 sudo apt-get install してインストールすることができました。

Ubuntuに追加インストールしたプログラム

本記事執筆まで時間が空いてしまったために記憶が曖昧です。不足や間違いがあるかもしれませんので参考程度に。

sudo apt-get install libdb-dev
sudo apt-get install libssl-dev
sudo apt-get install autoconf
sudo apt-get install gcc
sudo apt-get install make

Bruteforce-walletの準備

このツールに必要なファイルはウォレットのwallet.datだけです。まずはWindowsに保存されているwallet.datをUbuntuからアクセスしやすい場所にコピーします。cpコマンドでコピーしてきましょう。Ubuntu上でWindowsのCドライブは下記のアドレスになるようです。

/mnt/c/

wallet.datをbruteforce-walletプログラムと同じディレクトリにコピーしたらbruteforce-walletを実行するだけです。

bruteforce-wallet -t 4 -l 5 -m 5 wallet.dat

Bruteforce-walletの計算時間

ここまでくれば後はプログラムに頑張ってもらうだけなのですが、当然ながら簡単にパスフレーズを特定することはできません。もちろん2~3文字程度の簡単なパスフレーズであれば短時間で特定できるのですが、6文字以上ともなるとまず不可能だと思ってください。実際に僕の環境ではパスフレーズ特定までにおよそ下記のような時間がかかります。

1文字 数秒
2文字 数分
3文字 1時間
4文字 数か月
5文字 数年
6文字 40年以上

Core i7でコアを8個使ってもこのくらいかかるみたいです。1秒にだいたい72パターンくらい計算できました。1文字62パターンなので、1文字であれば総当たりはすぐに終わります。そこからは62の累乗でパターンが増えるので指数関数的に時間が増えてしまいますね。

どうやってパスフレーズを特定したのか

あくまでも僕がパスフレーズを特定できたのは手書きのメモがあったからです。手書きのメモが間違っていたとはいえ、全く違うなんてことはないはずです。1番あり得るのは1文字だけ書き間違ったケース。その次は2文字の順番が逆になっているケースでしょうか。このため、1回の計算時間は数秒から数分で終わるはずです。そうでなければ僕のパスフレーズは14文字あるので死ぬまでに特定することはできません汗。
実はこのBruteforce-walletはオプションが用意されており、このおかげで僕はパスフレーズを特定することができました。例えば手書きのメモが下記のような場合であったとします。

abcdefghijk

このメモ書きで確かなのはパスフレーズが11文字であるということです。パスフレーズを11文字固定で特定を試みる場合はツールの実行は下記のようになります。

bruteforce-wallet -t 8 -l 11 -m 11 wallet.dat

tオプションはスレッド数です。i7のコア数は8個なので8を設定しました。計算中にPCを利用する場合は6とか4を設定したほうが良いと思います。しかし計算時間は長くなります。lオプションはパスフレーズの最小の長さで、mオプションはパスフレーズの最大の長さです。どちらにも11を設定することでパスフレーズは11文字固定で探すことになります。この文字数を固定できるだけでも計算時間は大きく減らすことができます。しかしこれでも11文字なので天文学的時間がかかってしまいます。
このためまずは1文字ずつ総当たりをします。下記間違いであれば1文字だけ総当たりすれば良いはずです。例えば真ん中の文字である「f」が間違っていると仮定した場合は下記のように実行することとなります。

bruteforce-wallet -t 8 -l 11 -m 11 -b "abcde" -e "ghijk" wallet.dat

bオプションはパスフレーズの先頭を指定し、eオプションはパスフレーズの終わりを指定します。このため、真ん中のfだけを変更しながらツールはパスワードを探すことになります。1文字しか変えないので数秒で計算は終わります。全文字に対して書き間違いを疑って計算させる場合はこれを全文字に対して全通り実行すればOKです。

bruteforce-wallet -t 8 -l 11 -m 11 -e "bcdefghijk" wallet.dat
bruteforce-wallet -t 8 -l 11 -m 11 -b "a" -e "cdefghijk" wallet.dat
bruteforce-wallet -t 8 -l 11 -m 11 -b "ab" -e "defghijk" wallet.dat
bruteforce-wallet -t 8 -l 11 -m 11 -b "abc" -e "efghijk" wallet.dat
bruteforce-wallet -t 8 -l 11 -m 11 -b "abcd" -e "fghijk" wallet.dat
bruteforce-wallet -t 8 -l 11 -m 11 -b "abcde" -e "ghijk" wallet.dat
bruteforce-wallet -t 8 -l 11 -m 11 -b "abcdef" -e "hijk" wallet.dat
bruteforce-wallet -t 8 -l 11 -m 11 -b "abcdefg" -e "ijk" wallet.dat
bruteforce-wallet -t 8 -l 11 -m 11 -b "abcdefgh" -e "jk" wallet.dat
bruteforce-wallet -t 8 -l 11 -m 11 -b "abcdefghi" -e "k" wallet.dat
bruteforce-wallet -t 8 -l 11 -m 11 -b "abcdefghij" wallet.dat

2文字の順番を逆に書き間違ってしまった可能性がある場合は2文字ずつすればOKです。これでもそんなに時間はかかりません。が、2文字目と8文字目を書き間違っていたというような飛び石のケースはちょっと救済策が今のところありません。。。
あとvオプションを使うと計算過程を出力してくれるので文字数が多い場合は設定しておきましょう。引数は秒なので600とかで良いのではないでしょうか。600だと10分に一度下記のように計算過程を出力してくれます。

Tried / Total passwords: 57 / 9.31151e+08
Tried passwords per second: 28.500000
Last tried password: v
Total space searched: 0.000006%
ETA: 2019年01月21日 22時33分09秒

パスフレーズを特定できたら叫びそうになる

試しにパスフレーズを「12」に設定して実行してみたら下記のようになります。Password foundの文字を見つけたときは叫びそうになりました(目の前に妻がいたので飲み込みました)。ちなみに僕のケースは、1文字ずつ全通りやればすぐに見つかったのに何故か3文字総当たりとか色々先にやってしまったので、結果的に何十万通りもアタックしてようやくパスフレーズを特定したという流れでした…。

./bruteforce-wallet -t 1 -l 1 -m 5 -v 1 wallet.dat
Tried / Total passwords: 29 / 9.31151e+08
Tried passwords per second: 29.000000
Last tried password: T
Total space searched: 0.000003%
ETA: 2019年01月15日 10時04分40秒

Tried / Total passwords: 57 / 9.31151e+08
Tried passwords per second: 28.500000
Last tried password: v
Total space searched: 0.000006%
ETA: 2019年01月21日 22時33分09秒

Tried / Total passwords: 86 / 9.31151e+08
Tried passwords per second: 28.666667
Last tried password: 0O
Total space searched: 0.000009%
ETA: 2019年01月19日 17時47分14秒

Tried / Total passwords: 116 / 9.31151e+08
Tried passwords per second: 29.000000
Last tried password: 0s
Total space searched: 0.000012%
ETA: 2019年01月15日 10時04分37秒

Tried / Total passwords: 126 / 9.31151e+08
Tried passwords per second: 31.500000
Last tried password: 12
Total space searched: 0.000014%
ETA: 2018年12月16日 22時12分49秒

Password found: 12

悪用厳禁ではあるのですが、そもそもこういうツールで第三者にパスフレーズを特定されないように8文字以上のパスフレーズを使用するようにしましょう。また、このツールは辞書攻撃にも対応しているので8文字以上でも単語が含まれていると計算時間を大幅に圧縮される場合があります。できれば乱数メーカーなどで単語の使用は避けましょう。でも難しいパスフレーズにすればするほど自分がアクセスできなくなるリスクも上がるので頭が痛いですねえ。。。