文章目录
前言
原本是老师push的一个关于”RPC漏洞检测“的小任务,涉及到以太坊节点的连接及对方geth节点信息的获取。这篇会对以太坊rpc端口简单介绍、记录geth节点连接过程以及过程中遇到的小bug。
提示:不排除由于系统不同的原因导致bug解决方法不同。
一、RPC漏洞利用
1. RPC漏洞介绍
RPC(remote procedure call)远程过程调用是一个计算机通信协议,该协议允许运行于一台计算机的程序调用另一台计算机的子程序。
2. 以太坊RPC漏洞利用
以太坊节点提供RPC API用于对接矿池、钱包等其他第三方程序。默认情况下,节点的RPC服务是无需密码就可以进行接口调用,因此,一旦将RPC端口暴露在互联网非常危险。
通过eth_accounts方法获取节点的以太坊地址,直接溯源。
通过admin_peers方法获取节点的当前连接,可用于其他节点的推测溯源。
二、Geth是什么
Geth是以太坊的客户端,有两种方法进行获取,一种是直接下载程序进行安装,另一种是通过编译源码安装。这里我选择的是通过下载程序安装,可以参考以太坊(Ethereum)之Geth,这里直接下载程序进行安装,不是重点不在阐述。
三、实验过程
1. 实验环境
节点位于日本东京,选择Ubuntu 22.04 64位操作系统,geth版本为1.13.8。
2. 发现开放rpc接口的以太坊节点
在ethernodes.org 或 etherscan.io发现可以一些公开的以太坊节点的信息,包括IP地址、端口号、客户端版本等。
接着,使用主动端口扫描的方式(扫描工具masscan)扫描由上面整理的IP地址范围或网络段,寻找开放了8545端口(以太坊默认的JSON-RPC端口)的节点。
3. 验证以太坊节点真实性
验证IP是否开启JSON-RPC端口:向以太坊节点编写好的脚本,脚本构造了发送的JSON-RPC请求,根据响应状态码以及响应内容(包含jsonrpc字段),则认为开放了JSON-RPC端口,保留IP。
4.创建并配置geth客户端
Ⅰ 安装Geth客户端
打开命令行窗口,依次执行以下命令:
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo add-apt-repository -y ppa:ethereum/ethereum-dev
sudo apt-get update
sudo apt-get install ethereum
一路选择”y“,下面是我的运行结果
然后可以查看验证一下geth版本和命令参数……
geth --help
Ⅱ 创建创世区块
创建工作目录
mkdir ~/privatechain
在工作目录下创建用于存放账户信息和区块数据的目录(即data)
mkdir ~/privatechain/data
创建创世区块的配置文件
cd privatechain
touch genesis.json
vim genesis.json
genesis.json的详细文件内容如下:
{
"config": {
"chainId": 202311061200,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0,
"eip150Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x20000",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
其中,chainid指定了独立的区块链网络 ID。网络 ID 在连接到其他节点的时候会用到,以太坊公网的网络 ID 是 1,为了不与公有链网络冲突,运行私有链节点的时候要指定自己的网络 ID。不同 ID 网络的节点无法相互连接。其他的参数和描述很多博主都写得很全了,我也就不再多说。
定义完之后就可以创建创世区块啦
cd ~/privatechain
geth --datadir ./data init genesis.json
看生成的目录,geth目录用于保存我们所建私有链的区块数据,keystore目录用于保存用户的账户数据。
接着,就可以启动私有链。
Ⅲ 启动私有链
geth --datadir data --networkid 202311061200 --rpc.enabledeprecatedpersonal --http --http.addr 0.0.0.0 console 2>2.log
有的uu们可能会出现下面“Fatal: Failed to register the Ethereum service”的报错,这是因为datadir目录的路径不对,如果执行上述命令记得先返回root。
返回root再执行
【注意】–networkid参数即为创世区块配置文件中的chainId。
Ⅳ 对geth客户端进行操作
随便举几个例子:
比如,创建账户,参数值为密码:
> personal.newAccount("001")
> personal.newAccount("002")
创建账户后会返回一个哈希值(代表新建账户的地址)
查询私链上的账户信息(对应上面创建的俩个账户)
查询私链上账户的账户余额,账户当作一个列表,查询第几个账户取下标即可。
到这里,还有很多……
5. 连接对方节点geth客户端并查询信息安装Geth
为方便测试,我配置了两个节点的geth客户端,分别是geth01(202.182.121.223)和geth02(207.148.105.75)
geth attach http://xxx.xxx.xxx.xxx:8545
# xxx.xxx.xxx.xxx表示对方节点IP
直接使用命令连接很可能就直接报错了。
原因:对方节点(geth02)防火墙未开启8545端口,进入geth02开启端口
然后再使用geth01连接geth02,连接成功!
接着就可以获取geth02的信息啦!还有有很多属性可供查询……
以上仅供参考!欢迎批评指正!