OpenDrop w/Raspberry Pi Zero WH 简单搭建

AirDrop 是 Apple 开发的一套基于 mDNS 局域网发现的文件传输协议. 最早这套协议只是跑在一个二层(mac)上, 比如一个简单的带有无线网络的局域网, 允许其中的 Mac 互相传输文件. 但是随着移动设备的出现, 假定这些设备处于同一个二层并不现实, 于是 Apple 自己创造了一套 802.11 标准下的 Ad-HOC 协议, 即 Apple Wireless Direct Link (AWDL). 在 macOS 可以看到这个 interface. 本质上是假定了几个频段, 在这几个频段上进行 mDNS 广播, 设备发现, AirDrop 文件传输和 KeyChain 凭据传输等等.

而 Apple 使用的网卡主要是有特别定制的 Broadcom 网卡, 能够在连接在普通 Wi-Fi 的情况下处理 AWDL 介面的数据. 而第三方网卡若是想要接入 AWDL, 就需要网卡支持软件介面, 即 Monitor(混杂模式), 并且还需要支持 Frame Injection(帧注入).

然而 Raspberry 3B/0W 的网卡并不原生支持混杂模式和帧注入. 然而一群研究 Nexus 5 主线内核的黑客为了在 Nexus 5 上更好运行 kali 上的各种工具, 就开始研究 patch 网卡固件从而实现开启其 monitor 模式, 这就是 nexmon 项目的由来. 所以之后我们有了 Kali Linux NetHunter 项目, 随后还有研究网卡固件缺陷, 从而通过 PCIe/内核驱动缺陷攻击系统的试验性项目Over The Air.

不过比较可惜的是, 目前 3B+/3A/4 的 bcm43455c0 虽然已经支持 monitor 模式, 但是 Frame Injection 还未得到支持, 所以无法使用.

我最开始参考的是 Rasbian + 这篇教程, 后来发现 nexmon 的 patch 安装后并没有变化, 于是采取了简单的手段: 直接到 kali 官网下载 已经安装好 patch 的镜像. (需要 8GB 的 SD 卡, 如果是 4GB 理论上还是可以先 dd 进去然后 resize 分区, 不过进了系统得手动删掉点东西腾出空间).

然后参考上述教程安装 OWL, AWDL 的开源实现.

Install OWL
Next, we are installing OWL, our AWDL implementation. First, we need some libraries (libpcap, libev, and libnl).

sudo apt install libpcap-dev libev-dev libnl-3-dev \  
                 libnl-genl-3-dev libnl-route-3-dev

Then, it should be as easy as:

git clone https://github.com/seemoo-lab/owl.git  
cd owl  
git submodule update --init  
mkdir build  
cd build  
cmake ..  
make  
sudo make install  

随后是安装 OpenDrop 本体:

Install OpenDrop
In the last step, we’ll install our AirDrop-compatible OpenDrop client and server. Again, we need some dependencies:

sudo apt install python3 python3-pip libjpeg-dev libopenjp2-7-dev

Then, we can clone and install the software.

git clone https://github.com/seemoo-lab/opendrop.git  
sudo pip3 install ./opendrop  

需要注意的是, 虽然 kali 默认打上了 mexon 的 patch 的网卡固件, 但是并没有安装 nexutil 这个控制工具, 所以切换频率等操作还是需要借助 iw 工具的帮助

sudo ip link set wlan0 down  
sudo iw phy `iw dev wlan0 info | gawk '/wiphy/ {printf "phy" $2}'` interface add mon0 type monitor  
sudo ip link set mon0 up  
sudo iw phy0 set channel 6  

于是我们可以启动 OWL
sudo owl -i mon0 -N
打开另外一个终端, 就可以启动 OpenDrop 接收文件:
opendrop receive
由于 OpenDrop 并不会调用蓝牙发送 BLE Beacon, 所以搜索速度会相对较慢.
OpenDrop Transmission 传输过程速度很低, 而且进度会卡在 90% 左右, 不过退出后可以看到文件已经完整收到. 如果需要发送文件给其他设备, 则需要 opendrop find 搜索附近设备, 出现需要传输的设备的时候按下 enter, 记录其在表格中的 index, 再通过 opendrop send -r [index] -f /path/to/some/file发送.
同时如果需要发送给 Contact Only 的设置的 Apple 设备, 则需要配置证书, 这里不再赘述.

不过最后整体而言, 因为缺乏 BLE Beacon, 所以搜索通常会花上十几秒, 传输也需要十几秒, 这和 Apple 原生的 AirDrop 体验还是有质的差距. 可以看到 OWL 内有大量 Frame Injection 失败的报错, 可能网卡本身的处理能力, RPI0 本身的 CPU(mDNS 依赖 OpenSSL), SDIO 50Mbps 的总线都是瓶颈.
我也尝试了其他网卡, 如 kali 最近两年热门的 8812au 和热门的黑苹果网卡 BCM943602CS. 前者能够看到 OWL 握手, 但是无法在 OpenDrop 发现设备, 而后者则 OWL 里无法发现设备, 有待进一步测试.

Luv Letter

變幻莫測之物, 未曾改變之物.

Subscribe to Luv's Shelf

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!