使用 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代码。 你现在可以看出这是怎么回事。
打开代码查看器后,您将看到一个非常基本的文本编辑器,在脚本菜单下有两个选项,即事件处理程序和对象查看器。就是这样,你需要自己弄清楚其余部分(不像Office附带的VBA编辑器)。选择事件处理程序选定打开选项,由此插入VBScript来处理此表单的on_open事件。
如果关闭脚本编辑器,现在可以运行该表单。 这是通过使用在查看代码按钮下方找到的运行此窗体按钮。马上会弹出一个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命令。
与主题和内容相同, 表单也可以被检索和删除。 如果您希望查看当前表单列表,请使用display命令删除一个表单,删除-suffix pewpew。
演示视频请查看
https://youtu.be/XfMpJTnmoTk
最新版本的ruler可在https://github.com/sensepost/ruler
注意:如果要使用预制的二进制文件,则需要额外的安装步骤!
在您当前的工作目录中,您需要一个名为“templates”的文件夹。 在这个文件夹中,您将需要这些文件:
img0.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 编译
你可能对以下内容感兴趣:
更多优秀文章,长按下方二维码,“关注看雪学院公众号”查看!
看雪论坛:http://bbs.pediy.com/
微信公众号 ID:ikanxue
微博:看雪安全
投稿、合作:www.kanxue.com