导语:本文的主要目的是帮助读者了解Emotet的结构和流,所以代码的变化并不会对恶意软件的分析产生影响。本文还将详细介绍代码中比较重要的部分来深刻理解恶意软件详细的执行过程。
Emotet银行木马恶意软件已经出现一段时间了。Infosec的研究人员尝试去开发工具来解混淆和解密恶意软件中AES加密的代码。这些工具面临的共同问题是仅针对于恶意软件的当前活动版本。而当恶意软件作者修改了代码后,开发的工具就不能用了。
Emotet概览
分析样本
File: PAYMENT 225EWF.doc MD5: e8e468710c0a4f0906305c435a761902 SHA-256: 707fedfeadbfa4248cfc6711b5a0b98e1684cd37a6e0544e9b7bde4b86096963
当前版本的Emotet下载器用PowerShell来执行最后的命令。感染单元是传统的邮件钓鱼活动。钓鱼邮件中含有受害者可能会点击的链接,一旦点击就会开始下载恶意软件。恶意软件一般是一个word文档,会让用户启用宏。一旦宏被启用,VBA就会在后台执行,同时在受害者的计算机上下载和执行payload。
VBA代码
下面看一下如何从受干扰的word文档中去访问VBA代码。首先要开启开发工具,具体操作步骤为文件选项(Options)自定义功能区(Customize Ribbon)勾选开发工具(Developer),点击确定(OK)。
之后在顶部菜单栏就有开发工具(Developer)了,点击开发工具后,就可以看到Visual Basic选项。
点击Visual Basic,就会在单独的窗口中出现一个新的工程。然后开始分析代码。
可以通过运行VM中的文档和检查Powershell使用的参数来使用自动化的方式来提取Powershell脚本。Hybrid Analysis这样的沙箱就可以自动化地去提取。
代码执行
一旦启用宏内容,执行就开始了。
VBA代码是恶意MS office文档的一部分。一旦启用宏,代码就会在后台执行。
开发者在代码中使用了一些无用的文本来达到混淆代码的目的。而使用的这部分代码隐藏的很深。
一种直接分析代码的方式是在宏代码被调用执行时开始。在分析的样本中,这个开始点就是Sub AutoOpen()。研究人员从下面的sub过程开始分析。
在分析的过程中,研究人员将没有使用的代码丢弃了
在sub过程的最后,调用了Application.run方法:
为了执行上面的方法,可以看到该方法在sub和函数中都被调用了。
首先看一下,sub ndUzTzJ.
这个sub也有一些无用的文本,目的就是增加分析的复杂度。这里还是关注被使用的代码。
下面是丢弃无用代码后的sub:
分配给vbHide的值是0,也就是说窗口是隐藏的,focus会传递给隐藏的窗口。
· DsPBkKtzcIwF – 生成命令。
· ndUzTzJ – 调用WScript.Shell来执行命令。
下面看一下Function DsPBkKtzcIwF()部分代码:
从上面的代码段可以看出:
很多变量被用来存储分配的值,然后传递给一个不同的函数yy222222222222222y()处理。处理后,该值会被分配给不同的变量,而这些变量会被用来构建加密的代码,这些加密的代码会被传递给系统做解密使用。
深度分析
JMArl = “zahajUZomiAjVADEAMAA4ADMdpokrTZ”
分配给变量JMArl的值是 “zahajUZomiAjVADEAMAA4ADMdpokrTZ”。
szFqp = sRWNiPRldXLv = 21790 + 2115454 * PhcMjZjwl – CLng(8712932) / (zunFnTXk – Sqr(1328634 * Oct(7463260) – 1977628 – 4976151) * (294265 / XiFEWH)) vLkhkiRclJ = GcDcX = 3122978 + 1398811 * JTkURPW – CLng(9593915) / (krXPEiFIa – Sqr(1266549 * Oct(1775652) – 8314095 – 5625841) * (8872696 / mNsSkdPD))
上面的代码没有使用,丢弃。
sEVQo = IjKrpJC + yy222222222222222y(JMArl, 14, 11)
这是大多数动作发生的地方,分配给变量sEVQo的值是IjKrpJC + yy222222222222222y(JMArl, 14, 11)。
“IjKrpJC”没什么用,丢弃。
在这里调用了函数yy222222222222222y(),下面我们看一下这个函数:
去除无用代码后再看一下:
该函数在Mid函数上调用,而Mid函数负责处理数据未来使用。
Mid函数
hPoMiTjfoDT是TEXT; twOYMDvfbGk谁START_POSITION; VSTcawBYGW 是NUMBER_OF_CHARACTERS
现在我们知道了构建的代码流,下面我们看一下程序是如何执行的。
这是在没有被分配值的sEVQo:
sEVQo调用了yy222222222222222y()函数,14被传递给函数变量“twOYMDvfbGk”:
sEVQo = IjKrpJC + yy222222222222222y(JMArl, 14, 11)
然后“11”也被传递给函数变量“VSTcawBYGW”:
sEVQo = IjKrpJC + yy222222222222222y(JMArl, 14, 11)
最后,文本字符串会被传递给变量mbPRLWAjZ,之前变量mbPRLWAjZ为空:
然后,用Mid函数去处理该数据。
下面看一下如何展开的:
mbPRLWAjZ= zahajUZomiAjVADEAMAA4ADMdpokrTZ twOYMDvfbGk= 14 VSTcawBYGW= 11 Mid(hPoMiTjfoDT, twOYMDvfbGk, VSTcawBYGW): Mid(“zahajUZomiAjVADEAMAA4ADMdpokrTZ”, 14, 11)
会被翻译为:
ADEAMAA4AD
下面看一下执行的函数:
会被传递会调用变量:
变量sEVQo会被分配一个值ADEAMAA4AD。这也是函数中使用的多个变量之一。
下面看一下给变量的最后一个任务,来看它是如何变成最后的这个值的:
上面这行代码执行后,分配给DsPBkKtzcIwF的值会sub ndUzTzJ将要执行的命令:
可以用MsgBox来输出结果到屏幕来查看最后的结果。
这是调用PowerShell的部分命令:
应该翻译为:
这就是如何用VBA代码外的解密数据获取最后的命令。
下一部分,将解密数据来从中提取第二阶段的payload URL。