导语:对于64位操作系统,支持32位和64位两个版本的office软件,不同office版本的利用方法是否不同呢?本文将要给出答案。

0x00 前言

在之前的文章《Office后门的实现思路》介绍了在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 FilesMicrosoft Office

1、Word WLL

32位dll,无法加载

64位dll,成功加载

2、Excel XLL

32位dll,无法加载

64位dll,成功加载

注:

添加导出函数xlAutoOpen的方法:

1、使用传统的模块定义文件 (.def)

新建dll工程,不选择导出符号

如下图

2-1.png

添加同名文件.def,内容如下:

EXPORTSxlAutoOpen

如下图

1500860498757020.png

编译成dll,使用IDA查看导出函数

显示正常

如下图

1500860511905229.png

2、使用vs2012提供的便捷方法

新建dll工程,选择导出符号

如下图

2-4.png

设置导出函数为xlAutoOpen

如下图

1500860532203786.png

编译成dll,使用IDA查看导出函数

如下图

2-7.png

导出函数名发生变化,改变为[email protected]@YAXXZ

Excel无法加载该dll,原因是无法识别该导出函数(函数名发生变化)

解决方法:

使用预处理指示符#pragma指定链接选项,修正导出函数名称

添加一行代码:

#pragma comment(linker, "/EXPORT:[email protected]@YAXXZ")

如下图

1500860594884825.png

再次使用IDA查看导出函数,显示正常

如下图

1500860603171789.png

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_USERSoftwareMicrosoftOffice

并未被重定向至HKEY_CURRENT_USERSoftwareWow6432NodeMicrosoftOffice

更多关于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 FilesMicrosoft Office

判断路径C:Program FilesMicrosoft Office是否包含文件夹MEDIA

如果包含,那么为64位office

powershell代码如下:

Try  {      dir C:Program FilesMicrosoft OfficeMEDIA    Write-Host "Microsoft Office: 64-bit"}Catch  {     Write-Host "Microsoft Office: 32-bit"}

结合POC脚本,变量$OfficePath表示设置的office安装路径,默认路径为"C:Program FilesMicrosoft Office"+"Office*"

为获取路径C:Program FilesMicrosoft OfficeMEDIA,需要对变量$OfficePath进行字符串截取和拼接,具体代码为:

$OfficeMainPath=$OfficePath.Substring(0,$OfficePath.LastIndexOf("")+1)+"MEDIA"

此时,变量$OfficeMainPath代表路径C:Program FilesMicrosoft OfficeMEDIA

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的开发,便于测试。

源链接

Hacking more

...