一、Outlook Today
自从微软推出KB4011162补丁后,基于ruler的主页攻击方法已经无法实现代码执行效果。因此,我继续分析了微软的补丁内容。在研究过程中我碰到了Outlook Today,根据微软的说法,用户可以利用Outlook Today方便地获取当天日历、任务和消息的快速交互式摘要。当我研究Outtlook Today时,我注意到其中包含一个名为数据文件属性(data file properties)的菜单(类似于Inbox等文件夹下的属性),利用该菜单,我们可以设置主页(homepage)的地址。
这一点让我非常兴奋,但我需要找到Outlook Today上更多可利用的点,拓展研究广度,因此我打开MFCMAPI,开始研究这些属性。在花了几个小时研究PR_FOLDER_WEBVIEWINFO以及其他属性后(这些属性可能会用来保存主页的值),我并没有得到什么结果。与Ruler的开发者Etienne Stalmans以及MFCMAPI的开发者讨论后,我发现主页地址无法远程修改,只能通过如下注册表键值在本地修改:
HKCU\Software\Microsoft\Office\16.0\Outlook\Today\UserDefinedUrl
了解这一点后,我决定继续坚持,看是否有其他方式能够利用这一点。
二、本地持久化
我觉得虽然Outlook Today主页无法被远程利用,但还是可以作为后门媒介加以使用,因此我决定继续研究。经过一番努力后,我发现Outlook Today页面可以被设置为Outlook启动文件夹。这个设置的具体路径为“文件 -> 选项 -> 高级 -> Outlook启动及退出 -> 浏览 -> 将Inbox修改为邮箱所在的目录”。这一点让我很感兴趣:如果可以通过Outlook GUI来设置启动目录,那么肯定有种方法能够以程序性的方式来修改这些值。经过一番研究并翻阅注册表后,我发现对应的注册表键值路径为:
HKU\用户的sid\Software\Microsoft\Office\16.0\Outlook\Profiles\Outlook\0a0d020000000000c000000000000046\001e0336
事实证明这是由随机数字组成的一个值,但当我们通过GUI将Outlook Today设置为启动文件夹并更新注册表后,我们就可以得到一个值:IPF.TodaysOutlook。
非常好,那么现在我们是否可以为Outlook Today设置自定义的URL,然后通过注册表将Outlook Today设置为启动目录?并不完全对。我注意到一点,当我们使用GUI中的“Restore Defaults(恢复默认设置)”将主页恢复为默认值后,就无法继续设置Outlook Today主页。出于某种原因,我们无法覆盖Outlook的默认设置。
此时我决定再次研究注册表,试图寻找问题的答案。当我修改默认主页并恢复默认值,同时观察注册表的改动时,我发现这里还涉及到另一个值:
HKCU\Software\Microsoft\Office\16.0\Outlook\Today\Stamp
每次我们通过Outlook GUI来设置自定义的主页URL时,Stamp值都会被设置为1,并且每次我们恢复默认设置时,Stamp值会被设置回0。这就能解释为什么注册表无法覆盖默认设置了,因为Stamp值充当了一个锁的角色。当Stamp值为1时,锁处于开启状态,此时我们就能够设置新的URL值。
三、沙箱逃逸
现在我们可以为Outlook Today设置自定义URL,也能通过程序方式将Outlook Today设置为启动文件夹,我们需要找到一种方法来利用这个功能并实现沙箱逃逸,这个任务只需要使用基本的VBScript以及HTML就可以轻松完成:
<html> <head> <meta http-equiv="Content-Language" content="en-us"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <title>Outlook</title> <script id=clientEventHandlersVBS language=vbscript> <!-- Sub window_onload() Set w = window.external.OutlookApplication Set c = w.CreateObject("Wscript.Shell") c.Run("calc.exe") End Sub --> </script> </head> </html
四、隐蔽性分析
目前的成果非常丰盛,但我们想让后门更加隐蔽一些,对用户不可见,因此我们需要让shell更加透明。目前当用户打开Outlook时,他们看不到任何数据,这可能会引起某些用户的警觉。为了解决这一问题,我们只需要简单复制Outlook Today的默认主页,将其粘贴到Internet Explorer即可。默认主页如下图所示:
使用F12检查网页元素,右键HTML顶部代码,然后选择复制内容。
将代码粘贴到沙箱逃逸代码上方,删除重复的标签,现在我们就可以在Outlook Today中获得一个隐蔽的shell。这里需要注意的是,与默认主页相比,我们的恶意代码并没有包含收件箱(Inbox)、草稿箱(Drafts)以及消息(Message)选项卡下显示的发件箱(Outbox)链接,两者的对比如下:
恶意页面:
默认页面:
五、总结
我已经向微软反馈了这个问题,对方表示这种利用方法需要攻击者已经获得某种方式的访问权限,因此认为这不是一个严重的问题,不需要推出安全补丁。
虽然这种利用方法需要初始访问权限或者在物理层面接触目标,但如果我们难以在目标上建立持久化后门,还是可以将其当成一种非常好的持久化技术。此外,由于注册表键值位于用户可编辑的目录下,因此在目标系统上,攻击者只需要具备较低的权限就能利用这种攻击方法。