系统安全

使用OUTLOOK的CREATEOBJECT方法和DOTNETTOJSCRIPT进行横向移动

在过去,我通过Windows中的分布式组件对象模型(DCOM)介绍了各种横向移动方法。这通常涉及识别具有允许任意代码执行的暴露方法的DCOM应用程序。在这个例子中,我将介绍Outlook的CreateObject()方法

如果你不熟悉CreateObject(),它实质上允许你实例化一个任意的COM对象。滥用DCOM应用程序进行横向移动的问题在于,您通常处于所用方法的摆布之中。大多数关于技术的讨论涉及滥用ShellExecute(或类似的)方法来启动任意进程或在目标主机上打开恶意文件,这需要在磁盘(或网络共享)上放置有效载荷。虽然这些技术运作良好,但从安全角度来看,它们并不理想。

例如,ShellBrowser / ShellBrowserWindow应用程序只允许您使用参数启动进程,这使得该技术易受命令行日志记录的影响。宏执行的Run()方法呢?那么,这就要求带有恶意宏的文档是本地的或托管在一个共享上(不完全理想)。

如果我们可以通过DCOM获得直接的shellcode执行而不必担心目标文件或任意进程(如powershell或regsvr32)?幸运的是,Outlook是通过DCOM公开的,并让我们覆盖。

首先,我们需要远程实例化Outlook:
$com = [Type]::GetTypeFromProgID('Outlook.Application’,’192.168.99.152’)
$object = [System.Activator]::CreateInstance($com)

完成后,您将拥有可用的CreateObject()方法:

 

如上所述,该方法提供了在远程主机上实例化任何COM对象的能力。这怎么可能被滥用于shellcode的执行?使用CreateObject方法,我们可以实例化ScriptControl COM对象,它允许您通过AddCode()方法执行任意VBScript或JScript:

$RemoteScriptControl = $object.CreateObject(“ScriptControl”)

如果我们使用James ForshawDotNetToJScript技术在VBScript / JScript中反序列化.NET程序集,我们可以通过将VBScript / JScript代码传递给AddCode()方法来实现通过ScriptControl对象执行shellcode。由于ScriptControl对象通过Outlook的CreateObject()方法远程实例化,任何传递的代码都将在远程主机上执行。为了演示这一点,我将使用一个启动calc的简单程序集。PoC C#看起来像这样:

注意:因为它只是C#,所以它也可以是一个完整的shellcode runner 🙂

在编译“有效载荷”之后,可以将它传递给DotNetToJScript并获取一些漂亮的JScript / VBScript。在这种情况下,它将是JScript。

现在已经生成了有效负载,它可以传递给通过远程主机上的Outlook的CreateObject方法创建的ScriptControl COM对象。这可以通过将整个JScript / VBScript代码块存储到PowerShell中的变量中来完成。在这种情况下,我将它存储在一个名为“$ code”的变量中:

最后,所有需要做的就是将ScriptControl对象上的“Language”属性设置为将执行的任何语言(JScript或VBScript),然后使用“$ code”变量作为参数调用“AddCode()”方法:

$RemoteScriptControl.Language = “JScript”
$RemoteScriptControl.AddCode($code)

在调用“AddCode()”方法后,所提供的JScript将在远程主机上执行:

正如你上面看到的,calc.exe已经在远程主机上产生了。

检测和缓解措施:

在上面的屏幕截图中,您可能已经注意到,Outlook.exe是svchost.exe的子版本。这表示Outlook.Application通过DCOM远程实例化,因此应该伸出。在大多数情况下,正在启动的进程将在命令行中包含“-embedding”,这也表示远程实例化。

此外,vbscript.dll或jscript / jscript9.dll的模块加载也应该突出。通常情况下,Outlook不加载这些文件,加载的文件将是使用的ScriptControl对象的指示符。

在这个例子中,有效负载是作为Outlook.exe的子进程运行的,这很奇怪。重要的是要记住,最终,.NET程序集正在执行,这意味着shellcode注入是绝对可行的。攻击者不用简单地启动一个进程,而是编写一个程序集,将shellcode插入到另一个进程中,这会绕过父子关系检测。最终,启用Windows防火墙将阻止此攻击,因为它会停止DCOM的使用。

参考:https://enigma0x3.net/2017/11/16/lateral-movement-using-outlooks-createobject-method-and-dotnettojscript/

本文由安全周翻译。转载请注明出处

(0)

热评文章

发表评论