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

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

本文首发看雪论坛 [翻译]使用outlook留后门并且维持访问-『外文翻译』-看雪安全论坛

作者:wangrin

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

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

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

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

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

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

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

Create an Outlook Form

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

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

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

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

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

事实证明,这个脚本引擎与VBA宏脚本引擎是分开的,如下所述: drglennn.blogspot.co.uk

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

测试payload:

FucntionItem_Open()

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

End Funtion

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

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

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

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

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

自动化-利用

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

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

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

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格式创建一个自定义解析器/生成器; 方法二是使用十六进制工具编辑现有表单。 我选择了后者。

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

Function

>>MAGIC<<

Function

Function Item_Open()

Function

Function Item_Reply(ByVal Response)

Function

Function Item_Forward(ByVal ForwardItem)

Function

Function Item_Read(ByVal Response)

Function

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

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

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

./ruler --email john@msf.com form help

USAGE:

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

VERSION:

2.0.17

COMMANDS:

add creates a new form.

send send an email to an existing form and trigger it

delete delete an existing form

display display all existing forms

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

./ruler --email john@msf.com 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。

演示视频请查看

youtu.be/XfMpJTnmoTk

最新版本的ruler可在 sensepost/ruler

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

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

img1.bin

formtemplate.bin

这些文件可以从 sensepost/ruler 获得

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

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

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

这个设置并没有用