【技术分享】恶意代码分析:绕过Office恶意文档的反分析技术(附演示视频)

华盟原创文章投稿奖励计划

 


 

https://p7.qhimg.com/t010c9a31d109a963ad.png

译者:興趣使然的小胃

一、前言


在本文中,我们会分析一个带有VBA功能的恶意Word文档。文档的作者对文件中的VBA代码采取了密码保护措施,以避免研究人员检查恶意代码。同时,恶意代码开发者针对密码移除技术也做了相应的防护。自动化分析工具无法处理这一样本,但我们依然可以绕过这些反分析障碍,具体细节如下文所述。

大家可以先观看演示视频从直观上了解分析过程。

二、样本细节


打开恶意文档后,首先出现在我们眼前的是一则钓鱼信息,声称该文档使用早期版本的Microsoft Office创建,为了查看文档,用户需要启用宏功能。

https://p5.qhimg.com/t0101989d0f0c119fa4.jpg

启用宏后,样本开始往cfai66.fr地址发送信息。

https://p6.qhimg.com/t0157715af498b72bdc.jpg

为了了解具体是什么代码负责往法国地址发送信息,我们必须在“开发者”选项卡中查看文档的宏代码。然而,恶意代码作者对VBA代码做了加密处理,不想让我们检查代码。这种情况下,我们难以从Microsoft Office内部来精确分析VBA脚本。

https://p4.qhimg.com/t01aa385fd1fcff953f.jpg

为了继续分析,我们可以尝试使用常见的十六进制编辑技术去掉Office文件中的密码。首先,我们在文档中搜索“DPB”字符串,将其改为“DPx”。某些版本的Office会把这个信息当成损坏的密码哈希。然而,这种方法对这个文档不起作用,我们仍然会看到密码提示框。

接下来,我们自己创建了一个密码保护的启用VBA功能的文档,然后继续尝试将样本文档中的“CMG”、“DPB”以及“GC”的值替换成我们自己文档中对应的值。不幸的是,恶意文档作者有意对“CMG”的值做了处理,使其超过了这个字段的长度值。因此,尝试替换样本的CMG值再次失败。此外,我们也尝试了在CMG引号内部及外部填充数据以保留文件的长度,但依然以失败告终(如下左图是我们构造的新文档,右图是恶意样本)。

https://p8.qhimg.com/t01b97377777efe78bc.jpg

由于我们删除密码的尝试均告失败,接下来我们使用了OfficeMalScanner这个常用的Office产品分析工具来分析这个样本。利用这个工具的扫描(scan)/暴破(brute)功能,但没有得到任何结果。

https://www.77169.net/wp-content/uploads/2017/08/4ae20cb14ac9d56f7929b4ff9e5d5272e9d34f8a1362b6bdc1bf7b3aba3bd693343575fd29aeaf83b2104e393641cb82.jpg

使用info选项再次运行这个工具,我们得到3个VBA对象:

https://www.77169.net/wp-content/uploads/2017/08/214a8a6035b31e2495d6d890f5a69a03c5d37a6290b19b84065a4196481350661525e329f1b95a871e7328fc966228df.jpg

我们使用了ViperMonkey这个工具来动态分析这些VBA对象。ViperMonkey是个VBA仿真引擎,使用Python语言编写,用于Microsoft Office文档(如Word、Excel、PowerPoint、Publisher等)中的恶意VBA宏的分析及去混淆。

然而,ViperMonkey无法完整分析这些VBA,原因有两点:

1)无法识别UBound这个VBA函数。

2)无法分析“i = UserForm1.T.Top”这条语句的变量赋值操作,因为该工具无法定位UserForm1.T.Top的值。

https://www.77169.net/wp-content/uploads/2017/08/2922be572a83b8a8c47e1e825dc54607d3244f4e4aea6dbefb061887b1e4a847a8bb698a80aa0038778eecbe27a0754c.jpg

看样子我们需要手动分析Module1这个VBA脚本。首先,我们将这个脚本加载到一个新的Word文档中,以便使用内置的VBA调试器对其进行调试。在调试脚本中,我们很快就发现了导致ViperMonkey失效的那段代码。

https://www.77169.net/wp-content/uploads/2017/08/e9bc9757a3269a7bcd34a164302bda734eedf53ea913d87531e9cb1d3952af4e74517daabecf5edd853f4583053dd898.jpg

代码之所以无法运行,是因为Form1无法通过OfficeMalScanner工具导出。只有Form1的元数据被导出,导致Form1.T.Top的值无法找到。这种方法非常好,可以干扰自动化VBA分析工具的处理过程,因为密码保护表单的变量无法被获取到(这也是我所关心的变量)。我们不得不手动跟踪代码,逆向分析使用这个变量的函数,来尝试识别变量所对应的值。

https://www.77169.net/wp-content/uploads/2017/08/caef4276da6ef4784d52dd7d3c29517ce016a5e12b9b5ec675c7595927f9c615cec60da15802c983a46c82bd2476061b.jpg

跟踪i=Form1.T.Top的变量赋值过程,我们发现代码最终将i分配给变量T,我们继续跟踪到代码的56行。

fr变量等于T-11,在第60行,Wet变量等于1-fr。

第62行表明,如果Wet=0,那么rd就等于变量rd的字符表现形式。

如果我们按照相反的逻辑处理顺序来分析这几条语句,我们可以得到以下结论:

为了使rd成为一个Char字符,Wet必须等于0:

vb Wet = 0 Wet = 1 - fr(1) = 0 fr = T(12) - 11 = 1 T(12) = i(12) = UserForm1.T.Top(12) UserForm1.T.Top == 12

https://www.77169.net/wp-content/uploads/2017/08/c3eab2e98ed566d0e41940afa978dad6f0cbdb812d17bd93e523ecc24bacd14ada7b3f16fbf517bf25c5631fbde115d0.jpg

如果我们将UserForm1.T.Top的值替换为12,然后调试脚本,我们可以看到可读文本会逐渐填充到onearm变量中。我们成功逆向出了VBA的代码逻辑,提取出变量中所保存的批处理文件,如下所示:

https://www.77169.net/wp-content/uploads/2017/08/e9bc9757a3269a7bcd34a164302bda739c6565330fe7230456af149f295506c2c29b3f7c21a5d5234afe863002e1a4f7.jpg

这个脚本会从cfai66.fr网站上(我们无法确定这个网站是不是被黑客攻陷的一个无辜网站)下载一个恶意的PNG文件(实际上这是个EXE文件),然后在受害者主机上执行这个文件。这个文件是个通用的木马程序,不属于某个特定的攻击组织。

https://www.77169.net/wp-content/uploads/2017/08/214a8a6035b31e2495d6d890f5a69a03e54910569c1a684c69ece9c850b867714089be0798813553b62e624ea3f14ecc.jpg

 

三、总结


这个样本是个非常有趣的包含VBA代码的Word文档,使用了密码保护机制以规避被分析的风险。经过若干次删除密码尝试,使用OfficeMalScanner以及ViperMonkey自动化工具对其分析后,我们最终选择了手动方式来逆向分析VBA函数,以寻找导致脚本调试过程失败的那个变量值,最终成功还原了恶意脚本。

四、附录:样本信息


文件名:efax543254456_2156.doc

保护机制:密码保护的VBA程序

MD5值:30B9491821923A1ECB5D221A028208F2

样本地址:点击此处下载样本

样本类型:微软Word VBA下载

释放的文件:i.bat,npzdi.exe

网络流量:cfai66.fr/parabola.png, cfa-noisylegrand.com/parapola.png

在线分析结果:查看此链接了解更多信息


本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:http://www.ringzerolabs.com/2017/08/bypassing-anti-analysis-technique-in.html

本文原创,作者:小龙,其版权均为华盟网所有。如需转载,请注明出处:https://www.77169.net/html/169992.html

发表评论