如果你正在阅读本文并且你是一个软件开发人员,你很有可能在本地运行一些服务。Redis, Memcached和Elasticsearch 都是许多开发者常用的软件产品但你可能不知道的是,这些运行在本地的服务通过任何你访问过的网站就能访问到,也就是为那些想要窃取你的本地数据的坏人提供了途径。

 

如何操作

虽然我没有用到任何新的方法,但是还从没有人像我即将展示的这样把攻击手段这样结合起来的。我结合了两种不同的攻击方式,分别是“跨协议脚本”和“DNS Rebinding(

DNS重绑定)”。

 

关于Redis, Memcached和Elasticsearch 

 

第一个所用的技术比较古老,叫做“跨协议脚本”。2001年所发表的一片论文详细介绍了此攻击方法,主要是利用了Redis和Memcached都有的一个基于行的协议,该协议忽略任何无效指令。这意味着如果一个浏览器发送了如下的HTTP请求到localhost:6379 (Redis通常运行的地址),Redis会自然执行SET命令。

 

POST / HTTP/1.1

Host: localhost:6379

 

SET abc 123

QUIT

 

我们可以发送一个请求如下所示:

 

<form enctype="text/plain" method="POST" action="http://localhost:6379">
<formfield name="abc">
 
SET abc 123
QUIT
</formfield>
<input type="submit" value="Submit" />
</form>

Elasticsearch的协议是完全基于HTTP的,所以不需要任何把戏就能和它通信。

 

虽然我们可以执行任何的命令,我们实际上不能取回结果。这是因为浏览器的同源策略(same-origin policy),该策略确保无法从来自其他域的请求中读数据。这时就用到我们的第二个技术了!

 

DNS Rebinding

 

为了绕过原先的保护策略,我们可以使用一项叫做DNS Rebinding的技术。DNS Rebinding能够以极低的TTL通过公共域获得任意服务器的访问权限。一旦一个浏览器连接了这个站点,这个站点就会立即修改DNS记录,将它指向一个不同的IP地址(比如120.0.0.1)。这会指向站点运行攻击者代码的地址,一个私人的IP地址。之后,就可以利用这个站点窃取服务器上的任何数据了,不过只对通过授权的客户端有效。

PoC

 

我将此攻击的原理放在extractdata.club上了。这个站点会连接Redis, Memcached和Elasticsearch 运行在localhost的默认端口。

 

一分钟之后该链接应该显示如下图所示:

https://static.jiayezz.com/3b/9901b3115750ae4e59346fcfc09fdd

虽然我的PoC只能取回每个服务器的版本信息,不难想象创造一些scraper

插件就可以爬取整个数据库并抓取所有的数据。代码可以点击获取。

 

解决方法

 

不幸的是,我们没有从数据库的结构上解决这个问题的方法。你可以为你的服务器设置密码,但是只要服务器的默认设置有漏洞,还是会有很多用户的数据被窃取。针对Redis

和Memcached我能想到的唯一方法就是添加Host:作为QUIT的同义词,这样只要它被识别成为一个HTTP请求,连接就会立刻终止。

 

另一个可以改善的地方在浏览器中。浏览器供应商可以使用“DNS pinning”,从而自动忽略网址加载之后的DNS修改。

 

或者浏览器供应商可以把Redis和Memcached的端口添加到他们的端口黑名单上,这个名单已经包括了一些常见协议比如SMTP和IRC。这并不算一个一劳永逸的结构上的解决方法,且新涌现的服务还是容易受到攻击。

 

深入讨论

 

对有些人来说他们的开发数据库中有数据被盗可能不是什么大事,但是读和写权限可能会导致远程代码的执行。举例说明,攻击者可能在自己的payload上覆盖一些看起来像是Ruby或Python处理数据的东西,而这其实会对开发者的计算机造成危害。


 

总结

 

我们想要证明的是为什么信息安全极难保证。这个攻击针对于多个软件产品,不仅针对它们的正确工作方法给出了充分的指示,还指出了正是它们之间的通信导致了漏洞的出现。


文章原文链接:https://www.anquanke.com/post/id/84329