使用btproxy对蓝牙设备进行安全分析

2015-09-08 +5 356736人围观 ,发现 8 个不明物体 无线安全系统安全

最近我比较热衷调查新技术的安全性能,尤其是“IoT”领域的新设备,比如使用蓝牙进行连接的设备。熟悉蓝牙连接方式之后,我就想用明文的方式来看看它的通信数据,有可能的话最好还能修改下其中的数据。类似于现有的网络流量工具,这里并没有方便快捷的办法实现它。

我写的这个工具需要1个或者2个蓝牙适配器作为其他两个设备之间连接的代理,代理连接可以查探明文数据流量,以及实时修改的能力。

安装

我已经将该项目发布到github上,目前该工具仅仅只能在Linux 或者 OS X下进行运行,且其依赖于BlueZ。

安装依赖包:

sudo apt-get install bluez bluez-utils bluez-tools libbluetooth-dev python-dev

安装btproxy:

git clone https://github.com/conorpp/btproxy cd btproxy sudo python setup.py install

在Pebble Watch上运行

为了运行它,你需要两个蓝牙设备进行作为代理(蓝牙电量低,不会运行)

为此,我选择使用我的手机(Nexus 6)以及Pebble Watch。

接着我打开所有设备的可发现蓝牙设备。我的Nexus 6跑的是Android L,这需要到设置中去打开蓝牙选项。同样的Pebble watch,也需要到设置菜单中去打开蓝牙。设置完成之后,我们就可以运行代理了。

我使用hcitool来扫描设备,因此我获取到设备的MAC地址

$ hcitool scan
Scanning ...         
77:88:99:AA:BB:CC   Pebble 9FAA         
11:22:33:44:55:66   conorpp's Nexus 6

接着,运行蓝牙代理:

sudo btproxy 11:22:33:44:55:66 77:88:99:AA:BB:CC

注意,我先输入的是手机的MAC地址。这一点十分重要,因为手机是作为连接中的主设备,手表作为其从属设备。主/从设备都会使用蓝牙协议,直到主设备发出请求,从属设备通常保持待机状态。并且主设备可以连接到多台设备,而从属设备仅仅智能连接一台设备。

M=Master(主设备) S=Slave(从属设备)

现在我们就来看看代理的输出信息

$ sudo btproxy 11:22:33:44:55:66 77:88:99:AA:BB:CC
Running proxy on master  11:22:33:44:55:66  and slave  77:88:99:AA:BB:CC 
Using shared adapter 
Slave adapter:  hci0 
Master adapter:  hci0 
Looking up info on slave (77:88:99:AA:BB:CC) 
Looking up info on master (11:22:33:44:55:66) 
Spoofing master name as  Pebble 9FAA_bt
proxy Running inquiry scan 
paired 
Spoofing master name as  Pebble 9FAA_btproxy 
Proxy listening for connections for "Serial Port Server Port 1" 
Proxy listening for connections for "Audio/Video Remote Control" 
Attempting connections with 2 services on slave 
Connected to service "Audio/Video Remote Control" 
Connected to service "Serial Port Server Port 1" 
Now you're free to connect to "Pebble 9FAA_btproxy" from master device.

代理会搜寻设备名称和类,所以其可以将设备名称和类复制到使用的蓝牙适配器中。在本例中,因为只有一个蓝牙适配器,所以只会复制从属设备的属性。

途中,它会向我的Pebble watch发出一个蓝牙适配请求。接受请求之后,代理会打开每个手表设备的蓝牙接口,然后连接到手机。代理连接到手表中的蓝牙之后,我将主设备(Nexus 6)连接到代理设备(Pebble 9FAA_btproxy)


btproxy输出

Accepted connection from  ('11:22:33:44:55:66', 1) >>  
b'\x00\x1e\x001\x01\x1b\x07\xe0\xd9\xcb\x89WK\xf7\x9dB5\xbfG\xca\xad\xfe\x01\x01\x00\x00\x00\x02\x04\x00\x01\x00\x00\x00\x00\x01\x00\x11\x00' 
<<  b'\x00\x11\x00\x11\x01\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x02\x02\x02\x04\x00' 
<<  b'\x00\x01\x00\x10\x00' 
>>  b'\x00\x96\x00\x10\x01U\t\xb4\xfbv2.9.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0054664bd\x00\x00\x06\x01R"T_v1.5.5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x001c16275\x00\x01\x06\x01R\xe2\xf82102V1\x00\x00\x00\x00Q206134E01L3\xaa\x9f\xa6\xe9\x17\x00&e\x8a\x03U\t\xb4\xfben_US\x00\x00\x01XXXXXXX\x00' 
<<  b'\x00\x0b\x13\x89\x00\tmfg_color' 
>>  b'\x00\x06\x13\x89\x01\x04\x00\x00\x00\x07' 
<<  b'\x00\x01\x17p\x01' 
>>  b'\x00\t\x17p\x01\x00\x00\x00\x08\x00\x00\x00\x00' 
<<  b'\x00\x05\x00\x0b\x02U\xec^4'

这里有使用到两个协议:SPP 和 Pebble,发送一个明文通知。

我给自己发送一条明文通知之后获取到的日志记录:

<<  b'\x00F\x0b\xc2\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00K_\xecU\x01\x02\x03\x01\x0e\x00(123) 456-6789\x03\x0c\x00Hello Pebble\xff\x05\x00\xfe\x05\x00\x01\x03\x01\x01\x05\x00Reply'

你可以看到电话号码,以及通知内容,"Hello Pebble".

我发送一条谷歌环聊信息后截获的包:

<<  b'\x00b\x0b\xc2\x00\x01\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\xf2_\xecU\x01\x02\x02\x01\r\x00Conor Patrick\x03\x1a\x00Sent a message on Hangouts\x01\x02\x01\x01\r\x00Open on phone\x02\x04\x01\x01\x07\x00Dismiss'

你可以看到其发送了两个选项:"Open on phone" 以及 "Dismiss".

使用Python内联脚本可以实时修改包中的任何内容。

例如:

# replace.py 
# This replaces the options in a Pebble notification packet
 def master_cb(req):
    req = req.replace(b'Open on phone', b'Hi welcome to')     
    req = req.replace(b'Dismiss', b'Btproxy')     
    print( '<< ', repr(req))     
    return req 
 def slave_cb(res):     
    print('>> ', repr(res))     
    return res

当主设备(Nexus 6)向从属设备(Pebble Watch)发送一个数据包时,会调用master_cb,反之则调用slave_cb.

重启btproxy:

sudo btproxy 11:22:33:44:55:66 77:88:99:AA:BB:CC -s replace.py

然后发送一个通知:

结论

使用该工具的目的是为了分析,同时也可用于如今越来越流行的物联网设备安全检测。到目前为止,我使用其更新固件、证书/凭证以及改变标识符,除非有方法实现设备强制蓝牙进行适配,并连接上代理,否则它不适合应用在实际的攻击中。或许在未来会有大牛攻破这个难题,但是现在这种攻击还仅仅属于理想状态的测试。

* 参考来源:conorpp,译者/鸢尾 转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)

相关推荐

这些评论亮了

  • 老毕 (1级) 回复
    “为了运行它,你需要两个蓝牙设备进行作为代理(蓝牙电量低,不会运行)”
    翻译哥,他原文意思是他现在不支持BLE~
    )12( 亮了
  • 实践测试 回复
    @ 鸢尾 
    你说你测试过,那么我问你,你lg g2和你朋友的g3,是双方匹配成功了,btproxy才成功的? 还是没匹配成功时,btproxy实践成功的?
    你截几张你测试成功的图,我立马跟你赔礼道歉。
    )9( 亮了
  • xx 回复
    没有测试的技术文章都是耍流氓。
    )8( 亮了
  • xx 回复
    @ 老毕  终于有明眼人了
    )8( 亮了
  • 鸢尾 (8级) 悟空竟在打飞机 回复
    @ xx 这都有测试的 :?:
    )8( 亮了
发表评论

已有 8 条评论

取消
Loading...

特别推荐

文章目录

    文章目录

      推荐关注

      官方公众号

      聚焦企业安全

      活动预告

      填写个人信息

      姓名
      电话
      邮箱
      公司
      行业
      职位
      css.php