AMF解析遇上XXE,BurpSuite也躺枪
时间:2022-10-07 23:00:00
0x00 来源
此文译自http://www.agarri.fr/kom/archives/2015/12/17/amf_parsing_and_xxe/index.html、http://codewhitesec.blogspot.sg/2015/08/cve-2015-3269-apache-flex-blazeds-xxe.html,并做出适当的补充。 原作者(以下作者或原作者均表示前一篇原创博文作者)最近在分析两个AMF(Action Message Format)第三方库:BlazeDS和PyAMF。 原作者(以下作者或原作者均表示前一篇原创博文作者)最近在分析两个AMF(Action Message Format)第三方库:BlazeDS和PyAMF。这两个库都收到了XXE与SSRF漏洞的影响。作者发现他写的是用来写的BlazeDS也可以使用代码PyAMF。
首先看一个时间轴:
- 2015年3月,BlazeDS 4.7.0由Apache Software Foundation发布之前的版本是由Adobe所发布。
- 2015年8月,BlazeDS 4.7.1 发布,包含CVE-2015-3269的补丁,该XXE漏洞由Matthias Kaiser(https://twitter.com/matthias_kaiser)所发现。
- 2015年10月,BurpSuite 1.6.29发布,使用它BlazeDS升级至4.7.并默认关闭AMF的解析。
- 2015年11月,BlazeDS 4.7.2发布,包含CVE-2015-5255的补丁,该SSRF漏洞由James Kettle(https://twitter.com/albinowax)发现。
- 2015年12月,BurpSuite 1.6.31发布,更新BlazeDS至4.7.2版本。
- 2015年12月,PyAMF 0.8版本发布,包括CVE-2015-8549的补丁,该XXE/SSRF原博作者发现了漏洞。
0x01 CVE-2015-3269
该XXE漏洞影响了Apache Flex BlazeDS 4.7.1版本之前的所有版本都使用了这些版本BlazeDS的软件产品同样也会受到牵连。这里有一些关于漏洞细节的描述(来源)http://codewhitesec.blogspot.sg/2015/08/cve-2015-3269-apache-flex-blazeds-xxe.html):
每一条AMF新闻包含一个消息头和一个消息体。BlazeDS里的AmfMessageDeserializer提供了readBody()解析消息体的方法,首先通过这种方法ActionMessageInput 的readUTF()依次取出targetURI与responseURI;随后,通过ActionMessageInput 的readObject()阅读后续实际内容。
AmfMessageDeserializer_readBody.java 部分代码
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 46 47 48 49 |
|
readObject函数首先读取接下来的一个字节,这个字节代表了即将读取的数据类型,例如:15表示接下来要读取的数据是XML。如果类型XML,那么接下来readXML函数就会被调用,如下代码:
Amf0Input_readObjectValue.java
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 |
|
可以看到如上代码最后的readXML实现,xml被传入至stringToDocument方法中,该方法属于XMLUtil类。
XMLUtil_stringToDocument.java
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 |
|
当DocumentBuilder由DocumentBuilderFactory所创建时,外部实体的解析默认情况下是被允许的,开发者需要自己去配置解析器以避免XXE漏洞:(factory.setExpandEntityReferences(false);)。由于上面的代码并没有禁止外部实体的解析,因而产生了XXE。相关可参考:腾讯安全应急响应中心
0x02 漏洞利用之一(PyAMF)
以下的python脚本(http://www.agarri.fr/docs/amf_srv.py)将会运行一个在线解析AMF的服务,当然你需要安装PyAMF模块,你可以使用pip install pyamf
来安装,或者是从github获取一份代码(https://github.com/hydralabs/pyamf)后使用python setup.py install
来安装;Ubuntu下也可以用apt-get install python-pyamf
。这里,所运行的PyAMF注册了2个服务,其中一个是echo。首先用原作者所编写好的amf_xxe.py
来对所架设的PyAMF服务进行测试。
1 2 3 4 5 6 7 8 9 10 11 |
|
可以看到,常规的实体可以被成功解析,再进一步试试外部实体。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
这说明PyAMF确实存在XXE漏洞,然而实际的生产环境中,我们却很难找到一个接口,会将解析后的XML数据呈现在返回数据中。当然,我们也知道存在不需要回显的XXE利用办法,但是经过作者的测试发现:(1)远程的URL被禁止使用;(2)没有其它一些好用的URL协议;(3)使用了通用的报错信息,使得我们并不能从报错信息里获得有用的信息。即便如此,用这个漏洞来进行拒绝服务还是可行的,例如通过访问/dev/random
。
1 2 3 4 5 6 7 8 9 |
|
0x03 漏洞利用之二 (跑在Java web服务上的BlazeDS)
lazeDS 在利用上比PyAMF要相对容易得多,这是因为:(1)我们可以使用一些java所支持的URL协议(比如http、ftp、jar)来对内部网络进行刺探;同时在利用上,我们也可以调用外部的DTD文件;(2)错误信息详细,会泄漏出相关的敏感信息;(3)java上的XXE允许通过file协议来进行列目录,这样十分有利于我们查找我们所感兴趣的文件。与PyAMF一样,我们利用的时候,并不需要知道这个AMF服务器到底注册了哪些可用的服务。
为了方便测试,我们可以在本地搭建测试环境,首先从http://sourceforge.net/adobe/blazeds/wiki/download%20blazeds%204/这里去下载2011年版本的BlazeDS,原作者下载的是turnkey格式,下载完成解压后,将解压文件放入Tomcat的bin目录中,然后执行startup.sh
,然后你就可以通过http://127.0.0.1:8400/samples/messagebroker/amf来对BlazeDS进行访问了。我自己所下载的是binary的格式,解压后就是一个war包,自己部署一下,就可以访问了。
部署完成后,就是通过利用脚本amf_xxe.py
对服务进行测试,效果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
可以看到/etc/passwd
文件内容被通过报错信息爆出,作者所使用的利用代码中调用了一个外部的DTD文件:http://somewhere/blazeds.dtd,其内容如下:
1 2 3 4 5 6 |
|
外部DTD中,首先定义了一个参数实体%yolo;然后在参数实体中%c中对其进行了引用;在调用%rrr;时,由于rrr所调用的协议“_”并不被java所支持,导致报错,整个URL全部出现在报错信息中,/etc/passwd
的内容就藏在其中。同样,还可以用来读取tomcat的日志:
1 2 3 4 5 6 |
|
0x04 漏洞利用之三 (使用了BlazeDS的软件产品)
原作者在文中提到了,一些软件产品中也使用了BlazeDS,这些产品如果没有升级打补丁,同样也会受到影响。这些软件包括来自Adobe的ColdFusion 和 LiveCycle Data Services,Vmware的vCenter Server, vCloud Director 和Horizon View。为了对这一说法进行验证,我搜索了一台LiveCycle Data Services的服务器,如下图:
抓包得到amf的接口地址,使用利用脚本对该接口进行测试,结果如下图所示:
同样,我又找到一台Vmware的vCloud Director,同样发现存在问题:
0x05 漏洞利用之四(使用了BlazeDS的客户端软件)
大家常用的BurpSuite就是其中之一,躺枪!虽然最新版本的BurpSuite已经修复了此问题,但是大多数同学手中的版本可能并不是最新版本。根据原作者的说明,一起来看看这个漏洞的效果,由于我本机是windows,所以利用代码是windows的。 首先,创建一个html文件.
1 2 3 4 5 6 |
|
其中调用的amf_win.php
内容如下,该代码的作用就是输出一个恶意构造的含有XML的AMF数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
其中,调用的dyndtd_win.xml
内容如下,目的就是读取C盘下的testfile.txt,然后发送至我们的服务器x.com上:
1 2 3 4 5 6 |
|
接着,我们打开BurpSuite,访问我们精心构造的页面进行抓包。
可以看到,我们打开fortest.html后,burp会访问amf_win.php
,在Wireshark中,我们可以看到我本机的C:\testfile.txt的内容this is a secret!被发送至服务器端。
0x06 额外
-
对于BlazeDS,你可以通过 %foo; ]>的方法来快速暴露出其所在的程序路径,接着就可以继续通过前面所述的方法来进行目录文件列举,寻找我们感兴趣的文件。如下图所示:
-
XXE读取文件内容上的限制使得我们能读取的敏感内容受到限制,具体如何利用该漏洞进行下一步,就看各自的发挥了。
-
在一些对实际案例的测试(包括腾讯某服务器或是一些vCloud Director服务器)中发现,如果使用外部的DTD,一些服务器返回的错误信息是如下的样子:
1
2
3
#!bash
[!] Connection OK, but a timeout was reached...
<
/code
>
造成这个错误信息的原因猜测可能是服务器禁止了外部资源的访问。对于这些服务器,无法使用外部DTD,参数实体又只能在外部DTD中被引用,使得上述的报错读取文件的方法变得不可行。不过,通过XXE来进行拒绝服务可能是可行的,由于担心对目标服务器造成不良影响,并未进行进一步的测试。
本文章来源于乌云知识库,此镜像为了方便大家学习研究,文章版权归乌云知识库!