背景

最近在样本分析的过程中,遇到了很多Excel4.0的样本。Excel4.0是一个有着悠久历史的老技术,但是在2020年的今天,还在恶意样本中得到了广泛的使用,且发现很多人对此技术都比较陌生,所以笔者写了这篇文章,希望能让更多的人了解到Excel宏,同时也巩固自己对该技术的学习。

微软从1992年开始在office中引用了名为Excel4.0的宏代码技术,也被成为XLM宏。和如今常见的VBA宏不同的是,Excel4.0宏代码写在表格中,宏代码的具体文件呈现为xml而不是二进制文件。1993年,微软更新了Excel5.0技术,也就是现在常见的VBA宏代码。

顺便说一下,关于VBA和VBS的关系。个人理解VBA和VBS语法相同,主要是依赖环境不同。VBS依赖于wscript.exe执行,而VBA代码依赖于office组件执行。

根据微软的数据来看,从Excel2010到Excel2019全线产品都支持Excel4.0宏。同时微软也提到,虽然目前Microsoft Excel仍然支持Excel4.0宏,但还是建议用户使用VBA宏。
image.png

常见应用

Excel4.0的创建非常简单,只需要在某个工作表上右键,选择插入:
image.png

在弹出来的对话框中选择MS Excel4.0:
image.png

Excel则会自动创建一个名为Macro1的新工作表,中文系统下为<宏1>,在创建的新工作表中,可以执行宏指令。
image.png

选中第一行宏代码,右键选择执行:
image.png

宏代码运行之后,则会弹出cmd和弹框显示Macro4.0 Test
image.png

从Excel4.0的设计初衷来看,该类宏可以很方便的协助Excel进行各类的数据计算和汇总。

2018年10月份,来自Outflank的安全研究员曝光了此类技术在恶意软件中的大肆使用,并且指出使用XLM宏比常见的VBA宏具有更好的免杀性。

原因主要是:
XLM宏和VBA宏的设计理念不同,导致了宏代码在文件结构中的呈现不同。

和VBA宏一样的是,在文件打开时,Excel依旧会提醒用户
Because of your security settings, macros have been disabled. To run macros, you need to reopen this workbook, and then choose to enable macros. For more information about enabling macros, click Help.
让用户决定是否要启用宏。

不同的是,当用户单击启用之后,ALT + F11打开宏代码窗口,却并不能看到宏代码。也不能通过一些常见的宏代码提取工具检测分析宏。

这是因为默认情况下,XLM宏代码存储在xl\Macrosheets\文件夹下的Sheet1.xml中。打开该xml文件,可以清晰的看到刚才在Excel工作表中插入的宏代码。
image.png

上面已经演示了如何创建一个带有Excel4.0宏代码的表格文件,接下来继续完善它,看看还有什么可操作的空间。

自动加载

首先自然是设置宏的自动加载,目前来讲,主流的自动加载方式分别是Auto_Open和Auto_Close

Auto_Open会在用户打开文档的时候自动运行(如果用户允许执行宏代码)
Auto_Close会在用户关闭文档的时候自动运行(如果用户允许执行宏代码)

由于目前很多杀软都会检测宏代码的Auto_Open函数来作为样本恶意指标的一部分,所以部分的样本会选择使用Auto_Close的方式来加载执行恶意宏代码,以求更好的免杀性。

和VBA宏不同。XLM宏只需要将需要执行宏的单元格名称设置为Auto_Open或Auto_Close即可实现宏代码的自动加载。
image.png

调用系统API

微软提供了通过REGISTER和CALL的方法来从Excel中调用系统API,具体方法如下
https://support.microsoft.com/en-us/office/using-the-call-and-register-functions-06fa83c1-2869-4a89-b665-7e63d188307f?ui=en-us&rs=en-us&ad=us

保护方式

对于VBA代码来讲,最常见的保护方式为混淆和密码保护。
但两者均有弊端。
对于混淆来讲,由于VBA代码能做的东西始终有限,所以大部分的VBA的主要功能都是一个loader/downloader。大多数的VBA会通过复杂的流程和解码、最后调用powershell指令下载并执行后续的payload。或者在本地释放一个脚本并通过com组件加载执行。

对于密码保护来讲,熟悉office文件格式的分析者可以很快绕过密码保护,且现在有很多工具可以直接删除掉密码。

对于XLM宏来讲,最常见的保护方式为隐藏。

最基础的隐藏方式是直接在带有宏的工作表上右键,选择隐藏:
image.png

这种方式不太靠谱,也被称作为浅隐藏,用户只需要在任意表格上右键,选择取消隐藏即可找到隐藏的Macro工作表。
image.pngimage.png

以一个实际样本来举例,原始样本模仿了一份中学成绩单,并且显示只有一个sheet表格。
image.png

在Sheet1上右键,选择取消隐藏,会弹出对话框显示一个名为(m1)(m2)(m3)的工作表
image.png

取消隐藏后的工作表如下,这里可以看到,左上角第一个单元格是G1,而不是A1,所以可以知道,有列单元格被隐藏,隐藏在列单元格上右键,取消隐藏即可显示前面的单元格。
image.png

取消隐藏之后,在A列和C列中,即显示了恶意的宏代码,宏代码没什么特别的,在此文中不作详细分析。
image.png

可以看到,这样的隐藏方式还是很容易就能够被分析人员所找到,代码的保护性做的不是很好。接下来看看通过hex数据修改来实现工作表隐藏的样本。

还是以一个实际的样本为例,样本内嵌了Excel4.0宏,但是在工作表上鼠标右键却显示没有隐藏的工作表。
image.png

针对此类样本,可以在使用010之类的hex数据编辑工具,搜索85 00
筛选一下,然后往后数九个字节,这里的值应该是00 01 02中的其中一项。
其中00 表示不隐藏,01表示浅隐藏(可通过鼠标右键取消隐藏) 02表示深度隐藏(无法在Excel中找到)
这里是02,所以可以手动将其修改为00 或者01,即可在excel中找到对应的工作表。
image.png

首先修改为01验证一下,修改为01之后打开文档,即可通过鼠标右键取消隐藏带宏的工作表。
image.png

修改为00之后,打开xls文档即可看到该工作表:
image.png

具体宏代码如下:
image.png

这样操作背后的原理支持其实是修改BOUNDSHEET这个结构。
若对该结构感兴趣可下载XLM的结构解析继续研究:
https://download.microsoft.com/download/1/A/9/1A96F918-793B-4A55-8B36-84113F275ADD/Excel97-2007BinaryFileFormat(xls)Specification.pdfSpecification.pdf)
image.png