Office Persistence on x64 operating system
0x00 前言
在之前的文章 《Use Office to maintain persistence》 介绍了在 Office 软件中植入后门的常用方法,但并不全面,缺少 64 位系统的测试。而对于 64 位操作系统,支持 32 位和 64 位两个版本的 office 软件,不同 office 版本的利用方法是否不同呢?本文将要给出答案。
0x01 简介
本文将要介绍如下内容:
- 64 位系统安装 64 位 Office 软件的利用方法
- 64 位系统安装 32 位 Office 软件的利用方法
- 根据测试结果优化 POC
0x02 64 位系统安装 64 位 Office 软件的利用方法
测试系统: Win8 x64
开发工具:vs2012
注:32 位系统下安装 vs2012 支持生成 64 位的 dll
默认主要文件安装目录: C:\Program Files\Microsoft Office
1、Word WLL
- 32 位 dll,无法加载
- 64 位 dll,成功加载
2、Excel XLL
- 32 位 dll,无法加载
- 64 位 dll,成功加载
注:添加导出函数 xlAutoOpen 的方法:
1、使用传统的模块定义文件 (.def)
新建 dll 工程,不选择导出符号
如下图
添加同名文件.def,内容如下:
EXPORTS
xlAutoOpen
如下图
编译成 dll,使用 IDA 查看导出函数
显示正常
如下图
2、使用 vs2012 提供的便捷方法
新建 dll 工程,选择导出符号
如下图
设置导出函数为 xlAutoOpen
如下图
编译成 dll,使用 IDA 查看导出函数
如下图
导出函数名发生变化,改变为 ?xlAutoOpen@@YAXXZ
Excel 无法加载该 dll,原因是无法识别该导出函数(函数名发生变化)
解决方法:使用预处理指示符 #pragma
指定链接选项,修正导出函数名称,添加一行代码:#pragma comment(linker, "/EXPORT:xlAutoOpen=?xlAutoOpen@@YAXXZ")
如下图
再次使用 IDA 查看导出函数,显示正常
如下图
Excel 成功加载该 dll,修改成功
注:已将两种方法的 vs 工程上传至 github,地址如下:https://github.com/3gstudent/Add-Dll-Exports
- 方法 1 对应 DllExport(Def)
- 方法 2 对应 DllExport(declspec)
3、Excel VBA add-ins
使用 32 位的模板即可
4、PowerPoint VBA add-ins
使用 32 位的模板即可
结论:如果在 64 位系统安装了 64 位的 Office 软件,那么 Word WLL 需要使用 64 位的 calc.wll,Excel XLL 需要使用 64 位的 calc.xll
0x03 64 位系统安装 32 位 Office 软件的利用方法
默认主要文件安装目录: C:\Program Files (x86)\Microsoft Office
,存在重定向
注:在目录 C:\Program Files\
也会创建 Office 目录,包含软件版本,也就是说,原 POC 中判断 Microsoft Office 版本的代码不需要更改
注册表位置 HKEY_CURRENT_USER\Software\Microsoft\Office\
并未被重定向至 HKEY_CURRENT_USER\Software\Wow6432Node\Microsoft\Office\
更多关于 32 位程序在 64 位系统下的重定向细节可参考之前的文章《关于 32 位程序在 64 位系统下运行中需要注意的重定向问题》
1、Word WLL
- 32 位 dll,成功加载
- 64 位 dll,无法加载
同 64 位 office 的结果相反
2、Excel XLL
- 32 位 dll,成功加载
- 64 位 dll,无法加载
同 64 位 office 的结果相反
3、Excel VBA add-ins
使用 32 位的模板即可
4、PowerPoint VBA add-ins
使用 32 位的模板即可
结论:在 64 位系统安装 32 位 Office 软件,同 32 位系统测试结果相同,POC 无需修改
0x04 优化 POC
综合以上测试结论,为了使得 POC 支持 64 位系统,需要作如下修改:
判断操作系统位数,如果是 64 位,并且安装 64 位 office 软件,方法 Word WLL 和 Excel XLL 需要使用 64 位的 dll
代码开发注意的细节(powershell 代码):
1、判断操作系统位数
if ([Environment]::Is64BitOperatingSystem)
{
'64-bit'
}
else
{
'32-bit'
}
2、判断安装 office 软件版本
通过查看默认主要安装路径:
- 32 位 office:
C:\Program Files (x86)\Microsoft Office
- 64 位 office:
C:\Program Files\Microsoft Office
判断路径 C:\Program Files\Microsoft Office
是否包含文件夹 MEDIA
如果包含,那么为 64 位 office
powershell 代码如下:
Try
{
dir C:\Program Files\Microsoft Office\MEDIA
Write-Host "Microsoft Office: 64-bit"
}
Catch
{
Write-Host "Microsoft Office: 32-bit"
}
结合 POC 脚本,变量$OfficePath 表示设置的 office 安装路径,默认路径为 "C:\Program Files\Microsoft Office\"+"Office*"
为获取路径 C:\Program Files\Microsoft Office\MEDIA
,需要对变量$OfficePath 进行字符串截取和拼接,具体代码为:
$OfficeMainPath=$OfficePath.Substring(0,$OfficePath.LastIndexOf("\")+1)+"MEDIA"
此时,变量$OfficeMainPath 代表路径 C:\Program Files\Microsoft Office\MEDIA
3、判断 64 位系统+64 位 office,释放对应的 64 位 dll(wll 和 xll)
依旧是通过变量保存作 base64 编码后的 64 位 wll 和 xll
将 dll 文件作 base64 编码:
$fileContent = [System.IO.File]::ReadAllBytes('calcx64.wll')
$fileContentEncoded = [System.Convert]::ToBase64String($fileContent)| set-content ("calc_x64wllbase64.txt")
$fileContent = [System.IO.File]::ReadAllBytes('calcx64.xll')
$fileContentEncoded = [System.Convert]::ToBase64String($fileContent)| set-content ("calc_x64xllbase64.txt")
释放时先做 base64 解密
$fileContentBytes = [System.Convert]::FromBase64String($fileContent)
最终 POC 已在 github 更新,该 POC 能够区分操作系统和 office 版本,当遇到 64 位系统安装 64 位 office 的情况时,自动释放 64 位的 dll
POC 地址如下:https://github.com/3gstudent/Office-Persistence
0x05 小结
本文介绍了 64 位系统安装不同版本 office 所对应的不同利用方法,分享了在优化 POC 时注意的细节,至此完成对该 POC 的开发,便于测试。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论