eth rpc服务器在任何时候都能被查询,在解锁的情况下任意终端调用转账函数都能把钱转走。dns重新绑定来攻击eth有点多余,不过端口限制访问的时候还是有用的。
翻译原文:https://blog.hacker.af/how-your-ethereum-can-be-stolen-using-dns-rebinding
随着 Tavis Ormandy 发现本地主机上利用未经身份验证的 JSON-RPC 服务的讨论兴起,我想到的第一件事就是以太坊客户端(Geth,Mist 和 Parity)。
大多数以太坊客户端在 localhost 上的端口 8545 上运行 JSON-RPC 服务,但由于它位于 localhost 上,因此我们无法直接从用户的浏览器访问它。电子钱包中的这个问题利用 CORS 标头通过 localhost 上的 JSON-RPC 控制用户的电子钱包。
Geth 的 JSON-RPC 看起来非常安全,因为它没有返回任何 CORS 头部,但随后 cpacia 在电子钱包的半补丁上发表了评论,这引起了我的兴趣。这是他具体评论的内容:
Just disabling CORS is still vulnerable to a DNS rebinding attack. It needs to be authenticated. ~ cpacia
我听说过 DNS 重新绑定但从未尝试深入研究过它。由于 Geth 的 JSON-RPC 也未经过身份验证,它也可能存在 DNS 重绑定攻击。
这里是 DNS 重绑定的基本定义: https://en.wikipedia.org/wiki/DNS_rebinding。
我开始研究 DNS 重绑定,但所有文章都非常古老。然后我在 Bug Bounty 论坛上询问了这个问题,Luke Young 将他在 Defcon 会议上关于现今 DNS 重绑定利用的 演讲链接 发给了我。它包括一个自动化工具,可以在大多数现代浏览器上实现 DNS 重新绑定。
但是我有一颗非常好奇的心,我不想使用任何预先制作的工具,所以我开始编写自己的 DNS 服务器。Python 有一个非常好的库,名为 dnslib,它为我处理了大部分的 DNS 底层的内容。我注册了一个域名,设置了一些指向我的服务器的记录,并将它们用作名称服务器。