【技术分享】WSH注入:实例一则

https://p4.ssl.qhimg.com/t010b4324a47984272e.png

译者:h4d35

预估稿费:110RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


前言

在2017年举办于纳什维尔的BSides会议上,Casey Smith(@SubTee)和我(Matt Nelson,@enigma0x3)做了一个题为《Windows Operating System Archaeology》的演讲。在这个演讲中,我们展示了一些在Windows中利用组件对象模型(Component Object Model,COM)的攻击技术。接下来我将讨论在上述演讲中提到的利用攻击者控制的输入来调用GetObject()函数进行攻击的方法。

某些系统环境使用白名单来防止未签名的Windows Scripting Host(WSH)文件运行,特别是随着恶意的.js或.vbs脚本文件越来越多。然而,通过将我们的恶意代码注入到一个经过微软签名的WSH脚本中,我们可以绕过这样的限制。

在深入研究那些可以被用于注入的脚本之前,了解一下其中的工作机制很重要。在进行注入攻击时,我们利用攻击者控制的输入作为参数传递给GetObject()函数,然后将其与script:scriptlet:COM标记相结合。

GetObject()函数

此方法允许你访问某个已实例化的COM对象。如果没有该对象的实例(如果以不含COM标记的方式调用),那么该函数调用将会执行失败。例如,通过GetObject()函数访问Microsoft Excel的COM对象的方法如下所示:

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

为了使上述代码工作,必须有一个Excel的实例在运行。点此了解更多更多关于GetObject()函数的信息。 

COM标记

虽然GetObject()函数本身很有趣,但它只允许我们访问一个已经实例化的COM对象。为了解决这个问题,我们可以实现一个COM标记来方便我们的payload执行。如果你不熟悉COM标记,可以点此阅读更多相关信息。Windows系统中有许多不同的COM标记,允许你以各种方式实例化对象。从攻击的角度来看,你可以使用这些标记来执行恶意代码。不过这是另外一篇博客文章的主题了:-)。

就本文而言,我们将重点介绍script:scriptlet:这两个标记。这些特定的标记与scrobj.dll配合,有助于COM脚本的执行,而这将作为我们的Payload。这是由Casey Smith(@SubTee)发现的,在2016年的DerbyCon上进行了讨论,并且发表了文章

如下所示是一个COM脚本:

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

你还可以使用James Forshaw(@tiraniddo)开发的工具DotNetToJScript在COM脚本中扩展JScript/VBScript,该工具允许调用Win32 API,甚至执行Shellcode。 当你将这两个COM标记中的任意一个与GetObject()函数的各种调用相结合时,情况将会变得很有趣。

非常简短的COM背景知识介绍已经结束,是时候来看一个实例了。

PubPrn.vbs

在Windows 7及更高版本的Windows系统中,有一个名为PubPrn.vbs的已被微软签名的WSH脚本,它位于C:WindowsSystem32Printing_Admin_Scriptsen-US目录中。看一下这个脚本的代码,很显然,它接收用户提供的输入作为参数(通过命令行参数)并将参数传递给GetObject()函数。

http://p9.qhimg.com/t01f2a245b6a5d8bf21.png

这意味着我们可以运行这个脚本并传递它所期望的两个参数。第一个参数可以是任何东西,第二个参数是通过script:标记方式传递的Payload。

注意:如果你提供的第一个参数值不是一个有效的网络地址(因为它需要一个ServerName),则可以在调用时为cscript.exe增加/b参数,以便抑制额外的错误消息。

http://p1.qhimg.com/t01c8856295ceea9631.png

由于VBScript依靠COM组件来执行操作,因此它在许多Microsoft签名的脚本中被大量使用。本文仅提供了一个实例进行说明,一定还有其他脚本能够以类似的方式被利用。我鼓励你去继续探索。

(完)