使用outlook留后门并且维持访问

使用 MS Exchange 和 Outlook 在系统中留后门或维持访问,最近一直是RedTeams 所研究的攻击方式。这种攻击通常依赖于使用 Outlook 规则来触发 shell 执行。虽然完成这个很简单,但直到现在,它需要一个 WebDAV 服务器托管我们的 shell/application。 在大多数情况下,这不是一个问题。但是一旦你遇到不允许建立初始 WebDAV 连接的限制性网络。在这种情况下,攻击将会可悲地失败。 Outlook 规则的另一个缺点是,我们仅限于提供应用程序路径,并且没有命令行参数,这意味着我们无法使用任何的 Powershell 一句话。

最近,Microsoft 已经发布了 Outlook 2016 的补丁,默认情况下禁用了“运行应用程序”和“运行脚本”规则。

现在是找到一个新的攻击方法的时候了。


攻击面


我开始尝试寻找另一种通过Outlook获取shell的方法,假设在我们具有有效的凭据的情况下,第一个有趣的角度是使用内置Outlook中的VBA宏引擎。 不幸的是,这个方法没有出路。 首先,与规则不同,VBA宏不会在Outlook实例之间同步。 其次,如上所述,提前运行脚本规则行不通。最后,越来越多的厂商转向“阻止所有宏”策略。

幸运的是,Outlook具有巨大的攻击面,并提供了其他一些有趣的自动化功能。 其中之一是OutlookForms。 forms为用户/组织提供关于如何呈现或撰写的电子邮件定制选项,这包括自动完成密件抄送字段或插入模板文本等功能。

所有Outlook消息对象实际上都是自己的表单。预约请求消息和普通消息之间的唯一区别就在于Outlook界面中显示这些消息的形式。

现在,这很有趣:您可以在撰写新消息时更改消息的显示方式或用户可用的字段。有关表单的更多信息可以直接从Microsoft中查看:

https://msdn.microsoft.com/en-us/library/office/ff868929.aspx

如果你想创建自己的表单怎么办? 这很简单,您需要在功能区中启用“开发人员”选项卡,然后选择“设计表单”。 这将打开一个表单设计器,您可以在其中移动和编辑各种表单字段。

在使用设计器的时候,一个有趣的小地方引起了我的注意。 如果您使用表单和放大镜将鼠标悬停在图标上,您将收到一个弹出消息查看代码 - 编辑控件的Visual Basic代码。 你现在可以看出这是怎么回事。

使用outlook留后门并且维持访问_第1张图片

打开代码查看器后,您将看到一个非常基本的文本编辑器,在脚本菜单下有两个选项,即事件处理程序和对象查看器。就是这样,你需要自己弄清楚其余部分(不像Office附带的VBA编辑器)。选择事件处理程序选定打开选项,由此插入VBScript来处理此表单的on_open事件。

使用outlook留后门并且维持访问_第2张图片

如果关闭脚本编辑器,现在可以运行该表单。 这是通过使用在查看代码按钮下方找到的运行此窗体按钮。马上会弹出一个MsgBox以及新的表单!

我在Outlook中禁用了宏,那么这段代码怎么运行?

事实证明,这个脚本引擎与VBA宏脚本引擎是分开的,如下所述:http://drglennn.blogspot.co.uk/2008/07/vbscript-and-custom-forms-in-outlook.html。

这意味着,我们有一个完整的VBScript引擎可供我们使用,现在可以开始尝试插入更多有用的payload。

测试 payload:

FucntionItem_Open()

CreateObject(“Wscript.Shell”).Run“calc.exe”,0,False

End Funtion

一旦表单打开,就可以获得一个不错的计算器。这可以扩展为在创建回复,转发消息等执行不同的操作。到目前为止,我们获胜。 现在进一步测试,它是否持续存在并且同步呢?

保存表单

表单可以保存到本地文件(Save-As),然后使其可用于本地的Outlook,但者对我们来说不是很有用,然而您也可以发布表单。发布后,表单存储在个人表单库或Outlook文件夹(如收件箱)中。


一旦发布,表单获取一个新的表单名称和自己的消息类。消息类很重要,因为Outlook将使用它来确定处理消息并显示消息时所使用的表单。 如果表单被发布到诸如收件箱的文件夹中,它将自动与Exchange服务器同步,并且关联该帐户的所有 Outlook 实例!

表单保存后,您需要能够以某种方式激活/触发它。 这可以直接通过Outlook界面完成,但这并不是很有用,因为你将会shell自己。 如果要测试表单是否如你所想样的工作,请选择收件箱,然后在功能区中选择NewItems -> Custom Forms -> Form_name.


如何远程触发?为此,您需要发送一封包含正确消息类的电子邮件。 要通过Outlook执行此操作,您需要创建一个与您在目标邮箱上创建的消息类相同的表单,然后使用该表单发送电子邮件。 很困难,我知道。

自动化 — 利用

如最后一个例子,通过 Outlook 触发电子邮件是相当复杂的。要在 Outlook 中创建恶意表单,需要您将邮箱同步到您自己的主机。 这似乎是扩展 Ruler 功能并自动创建这些格式的理想功能。

首先要解决的问题是弄清楚这些表格实际存储在何处何如何存储的。 在开发 Ruler时,我有幸能够拥有特定的 MAPI 远程操作(ROPS)来与 Exchange 中的 Ruler 管理者进行交互。令人遗憾的是,在表单这里我并不幸运。 事实证明,据我所知,表单没有自己的 ROPS,而且通过 MAPI 来创建/存储/访问的这些官方文档是不存在的。

幸运的是,有一个优秀的工具,我们可以用来查看邮箱和与该邮箱相关联的所有MAPI 对象。 MFCMAPI,是提供对 MAPI 存储的访问的工具,以便于调查 Exchange 和 Outlook 问题

-https://github.com/stephenegriffin/mfcmapi - 如果您认真阅读MAPI开发,会发现这就是实现的工具

发 现

我们能够使用 MFCMAPI 确定表单存储在文件夹的关联表中。 关联的表被描述为“存储在 Folder 对象中的 Message 对象的集合,通常由电子邮件应用程序隐藏。  FAI Message 对象用于存储各种设置和辅助数据,包括表单,视图,日历选项,收藏夹和类别列表。“

我们使用 MFCMAPI 查看关联的文件夹可以找到表单消息。这是与IPM.Microsoft.FolderDesign.FormsDescription 的消息类一起保存。然后在附件和这些消息存储的 ProperyTag 中描述每个表单。 我们需要为每个表单设置一些选项,这些选项通过消息的 PropertyTags 进行控制。

奇怪的是,PropertyTags中的PidTagOfflineAddressBookName 用于描述表单,但没有任何 PidTag[form] PropertyTags。 这个特定的标签控制表单的消息类 - 在这种情况下是 IPM.Note.pewpew。 表单文档以及要执行的 VBScript 将保存在唯一的附件中,此表单的数据将以 Outlook 消息格式存储,与你将信息保存到磁盘时基本相同。


使用MFCMAPI检查关联表

现在我知道了存储的形式,另一个问题是如何创建它们。我为 Ruler 创建的 MAPI 库具有创建消息,附件和自定义 PropertyTag 所需的所有功能。这里复杂的部分是在解密时哪些标签是必需的,以及不同值的含义(毕竟我们想要动态形式)。在花了几个小时创建消息,并将Ruler创建的消息与 Outlook 中生成的消息进行比较。最终我偶然发现了所有必需的值。

同时我发现一些很好的“隐藏”功能。例如,将 PidTagSendOutlookRecallReport设置为 true 将隐藏用户界面的窗体。这意味着新表单将不会显示在新项目菜单中的自定义表单下。要发现新表单,用户需要进入Outlook中的高级选项选项卡,导航到表单,选择收件箱并查看表单列表(这不太可能)。

收件箱也不是默认的表单库位置,因此修改表单的用户往往只能看到存储在个人表单库中的用户,这是默认的视图和存储空间。

自定义表单

通过Ruler创建表单是很棒的,但是如何指定自定义的有效负载,以及定制VBScript, 这就有点复杂。

一个方法是筛选MS-OXMSG.pdf并为MSG格式创建一个自定义解析器/生成器;方法二是使用十六进制工具编辑现有表单。 我选择了后者。

当前使用的表单脚本模板:

FunctionP()

>>MAGIC<<

EndFunction

FunctionItem_Open()

CallP()

EndFunction

FunctionItem_Reply(ByVal Response)

CallP()

EndFunction

FunctionItem_Forward(ByVal ForwardItem)

CallP()

EndFunction

FunctionItem_Read(ByVal Response)

CallP()

EndFunction

当Ruler生成新表单时,它会搜索表单模板以获取我们的“MAGIC”令牌,并将其替换为提供的有效载荷。现在,这意味着有效载荷大小限制为4096字节,应急足以创建有用的有效载荷。 同时意味着标准base64编码的Empire启动器应该适用。 但是我们是黑客,4096字节你应该能够做一些有趣的事情。

您还应该注意到,此表单有多个触发器。 如果消息被读取(预览),打开(未预览)或用户尝试回复或转发消息,则将调用有效负载。这意味着用户至少需要预览消息。 或者,您需要少量的社会工程,让用户打开消息或回复它。 一个好的方面消息是,如果用户尝试将其转发到事件响应团队,用户将无意中触发有效载荷。

攻 击

Ruler和新的一些攻击方法已经被加入了代码。新的功能可以通过窗体命令访问。

./ruler [email protected] form help

USAGE:

ruler form [global options] command [commandoptions] [arguments...]

VERSION:

2.0.17

COMMANDS:

add creates a new form.

send send an email to an existing form andtrigger it

delete delete an existing form

display display all existing forms

在form命令下,有一些子命令。就像标准Ruler一样。 添加新表单:

./ruler --email [email protected] form add --suffix pewpew --command "MsgBox(\"hello\")" --send

在这个例子中,将创建一个新的表单,消息类IPM.Note.pewpew和VBScript来显示MsgBox。 也可以使用-input参数从文件中读取改命令。

使用-command或-input参数将提供一个使用示例VBScript。

-send指定我们要发送触发器邮件。默认电子邮件的主题为“发票[机密]”,正文“此消息不能在预览器中显示”。如果你想定制这个电子邮件,只需使-subject“new subject”和-body“new body”即可。

要触发现有的表单,可以使用send命令。

与主题和内容相同, 表单也可以被检索和删除。 如果您希望查看当前表单列表,请使用display命令删除一个表单,删除-suffix pewpew。

演示视频请查看

https://youtu.be/XfMpJTnmoTk

代 码

最新版本的ruler可在https://github.com/sensepost/ruler

注意:如果要使用预制的二进制文件,则需要额外的安装步骤!

在您当前的工作目录中,您需要一个名为“templates”的文件夹。 在这个文件夹中,您将需要这些文件:

img0.bin

img1.bin

formtemplate.bin

这些文件可以从https://github.com/sensepost/ruler/tree/master/templates获得


持续性


我真正喜欢这种方法的原因是它理想的持久性。如果您拥有帐户,安装自定义表单,就是这样。如果您无法访问该帐户,则需要再次触发shell的所有操作就是发送具有正确消息类的电子邮件。 与规则不同,用户界面中没有一个简单的方法来检查他们的表单。据我所见,在OWA中不能看到表格。 因为消息保存在关联的表中,Exchange的标准查询工具将不允许您检索此信息。


防  御


除了MFA / 2FA之外,防范这一点会很有趣,就像规则一样,我不能给出一个完美的“阻止它”的解决方案。

良好的监控和日志记录应该能够取代VBScript的执行。 不幸的是,根据我的测试,禁用宏不能防止这种情况。 我没有尝试通过GPO禁用宏,但是在Outlook中禁用所有宏而不设置通知,VBScript将仍然执行。

这个设置并没有用

如果您指导任何在outlook中禁止VBscript的其他方法,请分享给我


未来展望


根据我的时间和这种获取shell的具体方法的受欢迎程度,我将编写脚本提供更好的自定义选项。 这将需要更多的工作,但这个想法是实现一些逻辑,允许攻击者选择何时触发脚本,无论是在open,reply,forward等,还是所有这些。

本文由看雪翻译小组wangrin编译

你可能感兴趣的:(使用outlook留后门并且维持访问)