以太坊盗币方式揭秘之“偷渡时代”
摘要: 攻击者通过端口扫描等方式发现受害者开放了JSON-RPC端口后,查询当前节点最新的区块高度以及该节点上已有的账户。查询账户余额并发起转账申请。当受害者解锁账户时,攻击者就完成攻击。
古人的盗亦有道,在虚拟货币领域也有着它独特的定义。只有对区块链技术足够了解,才能在这场盛宴中获取足够多的金钱。他们似那黑暗中独行的狼,无论是否得手都会在被发现前抽身而去。
黑暗中的盗币方式:偷渡时代
攻击流程复现
攻击复现环境位于ropsten测试网络。
被攻击者 IP: 10.0.0.2,启动客户端命令为:geth –testnet –rpc –rpcapi eth –rpcaddr 0.0.0.0 console账户地址为:
0x6c047d734ee0c0a11d04e12adf5cce4b31da3921, 剩余余额为5 ether;
攻击者 IP: 10.0.0.3 , 账户地址为:
0xda0b72478ed8abd676c603364f3105233068bdad;
攻击者步骤如下:
1. 攻击者通过端口扫描等方式发现被攻击者开放了JSON-RPC端口后,调用eth_getBlockByNumbereth_accounts接口查询当前节点最新的区块高度以及该节点上已有的账户。
2. 攻击者调用eth_getBalance接口查询当前节点上所有账户的余额。
3. 攻击者对存在余额的账户持续发起转账请求。
一段时间后,被攻击者需要进行交易:
按照之前的知识点,用户需要先解锁账户然后才能转账。当我们使用 personal.unlockAccount 和密码解锁账户后,就可以在终端看到恶意攻击者已经成功发起交易。
恶意攻击者的交易信息:
攻击的流程图如下所示:
攻击成功的关键点解析
看完前面的偷渡漏洞攻击流程,你可能会有这样的疑问:
1)攻击者为什么可以转账成功?
2)如例子中所示,该地址只有 5 ether,一次被转走了 4.79 ether,如果我们解锁账户后在被攻击前发起转账,转走 1 ether,是否攻击者就不会攻击成功?
下文将详细分析这两个问题并给出答案。
攻击者可以通过 rpc 接口转账的原因:
首先,分析一下关键的unlockAccount函数:
在判断传入的解锁时间是否为空、是否大于最大值后,调用 TimedUnlock() 进行解锁账户的操作,而 TimedUnlock() 的代码如下:
首先通过getDecryptedKey()从keystore文件夹下的文件中解密出私钥,再判断该账户是否已经被解锁,如果没有被解锁,则将解密出的私钥存入名为unlocked的map中。如果设置了解锁时间,则启动一个协程进行超时处理go ks.expire()。
再看向实现转账的函数的实现过程SendTransaction()-> wallet.SignTx() -> w.keystore.SignTx():
可以看到,在w.keystore.SignTx()中,直接从ks.unlocked中取出对应的私钥。这也就意味着如果执行了unlockAccount()函数、没有超时的话,从ipc、rpc调用SendTransaction()都会成功签名相关交易。
由于默认参数启动的 Go-Ethereum 设计上并没有对 ipc、rpc 接口添加相应的鉴权模式,也没有在上述的代码中对请求用户的身份进行判断,最终导致攻击者可以在用户解锁账号的时候完成转账操作,偷渡漏洞利用成功。
攻击者和用户竞争转账的问题
由于用户解锁账户的目的是为了转账,所以存在用户和攻击者几乎同时发起了交易的情况,在这种情况下,攻击者是如何保证其攻击的成功率呢?
在攻击者账号0x957cD4Ff9b3894FC78b5134A8DC72b032fFbC464的交易记录中,交易0x8ec46c3054434fe00155bb2d7e36d59f35d0ae1527aa5da8ec6721b800ec3aa2能够很好地解释该问题。
相较于目前主流的gasPrice维持在1Gwei,该笔交易的gasPrice达到了惊人的1,149,246 Gwei。
也正是由于较高的gasPrice, 使得该攻击者在与其它攻击者的竞争中(有兴趣的可以看看上图红框下方两笔dropped Txns)得到这笔巨款。
蜜罐捕获数据
蜜罐是一台无人使用但却被严密监控的网络主机,它包含虚假的高价值资源和一些漏洞,以此吸引入侵者攻击主机。并且在被入侵的讨程中,实时记录和审计攻击者的攻击流量、行为和数据。以此了解攻击者的方式、手段和目的,并且完成对攻击溯源取证等进一步的工作。
数据捕获:数据捕获技术包括网络流量数据捕获以及主机上系统行为的捕获。网络流量数据的捕获结合网络入侵检测系统,配置相关敏感信息的检测规则,触发入侵检测规则时立即记录网络流量。
在偷渡漏洞被曝光后,就有在已有的蜜罐数据中寻找到部分攻击的痕迹。
下图是2017/10/01到2018/03/21间蜜罐监控到的相关攻击情况:
被攻击端口主要是8545端口,8546、10332、8555、18082、8585端口等也有少量扫描痕迹。
攻击来源IP主要集中在46.166.148.120/196和216.158.238.178/186/226上:
46.166.148.120/196攻击者使用的探测payload主要是:
216.158.238.178/186/226攻击者使用的探测payload主要是:
具有团队在全球节点蜜罐监测结果显示,黑客针对以太坊 JSON-RPC 进行盗币攻击一直在持续。
(作者:区块链安全档案,内容来自链得得内容开放平台“得得号”;本文仅代表作者观点,不代表链得得官方立场)
评论(0)
Oh! no
您是否确认要删除该条评论吗?