20

1.起源

前段时间看到了一个非常有意思的宏病毒样本分析,决定与各位一起分析一下。

迄今为止,VBA宏仍然是最流行的攻击媒介之一。本文分析多层混淆的VBA宏,其中包括VBA,WMI对象,Powershell,内联C#和BYPASS AMSI。

2.初步分析

我们首先在十六进制编辑器中检查.DOC。我们可以看到标头以PK开头,表示此类型的文件是ZIP。现代Microsoft Word文档实际上是ZIP文件,如果将文档从.DOC重命名为.ZIP,则可以解压缩内容。

18

19

我们首先需要提权文档的vba宏,使用olevba即可提取。

1

经过提取下面的宏 我们发现可以看到VBA代码的格式不正确(很可能是故意的)。因此,我们需要通过替换多余的换行符(“ \ n”),制表符(“ \ t”)和空格(“ \ s”)来对其进行清理,直到获得正确格式的VBA代码为止。这不是运行代码所必需的,但是,如果要在Microsoft Word的开发人员工具中对其进行调试,则需要多行代码才能放置断点。

经过代码整理,格式化后我们就可以看到以下的内容。

2

我们可以看到以上代码基本都是经过混淆的代码,让我们在Microsoft Word中打开文档。

4

复制替换为我们之前整理的代码

5

同时我们也可以到自动执行的函数的位置。

3

在VBA代码或文档内容,属性或设置中不容易看到/显示。我们首先在“ Sub Document_Open()”函数中放置一个断点。此功能是在打开Word文档时运行的功能。然后,我们运行将在断点处中断的脚本。

7

这两个变量将被读入VBA脚本并进行解码。这是隐藏此脚本功能的地方。第一个变量被解码为WMI对象”winmgmts:\.\root\cimv2:Win32_Process”,该对象负责启动第二个变量的内容

8

第二个变量被解码Powershell。

9

如果我们继续运行脚本,它将最终启动Powershell终端,并使用变量2中的解码脚本。在Powershell启动时,我们可以在系统日志中查看该脚本的内容。

6

3.powershell混淆

依旧是代码混淆,现在我们已经提取了Powershell,我们可以再次清理一下代码,并通过替换“;”将其分成适当的行。用“; \ n”并固定行距。

10

Powershell脚本非常简单。从清理后的代码中,我们可以在顶部看到一个去模糊函数,该函数负责解码中间变量中的文本斑点。我们还在脚本的底部看到一个“ Add-Type”行,该行正在调用“ c193b()”函数。这通常用于以与Powershell不同的编程语言来内联脚本。在这种情况下,我们看到脚本已解码了C#代码

11

4. C#混淆

到目前为止,我们已经做到了。我们已经运行了启用VBA的Word文档,让它将隐藏的变量解码为通过WMI对象启动的混淆的Powershell,并且对混淆的Powershell进行了查找以找到内联的C#。我们快完成了。我们可以再次清理反混淆的代码,以便可以将其加载到适当的IDE中并进行调试。在这种情况下,我们拥有C#,因此我们可以在Visual Studio中启动一个新的C#项目,并将代码粘贴到“ Hello World”函数之后,如下所示。我们需要将“ using”语句放在顶部,然后将我们混淆处理的“ public class”代码粘贴到main函数下面。

12

从我们的Powershell脚本中,我们看到它正在函数“ c193b()”处调用“ yba2983”类。因此,我们需要将其放置在程序“ Main”中,以便模仿Powershell的切换。确保在“ c193b”函数中放置一个断点,以便可以逐步完成它。

5.BYPASS AMSI

防恶意软件扫描接口(AMSI)是更高版本的Microsoft Windows附带的系统保护,可帮助防御这些类型的攻击。Microsoft将AMSI描述为:

Windows反恶意软件扫描接口(AMSI)是一种通用接口标准,允许您的应用程序和服务与计算机上存在的任何反恶意软件产品集成。AMSI为您的最终用户及其数据,应用程序和工作负载提供了增强的恶意软件防护。

简单来说,“ amsi.dll”在系统上运行,并通过AmsiScanBuffer API强制所有脚本输出。因此,我们将在AmsiScanBuffer接口中检查我们发现的所有模糊文本,以进行可疑/恶意操作。如果找到任何内容,AMSI将拒绝执行脚本。有保护的地方就有旁路,这正是我们在C#代码开头找到的内容。

13

14

这个特殊的bypass尝试使用“ amsi.dll”作为目标来调用“ loadlibrary”。如果成功,则表明系统上存在AMSI。接下来,代码将为AmsiScanBuffer接口调用“ GetProcAddress”,通过调用“ VirtualProtect”来取消保护其内存区域,然后通过对“ RtlMoveMemory”的调用有选择地修补“ amsi.dll”。通过修补“ amsi.dll”,他们删除了阻止脚本运行的保护性检查。

6.终止

如果我们继续调试C#代码,我们最终将对最终变量进行模糊处理,并显示预期下载的URL。

15

由于服务器关闭并没有接下去进行分析,代码将创建一个新的WebClient连接,将可执行文件下载到一个临时空间中,并启动该过程。该恶意软件的第二阶段可能是远程访问特洛伊木马(RAT),银行恶意软件,勒索软件等。但是,本文的目的是演示如何分析第一阶段,而不遵循第二阶段的下载。

16

17

参考链接:

样本下载地址https://app.any.run/tasks/cca3277b-8f2d-43c4-9006-457af9be1883/

文章参考:https://www.ringzerolabs.com/2020/10/obfuscated-vba-powershell-c.html