Good in study, attitude and health

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工程,不选择导出符号

如下图

Alt text

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

EXPORTS
xlAutoOpen

如下图

Alt text

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

显示正常

如下图

Alt text

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

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

如下图

Alt text

设置导出函数为xlAutoOpen

如下图

Alt text

Alt text

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

如下图

Alt text

导出函数名发生变化,改变为?xlAutoOpen@@YAXXZ

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

解决方法:

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

添加一行代码:

#pragma comment(linker, "/EXPORT:xlAutoOpen=?xlAutoOpen@@YAXXZ")

如下图

Alt text

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

如下图

Alt text

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


LEAVE A REPLY