概要
Monero 节点探测在这里指通过技术手段识别 Monero 区块链节点,目的是识别Monero 网络节点的规模,以及关键节点地址,Monero(XMR,门罗币)是一种以隐私反追踪为主要卖点的加密货币,故意隐藏钱包地址和交易,允许人们秘密使用货币。
1. 门罗区块链简介
Monero 区块链技术主要由分布式存储,P2P 网络,共识机制组成,其工作验证算法 CryptoNight 是为 AES 密集型和消耗 CPU 的操作,显著降低了 GPU 对 CPU 的优势。受到网络黑产攻击者、自动化僵尸网络控制者的热烈欢迎,为肉鸡控制者提供了一种利用 CPU 算力进行变现的一种技术手段,目前比较知名的挖矿团伙有 watchdogs miner,ddgbotnet 挖矿团伙,pm miner,kingsing miner,8220 挖矿团伙等,他们长期偏向于 Linux 服务器进行挖矿攻击活动,挖掘的都是 Monero 币,已知的几个团伙目前收益最高的约在 1000 万人民币。
分布式存储指的是网络上大部分节点都保存了整条区块链,P2P 网络指的是节点即可以当作服务端,也可以当作客户端,共识机制指的是 proof of Work,工作量证明。
2. 门罗币区块链网络结构
门罗币区块链网络结构图,用如下比特币区块链网络结构图来表示。钱包 W (wallet)
挖矿 M (Mining),区块链数据库 B,网络路由节点 N,SPV 简化交易验证轻节点,Bitcoin protocol 可以理解为 monero protocol,S 代表 Stratum 矿机和矿池之间的 TCP 通讯协议,P 指的是 poo l矿池。此外,Solo Miners 指的是独立矿工,pool miners 指的是使用矿池矿工,两者的区别在于挖矿者是否需要搭建 monero 的全节点,另外矿池矿工是共享收益,且需要交一定比例的收益。
磨刀不误砍柴工,简要理解区块链:节点的功能存储区块链数据库以及进行网络路由通讯,普通用户转账就是在节点区块链数据库插入数据,但这个数据需要有矿工以特定方式进行运算,然后将运算后的结果同步到节点里,经过特定算法确认才会同步到其他节点数据库中,超过 51% 节点同步完成才算是完成交易过程,矿池的核心工作是给矿工分配任务,统计工作量并分发收益。从节点中获取待运算的数据,发送给矿工进行运算,然后拿运算后的结果同步到节点数据库中,运算成功获得一部分奖励,根据每个矿工的 Hash 量,之后来分配获得的奖励,独立矿工则不是按劳分配收益,挖矿成功则获得成功的一整份收益,如果不成功则没有收益。
挖矿本质上是执行 Hash 函数的过程,而 Hash 函数是一个单输入单输出函数,输入数据就是一个区块头,普通矿工会登录矿池,提交自己的矿池账号(可以是钱包地址,也可以是代号)和密码(可以没有),矿池记录该账号的会话,矿池发送任务数据发送给矿工,矿工将结果数据发送给矿池。
Stratum 是挖矿的数据结构,如下 json 格式:
矿池源码:Powerpool,支持混合挖矿,源码地址https://github.com/sigwo/powerpool
门罗币节点源码 https://github.com/monero-project/monero
门罗币挖矿机源码 https://github.com/xmrig/xmrig
门罗钱包工具 https://www.getmonero.org/downloads/#cli
Stratum 协议源码 https://github.com/stratum/stratum
3. Monero 全网活跃节点分布
Monero 区块链的节点位置主要分布在中国、美国、欧洲,在其他国家和地区也有少量分布,节点的分布和国家区块链用户数量有关,区块链节点越多,说明该区块链的用户也越多。
Monero 节点搭建
1. Monero 下载
源码下载地址:
https://github.com/monero-project/monero
linux平台编译好的程序下载:
https://getmonero.org/downloads/
https://downloads.getmonero.org/gui/linux64
https://downloads.getmonero.org/cli/linux64
需要安装最新版本才能正常使用,本人原先测试的是 0.13 版本,现在最新版是 0.17 版本。
2. 启动
使用 setsid ./monerd 启动门罗币节点初始化程序,或者使用其他节点地址来初始化节点信息。
./monerod –bootstrap-daemon-address node.moneroworld.com:18089
这条命令指的是使用目标节点当作指定的同步数据的节点,可以理解为主从复制,从目标节点拷贝数据到本地。
3. 获取其他节点存储节点
Monerod 程序自带查询网络节点的参数,可以使用 bootstrap-daemon-address 参数来同步远程的节点中的区块数据,以及存储的其他 monero 币网络节点的数据,使用 –seed-node 参数和 print_pl 参数就能够将所有同步到的所有存储的网络节点以字符串的方式打印出来,下方示例是网络流量示例。
./monerod –seed-node test.com print_pl 得到解析后的网络节点(这里要注意的是,需要先将目标节点信息同步到本地即步骤 2,这样执行才有结果)。Monerod 节点程序每次只能同步一个节点存储的节点数据,每次同步的时候除了同步节点数据外,还会同步其他区块数据。
以下是节点查询时的流量数据:第一次连接其他节点时的流量数据,可以看到第二次的响应包中包含其他节点存储的其他节点的数据,通过解析返回结果,又重新进行查询即可获得全网节点 IP 和端口。
Monero 节点探测
1. 初始接入节点选择
新的 Monero 节点需要加入整个 Monero 节点的 P2P 网络当中,需要和其他的一个或多个 P2P 节点进行连接以融入 P2P 网络节点,Monero 的网络节点主要包含直连型和隐藏网络型,直连型指的是直接使用节点就能进行连接,而隐藏网络型则需要使用 Tor 或者其他代理的方式进行连接。
Monero 节点核心代码在 Github 上有公开,Github 的项目地址为 github.com/monero-project/monero,Monero 节点项目程序最新版默认硬编码配置了 14 节点 IP,这些节点也属于整个 Monero 区块链网络中的核心节点。
以下是 Monero 项目中核心节点的 IP 信息:
在其他来源直接下载的编译程序中节点的配置会有些许差别,这个是在 getmonero 下载的 0.16 版本程序中硬编码存储的 24 个节点地址,有部分和上方节点重合。
212.83.175.67:28080
5.9.100.248:28080
163.172.182.165:28080
195.154.123.123:28080
212.83.172.165:28080
192.110.160.146:28080
162.210.173.150:38080
162.210.173.151:38080
192.110.160.146:38080
107.152.130.98:18080
212.83.175.67:18080
5.9.100.248:18080
163.172.182.165:18080
161.67.132.39:18080
198.74.231.92:18080
195.154.123.123:18080
212.83.172.165:18080
192.110.160.146:18080
88.198.163.90:18080
95.217.25.101:18080
209.250.243.248:18080
104.238.221.81:18080
66.85.74.134:18080
除了默认配置节点外,还可以使用其他平台公开的可信 Monero 节点。
TOR 远程节点具有隐藏源 IP 的能力可以避免被追踪,以下是公开的部分 TOR 远程节点。
2. 爬取模式选择
查询出来的节点数据,如果包含 white 标志,说明是活跃节点。如果是 gray 标志,则表明一段时间内未交互,无法确定开放状态。对于节点的爬取,有两种方式,第一种去重只爬取 white 节点,第二种爬取所有节点,在爬取之前判断节点对应端口是否开放,然后进行爬取,第二种爬取方法爬取时间相对较长,但爬取到的活跃节点数更多。
3. 实现方式选择
几种实现方法:
1. 使用扫描器构造请求包全网探测。
2. 使用脚本程序构造对应协议探测包与对应节点进行交互,然后同步存储的节点信息,接着对节点进行逐个节点信息读取,构造对应协议包的过程比较复杂,需要较长的编码时间。
3. 使用 shell 脚本,调用 monerod 程序的自带读取远程节点存储节点信息的功能,存储到本地,然后不断遍历 IP 列表,最后将存储的信息汇总。
从覆盖度层面来说,2 和 3 方式实现探测到的节点数量会大于方式 1 探测到的节点数量,因为这些节点的端口非固定端口,使用扫描器全网探测的方式无法完全覆盖全部端口,而且探测次数更少。
从投入的时间来讲,使用方式 3 实现最少。
本人这里选择用 shell 脚本进行自动化爬取,通过 monero 节点程序直接进行读取,首先需要准备环境信息,1)安装 nc 命令;2)将 monero 节点程序放在外网可访问处;3)生成一个基础特定格式的 monero 节点列表文件,monero_node1,里面的格式示例:38 个 A+192.168.1.1 空格,下面就是全部代码:
4. 探测结果
在 2019 年 5 月的时候进行探测的结果,总节点数有 15709 个,总节点包含开放的活跃节点和未开放不活跃节点,这些信息是通过遍历所有活跃的节点中存储的连接过该节点的 IP 总和。
探测活跃节点数为 1812。
通过活跃节点之间存储的 IP 关系进行绘图分析,将所有的信息梳理成节点 IP ->节点 IP 存储的其他 IP,用来得到 IP 间的连接关系,可以看到下图中的大红原点属于该门罗币节点的主要节点,总共有 35 个 IP 地址,除了 Monero 源码中配置的 14 个外,还有不同的区块链服务商也有提供 21 个核心节点。
5. 攻击方式思考
大家可以根据 monero 活跃节点关系图想出一些针对 Monero 的攻击方式,对应攻击方式同样也可以用到相似类型区块链当中,以下前两种是个人的想法,其他的是网上摘录下来的。如果大家有新的攻击思路也可以在下方评论区进行留言讨论。
我这里举例几种攻击方法:
1)挖矿算力盗窃攻击,通过在网络设备中监控 monero 挖矿提交的相关 hash 区块,将它同时提交到自己指定的核心网络节点中,只要自己的网络速度够快,这个 hash 块就会被窃取,这种是针对挖矿者还有矿池的攻击。
2)Monero 节点接入 IP 监控,削弱 Monero 区块链的隐蔽性,可以知道所有交易发生时的接入 IP,针对那些不是使用平台和 Tor 等隐藏网络的使用者的连接 IP 会暴露,可以通过 IP 进一步分析连接者的身份。
3)日蚀攻击:日蚀攻击是一种针对 P2P 网络的攻击。这种攻击方法与共识算法关系不大,理论上讲对 PoW、PoS、DbFT 等共识算法都有效,但是它非常依赖于节点在 P2P 网络处理上的漏洞,因此实施攻击不具备普适性。
4)51% 算力攻击:51% 算力攻击是区块链最著名的攻击方式之一。在一个 POW 共识的区块链网络中,算力即是权力。当超过 50% 的算力都由一人控制时,此人就可以任意的撤销和阻止交易,进而实现双花。这种攻击在大型网络中较难实现,在小型网络中发生的可能性更高。在 POS 共识中与之类似的有币龄累计攻击和长距离攻击。
5)Ddos 攻击,分布式拒绝服务攻击,可以通过门罗 P2P 相关协议进行交互,使得目标节点资源耗尽,无法处理其他的正常服务,通常和其他攻击方式一起使用。
附录
Pm miner 挖矿团伙,是因为攻击者的木马安装脚本的名称到目前为止一直都是 pm.sh,所以我称它为 pm miner 挖矿团伙,该挖矿团伙活跃目前仍比较活跃,常使用 redis 空口令以及其他 rce 方式进行传播,攻击者也会挑选目标进行进一步的内网渗透攻击,使用自动化脚本进行 sshd 后门窃取账号密码,痕迹清除,以及回传数据等操作,攻击者会根据拿到的数据筛选目标进行进一步攻击,从而扩大攻击战果。
Watchdogs miner 挖矿团伙,早期版本挖矿木马名称为 watchdog,后期该挖矿木马一直都在更新,会使用动态链接库来隐藏木马进程,目前的该挖矿团伙初始化脚本中还有 watchdog_url 等关键字,初始化 shell 脚本名称为 init.sh。
ddgbotnet 挖矿团伙,因为木马文件名称为 ddgxxx,并且会在系统中创建 .ddg 目录,所以称之为 ddgbotnet 挖矿团伙,该团伙的木马下载地址之前一直为 i.sh,经过更新有使用 P2P网络,主要利用 redis 弱口令进行传播。
Kingsing miner 挖矿团伙,因为木马组件中一个挖矿木马文件名称为 Kingsing,使用 go 语言编写,所以称之为 kingsing 木马,常使用 redis 空口令漏洞,以及 web 类命令执行漏洞进行传播。
8220 挖矿团伙,早期的挖矿木马下载地址全是 8220 端口,使用 docker 进行部署的,后期有了比较大的变化,但木马还是原来的木马。
附-关于微步在线研究响应团队
微步情报局,即微步在线研究响应团队,负责微步在线安全分析与安全服务业务,主要研究内容包括威胁情报自动化研发、高级 APT 组织&黑产研究与追踪、恶意代码与自动化分析技术、重大事件应急响应等。