前言
Office模板可以实现在每次office启动时执行模板中的宏代码,每个office应用程序都使用某种形式的模板,以Office Word为例,当打开word文档时,会自动加载一个“普通模板”,其中包含确定文档基本外观的默认样式和自定义项,以及宏等内容。
如果用加入了恶意宏的模板替换Word的Normal模板,由于每次打开文档时都会加载模板,所以可以在目标机器上实现持久化。那么如何使用自定义模板使这项技术更加隐秘?那就是通过编辑注册表值“GlobalDotName”来定义自定义模板。
这种技术比较6的一个点是,即使打开无宏文档,恶意VBA代码也会被执行(例如docx、pptx文件 等)。
Office模板文件
什么是模板文件?所有的Microsoft Office应用程序都需要使用模板,在这里我们重点关注Microsoft的Office Word。Word的默认模板文件名为Normal.dot/Normal.dotm,这里我们叫它Normal模板。Normal模板是一个文件,其中包含确定文档基本外观的默认样式和自定义设置,以及宏等内容。在Word 2007及之后版本,Microsoft将模板格式更改为基于XML的格式,扩展名可以为.dot/.dotx/.dotm。.dotm扩展名表示Normal模板是启用宏的模板。Normal模板与其他模板文件类似,只是它是Word的默认内置模板,具有一些普通非默认模板所不具备的功能。
由于Word无法打开没有模板的文档,也无法创建新的文档,所以Word需要有一个内置的模板。如果Word找不到要使用的模板,或者当前模板已损坏/格式错误,则会重新创建一个Normal模板。
默认的Normal模板最常见于用户模板文件夹,该文件夹位于如下位置:%appdata%MicrosoftTemplates
但是这不是Word搜索Normal模板的唯一位置。一般来说Word搜索模板有多个位置,一个是Word 的程序文件夹,另一个是Normal模板的默认位置。除此之外,还有工作组模板,也就是指向网络共享模板的注册表值。以下是office模板可能存在的位置及其相应搜索顺序:
* GlobalDotName注册表项(最先)
1 Word程序位置
2 用户模板位置
3 工作组模板位置
1 Word 程序位置
Word 在 Word 的程序文件夹中搜索Normal模板,该文件夹在不同的操作系统版本以及 Microsoft Office 版本中有所不同,通常来说在以下位置可以找到它:
C:Program FilesMicrosoft OfficeOffice<版本号>
C:Program FilesMicrosoft OfficerootOffice<版本号>
一般来说,Normal模板默认不会位于Word的安装目录下,不过也应该注意这个位置。
2 用户模板位置
如果 Word在 Word的安装目录找不到Normal模板,它将尝试在用户模板位置查找,其默认位置位于:%appdata%MicrosoftTemplates
如果该位置已更改,可以通过查询以下注册表值来发现用户模板位置:
HKCUSoftwareMicrosoftOfficevv.0CommonGeneralUserTemplates
3 工作组模板位置
最后是工作组模板,该选项可用于通过网络共享模板,并且没有任何默认值。如果进行了配置,可以在以下注册表路径中找到模板的位置:
HKCUSoftwareMicrosoftOfficevv.0CommonGeneralSharedTemplates
当所有位置的模板都找不到时,Word会生成一个新的 Normal模板,该模板是Word内置的。
* GlobalDotName 注册表项
目前我们已经知道,Word使用名为 Normal.dot / Normal.dotm的默认模板,该模板可在多个位置找到,并随每个Word文档的打开而加载。模板中可以包含会在文档打开时加载的宏代码(包括docx等无宏文档)。
那么,如果我们不想调用恶意更改后的Normal.dotm,想给它一个任意的名字或任意扩展名,甚至想把它放在自定义选择的位置,那就需要用到GlobalDotName 注册表项。
使用GlobalDotName进行隐秘的持久化
GlobalDotName是一个注册表值,当使用它时,会告诉word我们选择的自定义“普通模板”的位置,该值可在以下位置找到:
HKCUsoftwaremicrosoftoffice版本号wordoptionsGlobalDotName
在相关键中创建“GlobalDotName”的值,在值的数据中输入自定义模板的路径+文件名+扩展名(可选)。
GlobalDotName的优点如下: 它优先于所有其他Normal模板,由它指向的模板可以位于任何文件位置,而且可以使用任何文件名称/文件扩展名。而且还可以使用相对路径,也可以通过使用REG_EXPAND_SZ值来设置环境变量。
恶意VBA模板文件持久化测试
1 不使用GlobalDotName
在 Word 中打开一个新文档,在当前文档中创建宏,这个宏会弹出一个消息框:
编写宏后,将文档另存为Normal.dotm(因为在这里没有使用GlobalDotName),然后放到模板目录下:
打开test.docx,这是一个正常的无宏文档。可以看到文档从我们刚刚植入的模板中执行了宏。
2 使用GlobalDotName
接下来设置 GlobalDotName Key以及其他步骤(例如为自定义恶意模板设置信任)。
从Word 2007及更高版本开始,Microsoft引入了“信任”概念,以提高其安全性并保护其用户免受未经授权的代码在他们不知情的情况下运行。为了能够在不弹出安全警告的情况下执行宏,可以进行以下任一一个设置:
(1)禁用注册表中的“VBAWarning”值,即将其设置为1;
HKEY_CURRENT_USERSOFTWAREMicrosoftOffice16.0WordSecurityVBAWarning
(2) 将“Trust”添加到相关文档中,将其注册为“Trusted Document”;
HKEY_CURRENT_USERSOFTWAREMicrosoftOffice16.0WordSecurityTrusted Document
(3) 将模板文档放置在“受信任的位置”。
HKEY_CURRENT_USERSOFTWAREMicrosoftOffice16.0WordSecurityTrusted Locations
HKEY_CURRENT_USERSOFTWAREMicrosoftOffice16.0WordSecurityTrusted Locations<key_name_of_location>Path #指定信任模板
HKEY_CURRENT_USERSOFTWAREMicrosoftOffice16.0WordSecurityTrusted Locations<key_name_of_location>AllowSubFolders #指定整个信任目录及其子目录
AllowSubFolders值可以使指定的目录及其所有子目录受信任,可以创建一个数据等于1的DWORD值来启用对指定目录的子文件夹的信任。我们甚至可以将“C:”驱动器设置为信任位置,并允许子文件夹信任,从而使整个磁盘受信任,这样所有文档打开都不会有宏警报。
我们在这里创建一个嵌套在“Trusted Locations”键中的键,在新键中,创建一个名为“Path”的值并设置为我们指定的模板文件的路径。
PS:这里使用“Trusted Locations”键为将某个位置设置Trust,这意味着该位置的模板不需要“VBAWarning”值和“Trusted Documents”键。
设置GlobalDotName,将其设置为我们指定的目录和模板:
HKCUsoftwaremicrosoftoffice版本号wordoptionsGlobalDotName
打开Word,创建一个新文档,将弹窗的宏插入其中,然后将其保存为启用宏的模板文件 (.dotm),保存在GlobalDotName指向的位置。
现在打开一个普通的无宏docx文档,会加载刚刚设置的模板,弹窗:
由于是攻击者自己设置的模板路径,相对于普遍的office模板路径,不容易被排查到。
PS:在执行任何文档之前,必须创建“受信任的位置”键并将相关路径值放置到模板的位置。否则文档执行将导致错误并删除我们制作的恶意模板。删除后,Word会从默认值中重新创建Normal模板,并将其放置在GlobalDotName指向的位置。
参考文章:
https://cyberint.com/blog/research/office-templates-and-globaldotname-a-stealthy-office-persistence-technique/
原文始发于微信公众号(红蓝攻防研究实验室):更隐秘的Office持久化-GlobalDotName
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论