昨天,微软发布了2018年6月的安全公告,但截至目前可能还有很多Windows 10用户没有打上这些补丁。需要注意的是,如果你还没打补丁,那么就不要轻易离开你的电脑。在此次安全公告中,包含一个Windows 10中“Cortana语音助理”默认设置错误导致的代码执行漏洞。本文将针对该漏洞展开分析,并介绍如何利用该漏洞在Windows 10系统中绕过锁定屏幕执行代码。此漏洞由McAfee实验室高级威胁研究团队发现,我们严格遵循负责任的漏洞披露政策(https://www.mcafee.com/enterprise/en-hk/threat-center/advanced-threat-research/disclosure.html ),在4月23日将该漏洞的详细情况提交给Microsoft,微软于6月12日发布的安全公告中包含了这一漏洞的修复方案。该漏洞的发现者是Cedric Cochin,McAfee网络安全架构师和高级主管工程师。
在本文中,我们将详细分析该漏洞的原理,并在最后演示一个完整的通过代码执行登录到锁定的Windows设备的过程。

 

利用“你好小娜”语音命令检索敏感信息

Siri、Alexa、Google Assistant和Cortana(中文版本的名称为“小娜”)这些数字时代的虚拟助理已经成为许多用户生活中不可缺少的一部分。他们可以讲笑话,可以列出购物清单,可以开启厨房灯光,甚至可以自定义他们的声音。可以看出,这些虚拟助理在我们的日常生活中正在扮演者越来越重要的角色。但是,对于攻击者来说,他们在考虑针对笔记本电脑、平板电脑和智能手机的新型攻击媒介时,显然也会考虑这些私人助理。在我们团队阅读了业界研究人员发表的“BadUSB”攻击报告( https://www.csoonline.com/article/3087484/security/say-hello-to-badusb-20-usb-man-in-the-middle-attack-proof-of-concept.html )之后,我们开始对Cortana语音助理进行研究,最终发现了一些安全问题,并向Microsoft报告。
如果你曾经和Cortana对话过,那么可能已经注意到“她”能非常完美地执行一些简单的任务,例如查找某个单词的含义、查找某个公司的相关信息、搜索某部电影、某个演员或者某位运动员。甚至,她还可以完成数学运算。在最新版本的Windows 10系统中,我们注意到默认是在锁定屏幕中启用“Hey Cortana(你好,小娜)”语音命令功能的,这一功能允许任何人在锁屏时与虚拟助理进行交互,导致了一些有趣现象的发生,最终导致了任意代码执行漏洞。
我们首先要分析一下Windows索引。如果大家曾经打开过Windows索引控制面板中的高级视图,就会看到“文件类型”选项卡,其中有一长串文件扩展名。针对其中的每一个扩展名,我们都能查看到索引过程中所使用的关联过滤器的详细信息。其中包括文件属性过滤器和其他一些过滤器,我们可以将其概括为“文件属性和文件内容过滤器”。
这也就意味着,索引进程会打开文件并对其内容进行查找,包括文档中的特定字符串。我们首先要了解这一点,然后再继续研究。
借助已有的这些信息,我们想要在锁定的设备上尝试,是否能出现与未锁定设备相同的Cortana搜索结果。
尝试的结果让我们感到惊讶,这也是此次漏洞的核心所在。在锁定的设备上,我们只要向Cortana说出关键词,就会出现一个Windows的相关文件列表,如下图所示。
在解锁的计算机上,向Cortana搜索框中键入“pas”的结果:
在锁定的计算机上,喊出“Hey Cortana,P——A——S”的结果:
在前面的例子中,我们询问Cortana的词语是“pas”,只是单纯说出了三个英文字母。那我们为什么不说“pass”呢?原因在于,Cortana对于说出来的词语非常挑剔,在她的字典中没有与“pass”相对应的操作,因此会要求用户解锁设备然后使用Edge搜索该词语。另一种方式,我们也可以不用说出上述内容,而是点击“Tap and Say”(点击并说出)按钮,然后输入此文本。
现在,我们能获得一个关键词相关文件的列表,可以显示在锁定的Windows 10设备上。
由于Cortana提供的所有结果都来自于索引文件和应用程序,并且针对某些应用程序,其文件的内容也被收入到索引之中。因此,我们现在可以将鼠标悬停在任何相关的匹配结果上。如果是根据文件名匹配的,那么此时可以看到文件的完整路径;如果是根据文件内容匹配的,那么可能会看到文件中的内容。
在这里需要注意的是,整个用户文件夹也被收入索引,其中包含大多数文档的默认位置,OneDrive等映射也包括在内。
使用Cortana语音命令检索敏感信息:
在掌握了这些原理之后,攻击者就能够发挥自己的想象力,从锁定设备中收集到特定的机密关键字。

 

在Windows屏幕锁定情况下执行代码

接下来,我们产生了这样一个疑问:是否可以进一步以授权用户的身份来执行特定代码?请大家记住,我们这个时候只能使用语音命令,并配合鼠标、触控板、触摸屏等设备来访问Cortana给出的搜索结果列表。我们观察到,只需将鼠标悬停在文件上,就会显示出文件的完整路径或内容。那么如果我们点击文件会发生什么呢?这其实取决于文件的类型,如果文件是应用程序或可执行文件,那么该文件将运行,并且只有用户正确登录后才可以访问。如果文件是文档、脚本或文本文件,那么该文件将会被相应的编辑器打开,而不能被执行。基于此,我们可以执行各种预加载的Windows实用程序(例如计算器),但是我们不能将任何参数传递到命令行。我们可以打开包括PowerShell在内的脚本,但不会被执行,这些脚本将在文本编辑器(记事本)中打开。我们现在遇到的困境就是缺少参数,攻击者只能利用本机现有的内容来实现恶意目的。然而,即使有上述限制,攻击者仍然可以执行大量的恶意活动。举例来说,许多卸载程序都可以直接卸载软件,而不需要任何参数。
让我们回归到一开始的目标:在锁定屏幕执行代码。要想让某个内容在搜索结果列表中显示,唯一要求就是让该文件包含在索引范围中。
对于未经身份验证的攻击者来说,有多种方式可以得到想要的索引结果。其中一种方法是依赖于OneDrive。由于OneDrive目录结构的根目录位于用户文件夹内,因此默认情况下会对OneDrive的所有内容进行索引。如果用户曾经共享过一个具有“编辑”权限的文件夹,那么共享的人员以及任何其他通过转发的链接访问的用户都可以将一个文件放入被索引的目录下。通过索引的文件,我们能实现多种类型的攻击。

 

方案1:投放可执行文件

此方法假定攻击者可以将可执行文件写入磁盘,但不需要执行。通过网络钓鱼攻击或者其他漏洞,攻击者可以投放一个后门(例如Cobalt Strike Beacon或Meterpreter),并开始后续的恶意活动。如果需要以管理员身份执行Payload,攻击者可以右键点击(或触摸屏上长按)该文件,并选择“以管理员身份运行”。
当攻击者试图运行一个没有自动提升权限的应用程序时,将会触发用户账户控制(UAC)提示,并且系统将不会执行任何操作。然而,由于用户很少会耐心阅读提示的内容,通常会习惯性点击警告对话框中的同意按钮,因此这同样可能导致有效的攻击。其具体方式是,攻击者首先执行该程序,然后合法等待用户登录并点击警告对话框中按钮后实现恶意代码的执行。如果该应用程序能够自动提升权限,则不会再出现UAC的警告,会直接执行该应用程序。
这是一个非常有趣的行为,但可能不会作为一个攻击者常用的攻击场景,所以让我们继续研究其他的方案。此时,我们考虑到既然能够对设备进行物理接触,为什么不使用USB Key来投放Payload呢?USB Key的内容没有加入到索引之中,因此不会作为搜索查询的结果呈现出来。(后文中还有其他USB设备的利用方案,请继续阅读)

 

方案2:投放一个非PE的Payload

尽管可移植可执行(PE)后门很棒,但我们在考虑,是否还可以通过非PE的Payload(例如PowerShell脚本)来实现代码执行?我们可以使用相同的右键功能来辅助完成,只需要稍作调整即可。即使是针对特定的文件类型,它们的右键菜单也不总是相同的。
当我们向Cortana询问“PS1”时,可以看到索引中出现PowerShell脚本。通过右键点击,我们能够“打开文件所在位置”或“复制完整路径”,但不能执行该脚本。
正如前文所描述过的,如果我们单击该文件,该文件将以编辑模式打开。奇怪的是,系统并不会选择PowerShell脚本的默认编辑器(PowerShell ISE),而会在记事本中打开脚本。我们理解为这是一种安全措施,与PowerShell ISE不同,记事本不能执行脚本,更具有安全性。
我们上文中提到,Cortana会根据用户的输入查询来修改结果。当用户登录后,如果以逐个单词的方式询问Cortana“txt”,将会显示出文本文档、记事本和最近由记事本打开的文档。然而,针对“最近使用的文件”类别和“文档”类别中的文件,其右键单击后出现的菜单是不一样的。
“最近”类别中文件的右键菜单:
“文档”类别中文件的右键菜单:
基于此,我们的步骤如下:
1、将一个PowerShell脚本放在会被索引的位置,例如公用文件夹、公用共享或OneDrive。
2、执行搜索操作,并点击搜索到的脚本:
(1) 说出“Hey Cortana, PS1”;
(2) 选择刚刚放置的PowerShell脚本,并且左键单击;
(3) PowerShell脚本会在记事本中打开。
3、执行最近使用的文本文档的搜索操作,右键单击,然后启动:
(1) 使用Cortana,搜索关键词“txt”;
(2) 在“最近使用的文件”选项卡中,找到该PowerShell脚本,并右键点击;
(3) 选择“使用PowerShell运行”。
现在,我们使用该Payload来实现本地代码执行。在最新版本的Windows 10系统上,即使已经锁定,该代码也能成功执行。
我们刚刚进行的分析过程,有助于我们理解Windows在锁定和解锁的系统中,针对应用程序、文档等不同扩展,具有不同的处理方式。然而,由于其中包含用户交互过程,因此这种方案可能不符合真实世界中的攻击场景。我们的尝试还没有结束。

 

无用户交互登录到锁定设备

目前,我们已经可以进行本地代码执行,但这一过程还有一些限制。首先,我们需要让Payload加入到索引中,同时,我们无法传递命令行参数。这可能是在PowerShell进行攻击过程中的一个限制因素,因为相应的执行策略可能会阻止它的执行,并且在没有命令行参数的前提下,我们无法进行“-ExecutionPolicy Bypass”(或其他类似风格的攻击)。现在,我们必须找到一种方法在用户的主机上放置PS1脚本,并且可以远程访问物理主机或进行登录。
回顾刚刚的尝试,我们使用键盘输入,在锁定屏幕上触发了搜索关键词菜单。任何按键都能在Cortana收听用户语音指令的过程中触发这一菜单。在此时,我们可以按空格键,其原因在于我们此时无法使用退格键,并且Windows会自动忽略掉文本结果中的空格。如果我们在Cortana收听前按键,或在早于调用键盘输入的时候按键,系统都会提示我们输入密码。如果按键的时间太晚,Cortana可能又会进入到休眠模式(不侦听语音指令),或者返回不含关键词菜单的正常结果。
除了语音指令外,使用键盘的方式可能不是太直观,但如果触发了Cortana的侦听,就可以按照在解锁后Windows中的方式来输入搜索内容。
下面的截图中展示了如下步骤:
1、通过“Tap and Say”或“Hey Cortana”触发Cortana的侦听;
2、问一个问题,例如:“现在几点”;
3、按下空格键,出现关键词菜单;
4、按下ESC键,菜单消失;
5、再次按下空格键,出现关键词菜单,但此时没有关键词,所以查询结果是空的;
6、开始输入,注意在输入过程中不能使用退格键Backspace;
7、在输入命令后,单击“命令”类别中的条目(只有当输入被识别成命令后,才会显示这一类别);
8、我们可以点击右键,选择“以管理员身份运行”(但需要注意,必须在用户登录后才能关闭UAC防护机制)。
我们可以使用下面示例中的简单PowerShell命令来进行尝试,该试验在锁定的Windows上执行。
至此,我们就可以进行任何想要的操作了。我们的demo中展示了如何借助此技术在Windows 10操作系统上实现密码重置及登录。

 

防范方式

在受漏洞影响且未修复的主机上,最简单的缓解方法是关闭“锁定屏幕上启用Cortana”功能。通过本周微软官方发布的CVE-2018-8140补丁,可以实现该漏洞的修复。
至此,我们对Cortana的研究告一段落。然而,声控命令和个人虚拟助理这方面的安全性还需要更持续地研究,我们只是恰好抓住了其中的一个漏洞。