安全路透社
当前位置:安全路透社 > 网络转载 > 正文

WSH注入技巧分享

前言

在2017年纳什维尔BSides会议,Casey Smith (@SubTee)与我联名发表了一篇主题名为Windows Operating System Archaeology的演讲。在这次演讲中,我们发布了一些利用Windows中的组件对象模型(COM)的攻击技巧。其中一项技巧就有描述攻击者通过控制输入,将数据传递给调用的GetObject()函数,今天我们就来详细讲讲。

在某些场景,运维人员会使用白名单来阻止未签名的Windows Scripting Host (WSH)文件运行,在恶意.js或者.vbs文件泛滥的今天,这种方案使用频率也高了起来。然而,通过将恶意代码注入到微软签名的WSH脚本,我们可以绕过该限制。

在深入讲解之前,我们必须要对其背后的运行原理有充分的了解。在进行注入操作时利用攻击者控制的输入,将数据传递给GetObject(),之后再结合“script:” 或者 “scriptlet:” COM Monikers

GetObject()

该方法允许你访问一个已经实例化的COM对象,如果当前没有已经实例化的COM对象,那么这次调用则会失败。例如通过GetObject()函数访问Microsoft Excel的COM对象应该这样调用:

Set obj = GetObject( , "Excel.Application")

上面语句执行后会运行一个Excel的实例,更多关于GetObject()函数情况可以访问这里

COM Monikers

GetObject()其本身就非常有趣,它仅仅允许我们访问一个已经实例化的COM对象。为了绕过这个限制,我们可以通过实现COM moniker来促进我们的payload有效执行。如果你对COM monikers不是太熟悉,你可以阅读这份文档,在Windows中有各种各样的COM monikers允许你以不同的方式使对象实例化。从攻击角度来讲,你可以使用这些monikers来执行恶意代码,这在以后我们会讲解。
在本文呢,我们则将焦点放在“script:” 以及 “scriptlet:” monikers,这些带有scrobj.dll的特定monikers接口会促进COM scriptlets的有效执行。以上都可以在Casey Smith (@SubTee)于DerbyCon 2016上讨论的技巧中找到相关资料。
COM scriptlet示例:

<?XML version="1.0"?>
 var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
 ]]>
 </scriptlet>

你也可以使用James Forshaw (@tiraniddo)开发的DotNetToJScript工具,在COM Scriptlet中对JScript/VBScript进行扩展,以允许Win32 API的访问甚至是执行Shellcode。当你把这两个monikers其中之一与各种GetObject()相结合,它们之间将碰撞出绚烂的火花!
以上简短的介绍了COM的背景,是时候进行实际操作了。

PubPrn.vbs

在Windows 7以上版本存在一个名为PubPrn.vbs的微软已签名WSH脚本,其位于C:\Windows\System32\Printing_Admin_Scripts\en-US,仔细观察该脚本可以发现其显然是由用户提供输入(通过命令行参数),之后再将参数传递给GetObject()

案例研习:WSH注入技巧分享

也就是说我们可以运行该脚本,然后按照预期将这2个参数传递出去。第一个参数是啥无所谓,第二个参数则是通过script: moniker构造的payload
注意:如果你在第一个参数中提供了一个非网络地址的值(因为其预期是一个服务器名称),你可以加上/b切换到cscript.exe

案例研习:WSH注入技巧分享

本文仅仅只是一个普通例子,事实上肯定还有很多其他类似的利用方式,本文仅作抛砖引玉。

参考来源:specterops,freebuf小编鸢尾编译,转载请注明来自FreeBuf.com

未经允许不得转载:安全路透社 » WSH注入技巧分享

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册