免责声明:
通过阅读此博客,您同意此帖子仅用于教育目的,并且我不对您的机器造成的任何损坏或本文中提到的应用程序造成的损坏负责。与本博客中包含的材料相关的任何行动和/或活动均由您独自承担。滥用本网站上的信息可能导致对相关人员提起刑事指控。如果对任何滥用本博客上信息的个人提起刑事指控,我也不会承担任何责任。
本帖包含可能造成损害或危险的材料。如果您不完全理解某些内容,建议您停止您正在做的事情,退出此网站,或在继续之前提出问题和/或进行研究。在访问、使用或以任何其他方式利用可能存在问题的资料之前,请参考您所在省/国家的法律。
介绍
在过去的几周里,我一直在孜孜不倦地努力跟上新一波恶意 MS Word 文档的步伐,这些文档旨在危害用户凭证、银行信息甚至公司数据。
这些 Word 文档中有许多都包含恶意宏,单击“启用内容”后,该宏就会运行并执行其编程要运行的任何命令。该宏可以执行任何操作,从下载植入程序到安装恶意应用程序,甚至为设备安装后门。
如今,许多公司都利用电子邮件、终端和网络保护来保护其用户和宝贵资产,但这并不意味着我们 100% 安全。某些 AV 执行的签名和启发式扫描可以捕获其中一些文件,但很多时候它们都做不到 - 尤其是当它们是新的并且使用以前从未见过的方法或技术时。即使是简单的自制混淆技术也可以绕过某些 AV 和监控设备。
那么,如果其中一个文件确实突破了我们的保护并被发送给我们的用户,我们该怎么办?
嗯...这就是你进来的地方!
在蓝队工作让我获得了大量宝贵的经验,学习如何保护网络。其中一项技能是学习如何对恶意宏进行逆向工程(好吧……也许更像是调试……但仍然如此!),这使我能够看到正在执行的内容、宏正在下载的内容、它正在访问的位置以及 IOC是什么。
这些信息反过来又使我和我的团队能够迅速采取行动,在我们的防火墙上阻止 URL 和 IP,检查 Sysmon、SIEM 和 NSM 日志以查明感染源。这最终可以遏制和消除威胁,恢复任何丢失的数据,并总体上保证我的公司和用户受到保护。
好了,我说得够多了...让我们开始正题吧!
攻击向量
许多恶意 MS Word 文档的常见攻击媒介是通过电子邮件。我将向您介绍的这个案例的有趣之处在于,攻击者之前曾入侵过供应商的电子邮件,然后利用该电子邮件向其他员工发送看似“合法”的电子邮件。
这表明攻击者花了一些时间研究单独的通信,并专门针对某些用户,以便他/她能够利用他们的信任。
有问题的恶意文档名为“ OAC_Request.doc ”,虽然它看起来是合法的,但有一件事很突出,在打开文档时应该引起警惕。
当我们看到一份显示这样的图像的文档,并附有单击“启用编辑”或“启用内容”的指示时,我们立即知道其中附加了一个恶意宏。
注意:上图没有显示黄色的“启用编辑”按钮,因为这是混合分析的屏幕截图,并且在那里启用了宏以允许对宏进行动态分析。
[1] 恶意文档 - SHA256:f11b7237907275ca59ce4f0b630f69a6c3770b0060359917bf465690e2309e47
好的,现在我们已经掌握了恶意文档,我们需要安全地提取宏来查看它在做什么。
实际上,我们可以使用一个很棒的工具来实现这一点,它叫做oledump.py,由 Didier Stevens 创建,可以让我们分析 OLE 文件及其包含的数据流。
但要使 oledump 正常工作,请确保在 Windows VM 上安装了Python 2.7.14。安装后,打开命令提示符并导航到下载和提取 oledump 的文件夹。此外,请确保将要分析的恶意文档也移到该文件夹中。
在我们的命令提示符中,我们可以简单地运行oledump.py恶意文件的名称来查看所有流。
流旁边的字母“ M ”表示该流包含 VBA 宏。在本例中,它是流A3。
一旦我们知道哪个流包含 VBA 宏,我们就可以使用-s开关后跟流号来转储其内容。
此时,您可能会想……“糟糕,这是垃圾!”但别担心,它真的不是。VBA 宏的源代码在存储在流中时是压缩的。所以我们可以使用开关-v解压缩 VBA 宏,然后我们就可以看到源代码了!
太棒了!我们得到了宏的源代码。初步查看后发现,变量的名称很奇怪,这样做是为了混淆,并迷惑任何试图分析宏的人。
有些人可能会建议尝试解码变量名称或其他内容……但完全不必担心。我们可以保持变量原样,只需简单地调试 VBA 宏即可查看代码的作用。
调试 VBA 宏
首先,打开 MS Word,然后按ALT+F11打开 MS VBA 控制台。这样我们就可以粘贴宏并进行调试。
打开后,复制整个宏但不复制属性。在本例中,我们复制所有内容,Sub AutoClose()如下所示。
让我们快速看一下宏的前几行,看看它的作用。
我们可以看到建立了一个名为的数组roans。接下来,作者创建了一个名为的新变量totoro并将其设置为该变量ceraunogram,该变量接受roans数组中的值。
我们可以假设这ceraunogram是这个宏的某种子程序,它的输出是恶意命令。
下一行验证了我们的假设,因为我们可以看到Application.Run正在调用另一个子过程chillumchee,该子过程启动了一个 VBA Shell 并执行totoro。
请注意,在调试时,如果您在独立虚拟机之外执行此操作,请确保不要执行或逐步执行Application.Run命令,因为这将执行宏。
现在我们知道了宏的初始工作原理,我们可以利用 VBA 中的“监视窗口”功能。
监视窗口可用于检查变量的状态。本文档中的恶意宏将反混淆信息存储在全局变量中,然后在后续变量中使用该反混淆信息。
我们可以使用这个监视窗口来“监视”变量如何变化,以及哪些恶意代码最初被反混淆以供宏使用。
如果单击“监视窗口”图标,监视窗口将显示在 VBA 控制台的底部。要将变量添加到监视窗口,请右键单击代码窗口中的任意变量,然后选择“添加监视”。
我们首先为全局变量添加一个监视条目totoro。
完成后,您将看到一个弹出窗口,其中显示您要添加的表达式。继续并单击“确定”。
之后,如果您看向屏幕底部的监视窗口,您应该会在那里看到您的表情及其当前值。
好的,我们现在有了一个可以观察的新表达式。但在添加任何表达式之前,让我们进入宏开始调试它。
要进入,只需按F8。
再按几次F8ceraunogram ,直到我们进入该函数,或者如果您正在分析不同的恶意宏,则进入第一个函数。
进入函数后,我们在继续之前先将ceraunogram其添加erasable到我们的监视窗口中。
好的,我们来快速分析一下这个函数。
我们可以看到建立了两个新数组,malope和roughhoused。我们还看到 erasable 被设置为 Null String,并且还看到在函数末尾erasable再次调用,但这次是针对StrReverse函数。然后将反转的字符串设置为ceraunogram变量。
此时我完全可以假设那ceraunogram将是我们的恶意命令。
我们继续前进,稍微前进一点,直到到达循环For Each。
在这里我们看到,对于每个paraphrenic或者我猜我们可以在roans数组中调用“item”,我们运行另一个函数trinely,该函数从数组中获取项目roans,并将malope数组作为参数。
然后将其输出设置为表达式,ore根据下一行,该表达式似乎是一个整数。之后,erasable将其设置为等于roughhoused数组中的一个元素,该元素在数组中的位置由ore变量声明。
这个循环似乎经过多次,并不断添加到的开头erasable。
好的 - 从这里我们可以再介入两次并看看该trinely函数的作用。
快速浏览一下,我们发现这个函数与之前的函数非常相似。这个函数drolled从preludium数组(从技术上讲是数组)中获取一个元素()malope,然后逐步执行,直到数组中的字母malope与数组中的字母相同,germaneness也就是数组中的当前元素roans。
如果是,则进行一些数学运算,并将整数传递到ore前一个函数中,然后从roughhoused数组中提取一个元素并将其设置为erasable。
我知道这现在看起来可能令人困惑,而这正是这个宏的全部意义所在——它使得解码和理解它变得困难。
好的,解释得够多了。让我们确保将germaneness
、drolled
和添加russophobist到我们的监视窗口中,然后看看它的实际效果。
我们马上就能看到它germaneness被设置为“ d ”,即roans数组中的第一个元素。如果我们多次遍历,我们可以看到它drolled改变了数组中的元素malope。
好吧 - 我们对发生的事情有了一点了解。让我们继续逐步了解,直到找到该Next函数。
此时,如果我们看一下erasable “Watches”窗口中的表达式,我们会看到它当前设置为“ m ”。
从这里开始,如果我们继续前进,我们应该会看到更多的字母被添加到erasable表达式中。
我在下面添加了一个小视频,演示了我如何逐步执行宏。注意表达式变量如何变化以及它们如何开始在erasable变量中形成命令。最后我只需按住F8 键即可更快地进入,只是为了向您展示命令的初始启动。
注意:我建议您在新标签页中打开此视频以更好地了解发生了什么。
经过几百次左右的输入后,我们可以看到erasable形成了单词“ .athsm ”。如果我们将其反转,就像宏一样,我们会得到“ mshta ”。
因此,从其要点来看我们已经知道该命令将利用用于执行.HTA文件的mshta Windows exe 。
好的,现在我们知道了,我们现在需要找出 HTA 文件从哪里下载。
ceraunogram从这里,我们在发生字符串反转的函数上设置一个断点。
我们只需单击行的左侧即可设置断点。会出现一个带有红色高亮的红点,表示已设置断点。
一旦完成,按F5继续执行宏。宏应该直接在我们的断点处停止。
完成后,让我们看一下我们的监视窗口,我们应该看到表达式ceraunogram包含恶意的 mshta 命令。
这表明mshta.exe访问恶意 URL 并下载我们的恶意 HTA 文件。
解码HTA文件
现在我们知道了宏的作用,我们可以继续并关闭调试窗口,因为我们不再需要它了。
此时,我们需要 HTA 文件来查看执行了哪些其他命令。为此,我再次利用Hybrid Analysis下载了已投放的 HTA 文件的副本。
下载文件并打开后,我们会看到一些 JavaScript 代码。
快速查看代码,我们可以看到该函数lopomeriara包含我们的恶意命令。我们可以看到正在使用decodeURIComponent函数,它将URL编码解码为ascii,然后使用replace删除所有空格。
这反过来又变成p%20o%20w%20e%20r%20s%20h%20e%20l%20l了powershell。
好的 - 我们取得了进展!运行宏后,此 HTA 文件似乎正在设备上执行某种PowerShell命令。
我们现在需要做的是lopomeriara完整解码变量。为此,我利用安装在 Windows VM 上的NodeJS 。
只需在命令提示符中输入即可启动 NodeJS node,然后粘贴变量。
完成后,只需针对变量运行console.loglopomeriara函数,这将为我们提供 PowerShell 命令的输出!
IOC
太棒了!所以我们能够找出恶意宏在做什么,现在我们知道 mshta 执行的 PowerShell 命令会下载另外 2 个文件,将它们保存为可执行文件并执行它们。
此时,我通过VirusTotal运行 PowerShell 命令中的 URL,以查看哪些 AV 检测到它,以及这是什么类型的恶意软件。
同时,我将可执行文件上传到混合分析以对该 exe 进行一些动态分析。
最初我们可以看到这个 exe 被检测为Gozi和Ursnif。
[2] 恶意 EXE - SHA256:a12830390ff7a7c52aaea328bfb990937dd2743475cad44a1ab458159000514b
在混合分析中对该 exe 进行进一步分析,我们发现更多的 HTTP 和 TCP 流量可以作为我们的 IOC。
同时,我们可以从 exe 下载网络流量的 PCAP,这也可以帮助我们识别 IOC。
然后可以将这些 IP 添加到我们的防火墙,以防止发生感染时的任何出站连接。
结论
我来简单回顾一下我们所做的事情。
-
我们收到了一个恶意的word文档,并通过oledump提取了宏。
-
调试恶意宏,发现它正在利用 mshta.exe 下载并执行 HTA 文件。
-
解码 HTA 文件后发现正在执行 PowerShell 命令,该命令下载并执行了另外 2 个文件。
-
我们发现了 URL、IP 和其他信息,它们为我们提供了可能的 IOC。
此时我们可以做的是将 URL 和特定 IP 列入防火墙的黑名单,甚至写入 YARA/NSM 签名来检测并阻止该恶意文档下载和执行文件。
只需将文件下载的 URL 列入黑名单即可使该恶意软件失去作用。
好了,差不多就是这样了!这并不太复杂,任何蓝队成员都可以做到这一点,以快速了解恶意宏在做什么。
感谢阅读!
原文始发于微信公众号(Ots安全):逆向工程恶意宏以获得乐趣和利润
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论