探索Mobile Me:WebDAV目录遍历与隐藏文件发现技术

本文详细分析了Mobile Me服务的公开文件访问机制,通过WebDAV协议实现目录遍历,探讨JSON与XML数据格式转换技巧,并揭示用户代理字符串对隐藏文件可见性的关键影响。

Mobile Me Madness

我最近发布了我的Bucket Finder脚本,Darren在Hak5的一期节目中介绍了它。我收到一些反馈指出Mobile Me以相同的方式工作,允许用户通过以下风格的URL访问他们的公共账户:https://public.me.com/<账户名称>。知道Mobile Me存储的是个人信息而非商业信息,并且它与桌面端链接,我认为这将提供相当丰富的收获。不幸的是,Mobile Me不再接受新注册,所以我所做的所有分析都基于现有数据。

我发现一个账户有多个公共文件,并开始查看源代码,我注意到的第一件事是屏幕上显示的文件都不在源代码中,所以我推测我们必须查看某种AJAX调用来检索文件列表。使用Firebug,我发现了以下被调用并返回我所需要数据的URL:

https://public.me.com/ix/XXXX?protocol=roap&item=properties&repfmt=swjson&depth=1&reqid=1234566778888⟨=en

访问此URL会以JSON格式给出一个漂亮的目录列表,我可以处理JSON,但更愿意处理XML,因为我已经有了处理它的框架,所以我开始操作查询字符串。我发现我可以删除reqid和lang字段,没有任何变化,将depth改为2会给出深度为2的目录列表,但改为3或以上会给出错误消息,所以虽然很希望,但不可能将其设置为99并一次性转储整个列表。

最重要的变化是当我删除repfmt字段时,返回的数据神奇地变为XML。这好多了!这让我得到URL:

https://public.me.com/ix/XXXX?protocol=roap&item=properties&depth=1

以及以下XML,我已缩减以显示一个文件和一个目录:

 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
42
43
44
45
<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:">
<D:response xmlns:D="DAV:">
 <D:href>/ix/hank/
 <D:propstat>
  <D:prop>
   <D:modificationdate>2011-03-28T15:39:25Z
   <D:getlastmodified>Mon, 28 Mar 2011 15:39:25 GMT
   <D:resourcetype>
    <D:collection />
   </D:resourcetype>
   <D:creationdate>1969-12-07T23:08:01Z
   <D:getetag>1
  </D:prop>
  <D:status>HTTP/1.1 200 OK
 </D:propstat>
</D:response>
<D:response xmlns:D="DAV:">
 <D:href>/ix/XXXX/file.mp4
 <D:propstat>
  <D:prop>
   <D:modificationdate>2009-12-09T02:33:00Z
   <D:getcontentlength>118727222
   <D:getlastmodified>Wed, 09 Dec 2009 02:33:00 GMT
   <D:resourcetype />
   <D:creationdate>2009-12-09T02:12:10Z
   <D:getetag>"u-1abcdefn-5hp-gbsyk1134-6p8vze7o0"
  </D:prop>
  <D:status>HTTP/1.1 200 OK
 </D:propstat>
</D:response>
<D:response xmlns:D="DAV:">
 <D:href>/ix/XXXX/folder/
 <D:propstat>
  <D:prop>
   <D:modificationdate>2011-02-13T19:46:51Z
   <D:getlastmodified>Sun, 13 Feb 2011 19:46:51 GMT
   <D:resourcetype>
    <D:collection />
   </D:resourcetype>
  </D:prop>
  <D:status>HTTP/1.1 200 OK
 </D:propstat>
</D:response>
</multistatus>

看起来像WebDAV,这给出了选择:解析为XML或找到并学习一个WebDAV库。既然我已经理解XML并且对WebDAV一无所知,我选择了解析XML。这很简单,如果D:resourcetype包含D:collection,那么它是一个目录,否则它是一个文件。对于文件,转储URL和相关信息。如果是一个目录,那么更改URL指向该目录并递归。

这应该就是它了,它是简单的XML,解析它并继续,但我在用浏览器进行初步侦察时注意到,JSON包含了*nix称为隐藏文件和目录的内容,那些以点开头的。我注意到的主要是.Trashes,OS X的回收站。当我查看我的脚本输出时,我的测试用户的.Trashes目录缺失了。

我的第一个想法是JSON和WebDAV之间的差异,但改回JSON并没有使隐藏项重新出现。两个请求之间一定有差异,所以我加载了Burp,让它代理Firefox和我的脚本,然后开始摆弄字段,直到我终于找到了关键差异:用户代理字符串。事实证明,使用默认的Ruby用户代理,我不会得到隐藏文件,但如果我切换到Firefox用户代理,它们就会出现。

我不知道为什么会这样,尤其是因为Web界面随后会隐藏这些文件,所以即使它们被返回,也从未实际使用。无论如何,将新的用户代理添加到脚本并重新运行,拉取了所有文件,包括隐藏文件。

我认为垃圾桶是一个相当重要的目录,因为人们可能会将文件放入他们的公共文件夹,但随后意识到他们做了什么,并删除它们,而没有意识到它们仍然可以在垃圾桶中恢复。其他文件,如.DSStore,也可能包含有用的信息,所以它们值得检查。

该脚本名为Me Finder,您可以从其项目页面下载。

与Bucket Finder一样,我已经运行了几个单词列表并进行了一些分析,您可以在这里阅读相关内容 - 分析Mobile Me。

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