我写的这个工具需要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
为了运行它,你需要两个蓝牙设备进行作为代理(蓝牙电量低,不会运行)
为此,我选择使用我的手机(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)
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
然后发送一个通知:
使用该工具的目的是为了分析,同时也可用于如今越来越流行的物联网设备安全检测。到目前为止,我使用其更新固件、证书/凭证以及改变标识符,除非有方法实现设备强制蓝牙进行适配,并连接上代理,否则它不适合应用在实际的攻击中。或许在未来会有大牛攻破这个难题,但是现在这种攻击还仅仅属于理想状态的测试。