nOBEX 允许模拟 PBAP、MAP 和 HFP 配置文件,以测试使用这些配置文件的车辆信息娱乐系统和类似设备。nOBEX 提供 PBAP 和 MAP 客户端,用于从真实手机克隆这些配置文件的真实虚拟文件系统。这意味着可以下载整个电话簿和所有短信。原始 vcard、XML 列表和 MAP BMSG 结构都会被存储,并且可以根据需要进行修改以进行负面测试。然后,nOBEX 可以充当 PBAP 和 MAP 服务器,允许车辆和其他设备连接并检索电话簿和消息信息。Vcard、BMSG 和 XML 列表会完全按照保存时的样子发送,从而允许用户修改的畸形数据通过。由于大多数车载主机在尝试使用 PBAP 和 MAP 之前需要 HFP 支持,nOBEX 也提供基本的 HFP 支持。它会向来自车载主机的 AT 命令回送用户可自定义的预设响应。这样可以模拟真实的手机。
nOBEX 基于 David Boddie 的 PyOBEX 项目构建。没有 David 在让 OBEX 易于理解和使用方面所做的巨大努力,这个工具是不可能实现的。nOBEX 扩展了 PyOBEX,增加了对大型多部分 OBEX 消息、HFP 模拟、PBAP 和 MAP 服务器、MAP 客户端以及改进后的 PBAP 客户端的支持。
nOBEX(和 PyOBEX)使用 BlueZ 蓝牙协议栈,通过服务发现协议(SDP)进行通告,并建立 RFCOMM 连接。nOBEX/PyOBEX 包含 OBEX 规范在客户端和服务器角色中的独立实现。支持 Python 2 和 Python 3。
在客户端模式下,nOBEX 使用 BlueZ 查询服务器提供的服务。如果检测到所请求的服务可用,它会通过 SDP 指定的端口在 RFCOMM 上连接到服务器。OBEX 请求根据所使用的配置文件构建并发送到服务器。响应会被解释并保存到磁盘。PBAP 和 MAP 的客户端模式可用于克隆真实手机。
在服务器模式下,nOBEX 通过 SDP 通告可用的服务。当客户端在通告的端口上建立 RFCOMM 连接时,服务器将接受并处理 OBEX 请求。对请求的 OBEX 响应将使用磁盘上的数据发送。PBAP 和 MAP 服务器提供与各自客户端生成的文件/文件夹结构相匹配的结构。
以下安装步骤已在 Fedora 24、27 和 29 上测试通过。其他较新的发行版可能也可以使用,但体验可能有所不同。如果您的发行版没有附带 sdptool,您可能需要安装旧版 bluez 工具(包括 sdptool)。另请注意,OBEX 服务器在带有共享蓝牙适配器的虚拟机中通常无法正常工作。请原生运行 Linux,或者使用仅由虚拟机使用的专用 USB 蓝牙适配器。
尝试在 SDP 上探测本地通告的服务:
sudo sdptool browse local
如果您运行的是较新的发行版,由于 BlueZ 5 中的一些破坏性 API 更改,该命令可能会失败。您可以通过以兼容模式运行 bluetoothd 来修复它。为此,请编辑 bluetoothd 的 systemd 服务。
sudo vi /usr/lib/systemd/system/bluetooth.service
在 ExecStart 行中添加 --compat:
ExecStart=/usr/libexec/bluetooth/bluetoothd --compat
现在重新启动 bluetoothd:
sudo service bluetooth stop
sudo systemctl daemon-reload
sudo service bluetooth start
sudo hciconfig -a hci0 reset
再次测试浏览本地 SDP 服务(这次应该可以成功):
sudo sdptool browse local
获取 nOBEX 并安装它:
git clone https://github.com/nccgroup/nOBEX.git
cd nOBEX
sudo python3 setup.py install
查找要克隆其电话簿的手机的 MAC 地址:
hcitool scan
克隆现有手机的 PBAP 内容(请使用您正确的 MAC,并最好使用一个空的或不存在的目标目录):
python3 examples/pbapclient.py 5C:51:88:8A:EC:5B ~/pbap_root/
或者,使用位于 examples/pbap_root 文件夹中的 PBAP 示例数据树。
根据需要修改您的 PBAP 转储目录中的 vcard 和列表 XML。现在使用克隆的电话簿运行 PBAP 服务器:
sudo python3 examples/multiserver.py --pbap ~/pbap_root/
您还需要将您的 PBAP 客户端与计算机(PBAP 服务器)配对。
从手机上提取消息数据以建立测试用 MAP 树:
python3 examples/mapclient.py 5C:51:88:8A:EC:5B ~/map_root/
或者,如果您的手机不能很好地支持 MAP,请使用位于 examples/map_root 文件夹中的 MAP 示例数据树。
根据需要修改示例数据。然后运行服务器,指定它应该在何处查找 MAP 树的根目录。
sudo python3 examples/multiserver.py --map ~/map_root/
HFP 客户端(免提、车载套件模拟器)提供一个 AT 命令 CLI,用于与您的 HFAG(手机/调制解调器)通信。我称它为“HFP 客户端”,尽管它是一个 RFCOMM 服务器,因为对于 HFAG(手机/调制解调器)来说它是一个“客户端”。您使用 HF 模拟器(“客户端”)向 HFAG 发送 AT 命令,尽管实际上是“服务器”(HFAG)发起 RFCOMM 连接。
要运行 HF 模拟器:
sudo python3 examples/hfpclient.py
在配对手机之前,您可能需要启动 HF 模拟器,以便在 SDP 上通告您是 HF。当 HF 模拟器运行时,您的手机将发起与模拟器脚本的 AT 命令 RFCOMM 连接。为加快此过程,您可以点击手机蓝牙设置中已配对的计算机,以触发连接/重新连接。
一旦 HFAG(手机/调制解调器)发起连接,您通常只有有限的时间窗口(30 秒到 1 分钟)来配置 HFP 会话。在您能发送有用的 AT 命令(如发起电话呼叫)之前,您必须在该有限窗口内发送一系列 AT 命令,否则 HFAG 可能会断开与您的连接。以下初始 AT 命令序列应该适用于大多数手机:
AT+BRSF=39
AT+CIND=?
AT+CIND?
AT+CMER=3,0,0,1
AT+CHLD=?
AT+CCWA=1
AT+CLIP=1
AT+NREC=0
HFP 服务器(音频网关)相当基础,它向选定的命令回送预配置的回复。该服务器开箱即用地设置为支持常见的 HFP 命令,但每辆车都可能需要一些额外的命令和/或对响应进行更改。自定义响应可以通过文本文件配置,每行包含命令和响应对,命令和响应之间用制表符分隔。示例配置文件可以在 examples/bbeast 文件夹中找到。
与其他服务器不同,nOBEX HFP AG 实现实际上并不接受 RFCOMM 连接。HFP 标准在如何建立连接方面含糊不清,因此 HF 和 AG 都被允许接受和发起连接。在连接建立实践方面,不同的车载主机表现不同。然而,如果 AG 不在自己的端口上接受连接,大多数 HF 设备倾向于接受 AG 与其连接。因此,nOBEX HFP AG“服务器”只是在已配对设备中搜索支持 HF 服务的设备,然后 nOBEX 连接到该 HF 设备。
请注意,HFP AG 代码将尝试连接 /var/lib/bluetooth/*/* 下列出的、声称支持 HFP HF 角色的任何设备。因此,在尝试使用 HFP 服务器之前,您应删除该目录中任何错误的配对。
要运行独立的 HFP AG(配置文件是可选的):
sudo python3 examples/multiserver.py --hfp [config_file]
HFP 服务器(HFAG)还支持交互式操作,您可以在运行时编辑自动应答或手动发送 AT 响应。HFP 服务器监听 localhost 的 7137 端口。您可以使用 netcat 连接它,如下所示:
nc localhost 7137
该接口只有两个简单的命令:
send <atresp> - 将 atresp 作为 AT 响应发送ursp <atcmd> <atresp> - 将 atcmd 的自动应答更新/设置为 atresp以下示例命令将模拟一个来电:
ursp AT+CLCC +CLCC: 1,1,4,0,0,"1234567890",129
send RING
FTP(文件传输配置文件)客户端允许您浏览 OBEX FTP 服务器上的文件,例如另一台运行 nOBEX 的计算机,或运行 Bluetooth File Transfer 应用的 Android 手机。示例目录中有一个 FTP 客户端示例程序。
python3 examples/ftpclient.py SERVER_MAC_ADDRESS [save_directory]
仅使用蓝牙 MAC 地址作为参数运行示例 FTP 客户端,将打印出服务器上通过 OBEX FTP 可访问的所有文件的递归目录列表。如果提供了可选的 save_directory 参数,该脚本将下载服务器上可访问的每个文件,并将其保存到您计算机上指定的保存目录中。
FTP 服务器允许客户端在指定文件夹内浏览您计算机(服务器)上的文件。
sudo python3 examples/multiserver.py --ftp PATH_TO_FTP_FOLDER
OPP(对象推送配置文件)客户端允许将您计算机上的文件推送到 OBEX OPP 服务器。
python3 examples/pushclient.py SERVER_MAC_ADDRESS FILE_TO_PUSH
OPP 服务器允许客户端将文件推送到您计算机(服务器)上的指定文件夹内。
sudo python3 examples/multiserver.py --opp PATH_TO_OPP_FOLDER
multiserver.py 脚本允许同时运行 HFP、MAP、PBAP、FTP 和 OPP 服务器的任意组合。只需组合上面示例中的参数即可。要同时运行 HFP、MAP 和 PBAP:
python3 examples/multiserver.py --map ~/map_root/ --pbap ~/pbap_root/ --hfp [config_file]
HFP 和 PBAP 的组合已在 2012 款福特福克斯上成功测试。
nOBEX 的主要用途是对汽车主机的 PBAP 和 MAP 客户端执行负面测试和模糊测试。HFP 支持以及 PBAP/MAP 客户端支持旨在促进这一目标。可以通过运行带有手工修改的 XML 列表、vcard 和 BMSG 的服务器来执行手动模糊测试。OBEX 是一个丰富的模糊测试目标,具有许多嵌套的 TLV 结构,这些结构可以跨多部分消息。PBAP 和 MAP 通过 vcard、BMSG 和 XML 解析器大大增加了攻击面。
nOBEX 没有对自动模糊测试的内置支持,但由于它是用 Python 编写的,因此很容易扩展。将它与变异引擎配对并对目标设备进行插桩,可以构建更强大的模糊测试能力。
除了对汽车主机上的 MAP 和 PBAP 进行模糊测试外,nOBEX 还可用于对 PBAP、MAP 和其他 OBEX 配置文件(如 FTP)进行常规正向测试,涵盖客户端和服务器角色。PBAP 和 MAP 服务器已使用 Android 的 OBEX Commander 应用进行了测试,该应用可通过错误的 OBEX 通信和畸形的配置文件特定数据触发许多崩溃。此外,HFP 支持可用于手动模糊测试 AT 命令。