记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

Office Persistence on x64 operating system

2018-05-25 13:45

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


知识来源: www.mottoin.com/tech/110648.html

阅读:99643 | 评论:0 | 标签:技术控

想收藏或者和大家分享这篇好文章→复制链接地址

“Office Persistence on x64 operating system”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

ADS

标签云