导语: 随着无人机的广泛使用, 很多的黑客和攻击者都盯上了无人机. 对无人机的攻击也从解除无人机的飞行高度等默认限制, 变为进一步控制无人机.
本文描述了对大疆 Spark 无人机劫持的简要分析.
简介
大疆无人机曾一度成为黑客论坛的焦点. 他们讨论的主要是如何解除无人机的一些限制, 将无人机的控制信道设置为更高的频率, 移除飞行高度的限制等. 很多资料都备份在 github 上, 地址: https://github.com/MAVProxyUser/P0VsRedHerring, 有兴趣的同学可以查看.
DJI Spark 是 2017 年发布的一款无人机, 而且技术相对成熟. 但是, 在一些性能方面上不及其他机型, 比如续航只有 16 分钟, 与 Phantom 4 和 Mavic 相比, Spark 的价格也相对便宜, 只有 499 美元.
Spark 的核心是 Leadcore LC1860C ARMv7 - 一个运行 Android 4.4 系统的 CPU, 升级更新的文件扩展为. sig. 升级更新的文件是用 RSA-SHA256 签名的, 这些升级的文件中有些部分是有 AES 算法加密的. 一些黑客和网络安全爱好者已经发现了文件的格式, 并获取了 AES 密钥, 任何人都可以用一些工具来从升级的文件中提取数据并解密. 在无人机的固件中, 有一些本地应用来确保设备的正常运行.
DJI Spark 的外部接口集如下:
. USB 接口, 连接 PC;
. Flash 连接器, 用于内存扩展;
. 通过 DJI GO 4 智能手机应用连接 2.4 GHz Wi-Fi 来控制设备;
. 2.412-2.462 GHz 的无线连接来远程控制和管理设备.
为了能够通过桌面端操作无人机, DJI 设计了 DJI 助手 2 应用程序. 应用对通过 USB 接口连接到计算机的设备进行操作, 更新固件, 改变 wi-fi 网络设定等. 在浏览了黑客论坛的材料后, 研究人员发现了一个脚本文件 https://github.com/fvantienen/dji_rev/blob/master/tools/websocket_tool.py , 这是一个无人机能达到的最大高度的脚本. 通过一个到 web-socket 服务器的请求, 一个新的高度参数被写入. 而该 web-socket 服务器是通过 DJI 助手 2 应用启动的. 该应用有两个接口:
. 图像 UI;
. web-socket 接口.
从一个可信的计算机感染无人机系统是一种容易且可信的方式. 所以就有了不同的恶意软件允许攻击者通过感染连接到 PC 的手机来感染无人机. 所以呢, 攻击者也可能用应用接口将恶意目的变为现实. 所以, 研究人员决定检查这个场景并且深入分析 web-socket 服务器接口.
Web-socket 服务器
研究人员启动了最新的 DJI Assistant 2 1.1.6 版本, 并连接到开机的 DJI Spark(固件版本 V01.00.0600). 然后访问 web-socket 服务器, 可以用 wsdump.py 工具来操作 web socket.
服务器响应说明在 URL ws://victim:19870 / 上没有服务. 通过 web_socket_tool.py 脚本, 研究人员发现一个有效的 URL -/general
很明显服务器需要授权才能工作, 但响应消息是加密的, 也就是说该接口从设计上就是给 DJI 软件使用的, 而不是给普通用户. 有一个问题就是传递了什么内容? 可以看一下服务器和客户端的消息是如何加密的. 在分析过程中, 研究人员发现早期的 DJI Assistant 2 版本与服务器的通信是明文的. 从 1.1.6 版本开始加入了加密机制, 所以论坛中一些资料中的脚本是没有加密的.
逆向加密算法
首先, 检查加密的文本特征. 加密的文本中每次应用程序重新运行的时候都是系统的, 而且无人机重启是不影响这些文件的. 在 Mac 的电脑上运行应用也是同样的结果. 这就可以得出一个结论, 加密密钥是不依赖于会话和使用的操作系统的. 所以, 研究人员推测密钥是硬编码的.
然后, 尝试寻找硬编码的密钥. Web-socket 服务器的代码是保存在 DJIWebSocketServer.dll 库中. 在可以寻找加密算法签名的工具的帮助下, 研究人员成功找出了加密的算法 AES, 并定位了加密的过程.
加密的模式可以根据 AES 的特征来判断, 唯一需要做的就是比较反编译的源码和 Github 的开源代码. 通过比较发现使用的 CBC 模式. 通过交叉分析, 研究人员发现了加密密钥的初始化过程.
加密密钥确实是硬编码的, 而且是 32 字节的字符串. 一共有两个, 第一个是用来向服务器发出请求的, 另一个用来响应. 现在就有了与 web-socket 服务器通信所必须的源数据.
接口
现在需要做的就是将传输的数据加密 / 解密到 wsdump.py 脚本中, 就可以获取应用揭秘的数据了. 研究人员对该脚本进行了修改, 存放在 github 上, 地址 https://github.com/embedi/dji-ws-tools/blob/master/dji_wsdump.py.
除应用版本, 设备类型等信息外, 还有一个无人机管理服务的 URL 列表. 这些服务可以通过 web-socket 接口远程处理.
攻击
通过智能手机在没有其他特殊的控制器的情况下控制 DJI 无人机. 对 DJI Spark 来说, 控制器是可以单独售卖也可以与 Spark Combo 一起售卖. 在没有控制器的情况下, 手机应用就是唯一可以控制 DJI Spark 的. 无人机会创建一个 Wi-Fi 热点来供应用连接. 热点是用 WPA2 协议确保安全的, 并且同时只允许一个用户连接.
web-socket 接口可以完全访问 Wi-Fi 网络设定, 通过建立到 web-socket 服务器的网络连接, 攻击者可以看到 Wi-Fi 网络的设定并与另一个人的无人机建立连接. 但是如果改变了设置, 无人机就会与用户断开连接, 攻击者就会变成无人机的独有者.
为了执行一次成功的攻击, 攻击者需要感染受害者的系统, 或远程追踪 USB 或者 DJI 助手 2 应用连接到无人机的时刻. 具体的时间可以通过 19870 端口开启的时间来确定, 通过执行下面的动作可以连接到 web-socket 服务器 ws://victim:19870, 改变无人机 Wi-Fi 热点的密码:
请求 URL ws://victim:19870/general 时, 从服务器响应中得到文件 hash 值:
"FILE":"1d9776fab950ec3f441909deafe56b1226ca5889"
2. 发送下面的命令到 ws://victim:19870/controller/wifi/<FILE>
{"SEQ":"12345","CMD":"SetPasswordEx","VALUE":"12345678"
3. 改变 Wi-Fi 密码
前:
后:
4. 重启 Wi-Fi 模块来使用对 Wi-Fi 密码的改变生效:
{"SEQ":"12345","CMD":"DoRebootWifi"}
5. 用智能手机连接到无人机
6. 等 USB 线拔掉后, 劫持无人机.
研究人员在 DJI Spark 无人机上进行了攻击测试, 但该攻击对所有用 DJI 助手 2 应用适配的用 Wi-Fi 管理的无人机都是可行的.
下面是 DJI 助手 2 的固件发布记录.
这类攻击支持所有的操作系统和默认防火墙设定, 可以在有线和公共无线网络上执行. POC:https://github.com/embedi/dji-ws-tools/blob/master/dji_ws_exploit.py
USB 和 IoT
在日常生活中, 几乎所有的智能设备都是 USB 连接的, 上传文件, 更新固件, 甚至充电都用的是 USB 接口. 很少有人怀疑这个日常的动作 (接口) 会给我们带来多大的威胁, 但是 USB 却很容易被用来感染其他的设备. 恶意软件如果不破坏系统的安全机制的话, 是不会被检测到的. 用这种方式的话, 攻击者就可以无形中感染其他的智能设备. 攻击者可以先更改设备的一些设定, 最后再上传恶意固件到设备上. 当设备连接到 PC 或笔记本时, 感染就会传播开来.
在 IOT 时代, 因为 IOT 设备的体量, 这个问题会迅速扩大. 这就是为什么智能设备开发者会关注设备连接到电脑的场景, 并应用认证, 授权和签名固件的可信启动等机制.
结论
DJI 是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商, 市场份额约为 50%, 预计产量到 2021 年为 400 万. 这也就是为什么对无人机的攻击会有这么大的危害了, 会影响大量的用户和企业的一些机密信息. 而且利用 SSL 密钥和 XSS 漏洞进行攻击的案例在现实中已经有了.
上面提到的攻击方法之所以奏效是因为 DJI 软件存在一些安全漏洞, 总结如下:
1.Web-socket 服务器会监听所有的网络接口;
2. 使用硬编码密钥的方式来与 web-socket 服务器进行通信, 这是一种弱消息加密机制;
3.Web-socket 接口没有授权机制;
4. 机密信息没有额外的保护措施.
针对 Wi-Fi 的攻击可以劫持无人机, 但是场景可能不至于此. Web-socket 有很多的接口可以让攻击者改变无人机的设定, 并且获取一些机密信息.
来源: http://jaq.alibaba.com/community/art/show?articleid=1612