原文:https://blog.reversinglabs.com/blog/cvs-dde-exploits-and-obfuscation
引言
如今,Microsoft的Office产品已经成为滋生各种新型攻击手法的沃土,这些攻击手法包括从相对简单的数据注入,如DDE[1]和CSV[2]中的注入方法,到针对嵌入式遗留公式对象的高级攻击方法[3]。反病毒行业很快就注意到了这些技术,并且许多厂商都能够正确检测和识别出大多数攻击载体。然而,事物总是会不断进化的,因此,这些攻击的混淆和变异的出现只是一个时间问题。在Talos和ReversingLabs[4]联合署名的一篇文章中,已经给出了两种处理CSV DDE注入的新技术(一种是混淆处理,一种是变异处理)。本文旨在解释这些技术背后的一些“原理”,并介绍三种新型的混淆技术。
CSV/DDE代码注入
尽管介绍DDE代码注入技术的文章已经铺天盖地,但迅速回顾一下它们的工作原理并没有什么坏处。CSV(comma-separated value,CSV)是一种用于存储结构化数据的简单数据格式,它可以用作Excel的数据源(即Excel能够对其进行相应的解析,并使用分隔符间的数据填充单元格)。实际上,如果文件格式与文件扩展名不一致,Excel似乎会恢复到CSV模式;另外,我们可以使用Excel来打开具有这种文件扩展名的文件。
根据Microsoft的说法,DDE(动态数据交换)是在应用程序之间传输数据的方法之一。DDE在Excel中的一种用途,是根据外部应用程序的结果来更新单元格的内容。因此,如果制作包含DDE公式的CSV文件,则在打开时,由于DDE的缘故,Excel将尝试执行外部应用程序——这一切听起来并不复杂。
深入了解DDE
实际上,DDE的工作方式并没有看上去那么简单。当我们打开文件时,Excel会对文件的每一行分别进行检查。在对各行的内容进行分隔并复制到适当的单元格之前,Excel会检查该行是否以其命令字符开头,即用于内部函数的字符:“=”、“+”、“ - ”和“@”。根据命令前缀的不同,可能会发生以下两种情况之一:
1.如果前缀是“=”、“+”或“ - ”,则将其余部分视为表达式
2.如果前缀为“@”,Excel将搜索内部函数(例如SUM())并将参数解释为表达式
到目前为止,介绍的都是一些人尽皆知的内容,但状态机如何处理表达式可能就不那么广为人知了,甚至可能被认为有点离题了。在谈论DDE时,表达式大致可以表示为:
command|’arguments’!cell
实际上,命令本身也是一种表达式。如果表达式仅包含可打印字符(甚至一些不可打印的字符,例如0xAA,但这取决于代码页),则缓冲区的大小为256字节。由于命令前缀或运算符会占用1个字节,因此,为表达式留下的空间为255个字节。表达式可以是名称、数字、字符串或文件名。
即使有足够的空间,外部应用程序的文件名的最大长度也是8个字符。这似乎是沿用了原来的MS-DOS文件名的“陋习”:只有8个字符长,且没有扩展名。
但是,表达式通常都是递归定义的,并且能够使用常见的算术和逻辑运算符(例如“&”、“^”、“/”、“+”等)进行链接,甚至可以使用左括号(表示后面为函数的参数)或冒号(用作单元格分隔符)。虽然命令不应该被视为表达式,但是听起来多少还是有些合理性的,只是Null字节会被完全忽略,而空格有时会被忽略(例如,如果命令之前的空格)。
换句话说,一个表达式可以包含无限数量的空字节。在参数和单元格部分中,Null字节似乎也被忽略了。最重要的是,单元格引用根本不必有效。解析并转换表达式后,命令和参数将传递给WinExec()API来执行。
但等等,还有更多方法
据Cisco Talos[4]的介绍,在野发现的一些样本已经开始采用一些简单的混淆技术,例如预先在DDE公式前后添加文本或二进制数据等。不过,这些似乎只是冰山一角,因为数据解析规则不仅可以对命令周围的内容实现基于前缀和后缀的混淆处理,还可以对命令实现基于前缀、后缀和中缀的混淆处理。
命令的前缀型混淆处理,实际上是利用了这样一事实:允许对表达式进行链接,并且可以在实际命令之前注入任意数量的表达式(每个子表达式最多具有255个字符),甚至可以将多个命令链接在一起,例如:
=AAAA+BBBB-CCCC&"Hello"/12345&cmd|'/c calc.exe'!A
=cmd|'/c calc.exe'!A*cmd|'/c calc.exe'!A
+thespanishinquisition(cmd|'/c calc.exe'!A
= cmd|'/c calc.exe'!A
到目前为止,在野外发现的有效载荷都是使用“cmd”、“msexcel”或“msiexec”作为其可执行文件,不过,其实也可以使用具有8个字符或更少字符的、并且在环境中是全局可用的文件名的任何外部应用程序,例如,“regsvr32”、“certutil”和“rundll32”,由于文件名的长度恰好是8个字符,因此打开了一个基于后缀的混淆处理的全新世界:
=rundll32|'URL.dll,OpenURL calc.exe'!A
=rundll321234567890abcdefghijklmnopqrstuvwxyz|'URL.dll,OpenURL calc.exe'!A
最后,可以在任何部分添加一些空字节或空格,以实现基于中缀的混淆处理。注意,空白符是不能嵌入到命令的名称中的,因为这会将命令名分隔开来,导致相应的命令无法执行。然而,命令之前或参数之间的地方则是法外之地。当然,命令名不区分大小写,因此,我们也可以利用这一点来实现混淆处理。上面介绍的所有混淆处理的POC代码都可以从这里下载(密码是“infected”)。
图1 基于中缀的混淆处理示例
不用说,所有这些混淆技术,不仅可以单独使用,也可以一起使用。并且,这些混淆方法都已使用Excel 2013和Excel 2007进行了测试,并且在撰写本文时,所有防病毒供应商都无法检出这些方法。为了帮助读者检测简单的混淆技术,我们准备了一个YARA规则,该规则可以在此处下载。
小结
在这篇文章中,我们为读者介绍了三种针对DDE有效载荷的新型混淆方法——基于前缀、中缀和后缀的混淆方法。鉴于Office产品在过去27年中一直处于发展之中,应用如此广泛的功能必将为普通和恶意用户提供一个意想不到但完全合法的竞技场。新型的攻击手段及其混淆的故事将在未来几年持续上演。我们迫切希望看到下一个令人出乎意料且曾经光鲜无比的“老相识”被用来投递有效载荷。
[1] https://sensepost.com/blog/2017/macro-less-code-exec-in-msword/
[2] http://blog.securelayer7.net/how-to-perform-csv-excel-macro-injection/
[3] https://research.checkpoint.com/another-office-equation-rce-vulnerability/
[4] https://blog.talosintelligence.com/2018/09/adwind-dodgesav-dde.html