一、写在前面的话
SMS Privacy(一个使用比特币购买匿名手机号的服务)现在已经成为了一种Tor隐藏服务,但现在大约只有不到10%的用户会以这种隐藏服务的方式来使用它。在这篇文章中,我将跟大家分析一下攻击者如何使用Tor隐藏服务来创建一个钓鱼网站。
二、概述
今天故事的主人公是Charlie,当时他用Google搜索了“site:*.onion.to smsprivacy”的相关信息,并且得到了意想不到的结果。
smspriv6fynj23u6.onion是一个合法的隐藏服务名称,但是在搜索结果中却出现了另一个看起来非常相似的网站:smsprivyevs6xn6z.onion。
经过简单的分析调查之后,他发现该网站只是一个简单的代理:页面请求首先会发送给一个钓鱼网站,然后最终被转发到真正的隐藏服务,最终返回响应数据。但是,这里还存在一些奇怪的地方。
1. 缺少Content-Length 头
Content-Length 头可以告诉HTTP客户端需要接收多少个字节的内容。对于一个配置不当的代理服务器,如果传递的内容没有改变的话,那么Content-Length 头就不会发生变化。因为它知道内容不变的话数据的长度肯定不会变。
这也就意味着,如果代理服务器认为内容的长度可能会发生变化的话,那么就说明在某些情况下,服务器已经准备好去修改数据包的内容了。
但是为什么不可以根据修改版的数据包内容来写入相应的Content-Length呢?
原因很可能是为了降低页面的加载时间:如果代理不需要事先知道数据包的长度,那么它就可以在修改完数据包的内容之后直接将内容发送给客户端了。如果它还要读取所有的内容,然后进行修改,最后再将所有数据进行转发的话,这样就会增加页面的加载时间并引起不必要的怀疑。
2. Connection 头错误
下面给出的是合法网站与钓鱼网站响应头之间的对比:
合法网站:
- $ torsocks curl -Ihttp://smspriv6fynj23u6.onion/
- HTTP/1.1 200 OK
- Server: nginx/1.10.2
- Date: Fri, 13 Oct 2017 05:37:49 GMT
- Content-Type: text/html;charset=UTF-8
- Content-Length: 7387
- Connection: keep-alive
- Set-Cookie: [...]
- X-Frame-Options: DENY
钓鱼网站:
- $ torsocks curl -Ihttp://smsprivyevs6xn6z.onion/
- HTTP/1.1 200 OK
- Server: nginx/1.10.2
- Date: Fri, 13 Oct 2017 05:37:57 GMT
- Content-Type: text/html;charset=UTF-8
- Connection: [object Object]
- Set-Cookie: [...]
- X-Frame-Options: DENY
Connection 头会从keep-alive被重写成[objectObject]。当你将一个对象(如果这个对象没有实现toString()方法)转换成字符串的时候,你将会在JavaScript中看到这种转换的发生,这对于我们分析代理服务器运行的是哪一种软件提供了非常有帮助的线索。
经过分析之后,我认为它很有可能使用的是NodeJS。我在node-http-proxy或Harmon(用于修改响应信息的中间件)中都没有发现任何可以触发该漏洞的地方,所以这很有可能是攻击者自己实现的。如果你知道有哪一款软件中的漏洞可以允许将Connection头修改为[object Object]的话,请一定要告诉我。
除此之外,我还添加了一些Javascript脚本来对这个钓鱼网站进行了进一步的分析,并且发现该网站采用了一种额外的缓存机制,其目的应该还是为了降低页面的加载时间。
3. 隐藏服务的地址发生了改变
代理似乎会将smspriv6fynj23u6.onion的所有实例全部重写到smsprivyevs6xn6z.onion,但有意思的是大小写会发生变化。
4. 比特币地址发生了改变
比特币是这个钓鱼网站真正的目的,一般来说,钓鱼网站的目标是为了窃取用户的帐号凭证,但是这个网站的目的似乎更加直接,它就是要骗用户的比特币。(注:其中的一个比特币地址:
1GM6Awv28kSfzak2Y7Pj1NRdWiXshMwdGW)
当用户首次访问支付页面的时候,页面的加载会有一定的延迟,这很可能是后台正在生成新的比特币地址。所有新生成的比特币地址会以文本形式显示出来,但支付页面上的二维码却没有发生变化,扫描之后出来的仍然是原本合法的地址。
三、网站如何分发给用户
我在分析的过程中还发现了另外两个隐藏服务:
- 7cbqhjnpcgixggts.onion:”The onion crate”:这是一个Tor隐藏服务列表,类似于以前的“Web目录”,但这是针对Tor的。其中的钓鱼版本会被专门标记为“钓鱼链接”。
- hss3uro2hsxfogfq.onion:”not Evil”:这是一个针对Tor隐藏服务的搜索引擎。搜索“sms privacy”后,返回的第一条结果是合法网站,而第二条结果就是钓鱼网站。我点击了钓鱼网站下面的“report abuse”按钮,但是现在这个网站还是没有被移除。
这跟我想的完全不一样,我一开始以为攻击者可能会在Twitter、博客或者其他诸如此类的地方放置一条钓鱼链接的,而不是直接通过搜索引擎显示给用户。如果我想让用户去访问我的钓鱼网站,我肯定不会将其标记为“钓鱼链接”。我不认为“The onion crate”的管理人员与此事件有关,我感觉“not Evil”搜索引擎的运营者会是此次事件背后的始作俑者,不过我现在也无法确定。因为如果我要开发一个专门给用户发送钓鱼链接的搜索引擎,那我根本不会给用户返回非钓鱼网站的链接,尤其是第一个结果就是合法网站。
还有一种可能,就是这一网络钓鱼活动并没有正式开始,但“The onion crate”在2017年5月17日就将其标记为了钓鱼链接,说明它的存在已经有一定的时间了。
四、用户如何保护自己
SMS Privacy的用户首先要确保自己在浏览smsprivacy.org时使用的是HTTPS,或者说如果用户使用的是Tor,那么smspriv6fynj23u6.onion是唯一的合法隐藏服务地址,其他所有类似的地址都是钓鱼网站。
进一步研究
我猜测,运行这个代理的软件同时还代理了很多其他的隐藏服务。当你想自己编写一些代码来代理一个隐藏服务时,你只需要重写域名和比特币地址,基本上就可以搞定了。
接下来,我又进行了一些深入研究。我查看了“The onion crate”并寻找其他的钓鱼链接,然后我找到了一个在响应头中给出了Connection: [object Object]并将网络数据转发给伪造的SMS Privacy隐藏服务地址的钓鱼网站。分析后发现,这个隐藏服务与SMS Privacy合法服务毫不相关,但它能够给用户提供伪造的SMS Privacy内容!这也就意味着,这两个钓鱼网站很可能是跟同一个黑客或黑客组织有关的。HTTP数据如下所示:
- $ torsocks curl -I -H 'Host:smsprivyevs6xn6z.onion' http://cboc66yz75virnj7.onion
- HTTP/1.1 200 OK
- Server: nginx/1.10.2
- Date: Fri, 13 Oct 2017 16:26:10 GMT
- Content-Type: text/html;charset=UTF-8
- Connection: [object Object]
- Set-Cookie: mojolicious=eyJsYW5kaW5nX3VybCI6Ii8iLCJhYnRlc3RzIjp7ImxhbmRpbmdfdXJsIjoiLyIsInNpZ251cGxpbmsiOiJvcmlnaW5hbCIsInJlZmVyX3NyYyI6Im5vbmUiLCJoaWRkZW5fc2VydmljZSI6ImhpZGRlbiJ9LCJleHBpcmVzIjoxNTA3OTE1NzE1LCJjc3JmX3Rva2VuIjoiZmQzNjc4NzcyMjRiNDZkZWZhYjNhM2ViZDIwMDY0ZmRmMDliZmQ0NCIsImFidGVzdHNfc2Vzc2lvbmlkIjoiOGM4NWQxMTZjMmE1MTBkOSJ9--785fbe83dce1217e74543ed831eb4c18c1cd6105;expires=Fri, 13 Oct 2017 17:28:35 GMT; path=/; HttpOnly
- X-Frame-Options: DENY
五、总结
实际上,攻击者可以轻而易举地利用这项技术来发动大规模攻击,因为只需要一个周末的时间就可以开发出一个可以正常使用的版本。而且我相信在不久的将来,会有更多的攻击者使用其他的Tor隐藏服务来制作钓鱼网站。