导语:经过调查,作为Tor隐藏服务的一种,10%的Tor用户使用了其中的SMS隐私服务。不过就是这么一个服务却被黑客钻了空子,本文就给你详细介绍一下黑客是如何通过伪造Tor隐藏服务来进行钓鱼的。

360截图1619082094112121.jpg

经过调查,作为Tor隐藏服务的一种,10%的Tor用户使用了其中的SMS隐私服务。不过就是这么一个服务却被黑客钻了空子,本文就给你详细介绍一下黑客是如何通过伪造Tor隐藏服务来进行钓鱼的。

案例回顾

有一天我在谷歌搜索”site:*.onion.to smsprivacy”时,却出现了一个意想不到的结果。正常情况下,搜索出的合法的隐藏服务名称应该是smspriv6fynj23u6.onion,但奇怪的是当天的搜索结果却为smsprivyevs6xn6z.onion。

通过简单的分析,我发现smsprivyevs6xn6z.onion仅是一个简单的代理站点,因为发送到钓鱼网站的页面请求被转发给了真正的隐藏服务,而且除了一些特殊的性能之外,这些响应还被转发了。

Content-Length标头丢失

Content-Length标头会告诉HTTP客户端需要多少字节的内容,不过对于代理服务器来说它只会通过固定的字节内容来进行内容传递或者是保持Content-Length标头不变进行传递。因为它知道,如果内容不改变标头长度也不会改变。这很可能是代理服务器在某些情况下会对内容长度进行的修改,不过我就奇怪了,为什么在内容修改时,它不直接编写与修改内容对应的内容长度呢?

我猜测有两个原因:

1.一个可能是为了减少页面加载时间,如果代理站点不需要提前对内容长度作出预判,那它就可以直接向客户端传输内容,并按照它的方式进行修改。假如它必须读取所有的内容,才会执行修改,那么随后发送的所有内容就会增加页面加载时间,从而暴露自己。
2.另一个可能是,恶意开发者要将所有内容存储成不可接收的内存负载(load memory)。如果同一个服务器代理数十到数百个其他隐藏的服务,那这种可能性猜测就是合理的。

Connection标头错误

以下是合法站点和钓鱼站点情况下的响应标头的比较:

$ torsocks curl -I http://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 -I http://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重写为[object Object]。如果对象不执行toString(),那么当你将对象转换为字符串时,在javascript中得到的结果就如上图中钓鱼站点的响应标头那样,这可能就是编写代理服务器运行软件的一个思路。

很可能它使用了Node.js,Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。因为我无法发现任何会在node-http-proxy或Harmon(node-http-proxy的中间件修改响应)中导致此错误的任何内容。当然这可能是完全基于传统习惯的猜测,如果你知道有任何能将Connection标头设置为[object Object]的软件漏洞,请@我。

有一些意想不到的javascript文件缓存(可能还有其他缓存)

我添加了一些Javascript来检测页面是否运行在一个流氓域中,如果是这样的话,请将document.referrer发送给我,以便稍后再阅读。我发现在使用合法站点时,我的脚本在浏览器中被修改了,但是在使用钓鱼站点时却使用了一个过时的版本,所以我相信钓鱼站点正在进行一些额外的缓存。这可能是为了减少页面加载时间。

在写这篇文章的时候,我试着研究了这个缓存,还别说,我还真发现了许多有趣的东西!比如,代理可以将所有的内容从我的跟踪脚本中删除,这样我就不能得到更多关于它们的信息。这很容易通过重新命名脚本和稍微修改内容来修复。

隐藏的服务地址已更改

代理似乎将smspriv6fynj23u6.onion的所有实例重写为smsprivyevs6xn6z.onion,但有趣的是,它对大写的实例并不做同样的处理。

比特币地址被更改

修改比特币地址是钓鱼网站的真正目的,通常情况下,网络钓鱼网站都会盗取用户帐户,随后再重新利用这些数据或将其出售,但是对于smsprivyevs6xn6z.onion来说,它采用了更直接的方法简单地将比特币地址重写为黑客控制的地址。

修改比特币地址的过程是这样的:当用户第一次被导航到付款页面时,在页面加载之前会出现一个延迟,不过该延迟用户是察觉不到的。也就是在这个时间里,黑客会在后端生成新的比特币地址,能在如此短的时间里完成整个操作意味着这个新的比特币地址是运行在一个巨大的缺少索引地址的数据库中,或者这个新的比特币地址是在一台运行较慢的设备上生成的,又或者这个新的比特币地址是由慢速语言编写的代码生成的,如果是这样,那么RNG可能不安全。以文本形式显示的所有比特币地址都将重写为攻击者控制的地址,并且合法地址和钓鱼地址之间似乎存在对应的映射关系。值得注意的是,QR码仍会保持不变,继续解码为合法地址。

为了验证我的猜测并方便继续深入调查,我假装受害者给黑客付款了,付款地址为1GM6Awv28kSfzak2Y7Pj1NRdWiXshMwdGW。由于该地址没有出现在网站上,这更加证明了我对smsprivyevs6xn6z.onion是一个愚蠢代理的猜测。不过这笔钱我是还没有真正的花出去,但如果真的付款了,看看它的真正去向可能会很有趣。

网站如何分配给用户?

我从Javascript中看到了一些不同的结果,在未被识别的域中,将引用者发送到服务器上。大多数情况下,人们主要是通过网络代理(例如,onion.link)查看隐藏的服务,而且我也确实发现了2个隐藏的服务,分别是7cbqhjnpcgixggts.onion和hss3uro2hsxfogfq.onion。

7cbqhjnpcgixggts.onion又名”The onion crate”,这是Tor隐藏的服务列表,就像olden day的” web directory”,但对Tor来说,实施钓鱼的版本也被标记为”Phishing link”。

hss3uro2hsxfogfq.onion又名”not Evil”,这是Tor隐藏服务的搜索引擎。搜索”sms privacy”会在网站顶部和钓鱼网站上找到合法的网站。虽然我在钓鱼站点旁边的”report abuse”进行了确认操作,但它还没有被删除。

然而,我还是没有找到真正的原因。我希望能找到一个含有钓鱼链接,而不是真实链接的推特或博文。”The onion crate”背后的人不太可能对实施钓鱼的攻击者负责。如果我想让人们使用我的钓鱼网站,我才不会把它标记为”钓鱼链接”。所以我猜测,操作”not Evil”的搜索引擎的人可能就是幕后的攻击者。如果我打算让人们去登录我的钓鱼链接,我压根就不会在搜索的结果中将它暴露出来。

我猜测,之所以能出现这么明显的攻击漏洞,很可能是真正的网络钓鱼活动还没有开始。不过”The onion crate”将钓鱼链接标记为2017-05-17,这意味着该钓鱼已经存在了一段时间。

请注意/u/vghetto在reddit社交新闻上的回复,他表示这个”The onion crate” 的实例本身也是一个钓鱼的链接。

寻找真正的幕后操作者

最有可能的情况是,这仅仅是一个普通的网络犯罪分子写的一个代理,然后用他自己的地址替换了比特币地址,从而为各种隐藏的服务生成看似合理的隐藏服务地址,进而获利。

起初,我认为这可能是政府的某个情报部门进行的监控活动,他们通过短信隐私来监控用户。但根据分析这种情况不太可能,因为如果要进行秘密监控的话,他们是不会改变比特币地址的,因为这样会让站点不再有效。所以我认为更有可能是普通的网络犯罪者为了监控某个特定的用户群而开发的一个钓鱼网站。

与传统的网络钓鱼网站相比,钓鱼隐藏服务要容易实现的多,因为没有简单的方法来定位隐藏的服务器,没有集中的命名系统,这意味着即使合法的网站在地址中也有随机字符。获得看似合理的地址比较容易,但要做到让你的钓鱼网站被发现后,还没有人有能力撤销你的域名或关闭你的主机就比较难了。虽然这种犯罪方式比较完美,但还是有个缺点,就是这种攻击所针对的用户群往往都精通电脑技术,相对于普通人群来说,他们受骗的几率很小。

缓解措施

SMS隐私客户应确保他们使用HTTPS浏览smsprivacy.org,或者如果使用Tor,则smspriv6fynj23u6.onion是唯一合法的隐藏服务,其他的链接都是有害的。

目前有人被攻击吗?

截止发稿,还没有人联系我,说他遭遇了此类攻击。不过这并不代表,没有人被攻击,有可能用户是在无意中浏览了该钓鱼网站,但他并不知道,这代表目前还没有大规模的攻击后果发生。

进一步的调查

我猜运行这个代理的软件也代理许多其他隐藏的服务,按照正常的逻辑,如果开发者为一个隐藏的服务编写了一些代理代码,而且这个代码可以不断地重复使用,那谁不想多赚点钱,把尽可能多的比特币地址重写为自己的地址。

$ 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隐藏服务的网络钓鱼网站进行对比可能更有趣,这样就能看看它们是否共享某种相同的特性,比如Connection: [object Object], Content-Length的丢失,重写隐藏在小写的服务地址,当比特币地址首次显示时发生延迟,为未知主机名提供500响应。

于是我尝试着探测漏洞,看看是否能找到被代理的隐藏服务的完整列表。有可能在代理代码中就完成了主机名的选择,这意味着请求不同网络钓鱼站点的主机名可能会返回其他钓鱼站点的内容!这将是一个非常明显的攻击指标。

源链接

Hacking more

...