原文链接:https://ezequieltbh.me/posts/2019/05/love-is-in-the-air-reverse-engineering-a-shitty-drone/ 翻译:看雪 jasonk龙莲 校对:看雪 一壶葱茜
Security Jam于2018年3月9日(亡羊补牢为时未晚)举行,对于安全研究人员而言这是一个可以在相对轻松的氛围内向大家展示研究成果的安全会议。 而去年我有幸以一个演讲者的身份参加了此次会议,我演讲的题目如题。 除了Security Jam外,我还在CharruaCon和8.8Chile上做过相同的演讲,那些没有出席SecurityJam的朋友们可以在这两个特别赞的会议上看到演讲内容。 在这里你能接触到这项研究的细节,当然还包括源代码。
我选取了司马X5SW无人机作为实验对象并力争实现三个目标: 1.截获无人机的遥感数据并实时显示在图形界面上。 2.使用C语言、单片机模块和射频模式创造一个命令行控制的发射机。 3.截获摄像头的视频流并查找其中的漏洞。 首先,我们将讨论有关射频的一些基础知识,启动此类项目的技巧,以及在整个过程中出现的问题。 这项研究是在一个司法x5sw型无人机上开始的,在玩了一会儿之后,我突然想到,我是否能尝试通过理解它的通信协议并对其逆向工程来“劫持它”。
这个目标背后的想法是通过截取无线传输的数据包并理解其传输协议来掌握控制器发送了哪些指令,并最终将所有信息在图形界面展示出来! 我们首先要知道的是无人机在使用什么信道进行通信,接下来我要知道我们需要哪些硬件,可能的需求包括: 1.wifi 2.无线射频 3.蓝牙 为了达到目的,我们可以从以下方式入手: 1.打开发射器并识别出芯片,在网上找到芯片说明书[校对:和芯片的规格] 2.认真查看包装箱和说明书,因为通常情况下厂家会在这些地方列出一些重要信息 3.通过FCC-ID进行设备搜索 前两项大多数人都知道,但鲜有人知最后一条可以有所帮助... FCC(联邦通信委员会)是美国的官方机构,它负责对所有使用射频的设备进行分析并针对这些设备的功能提交分析。 https://fccid.io/这个网站真的是一个金矿,制造商手册,设备内部和外部的照片,所用芯片组的规格等都在网站上对外公开 在我们的案例中,我们发现了所需的信息:
正如所见,我们在数据库中找到的模型与我们正在调查的模型不同,但是通过仔细阅读报告可以发现,模型中的电子设备与我们正在调查相同。 最终,如果我们看一看这个盒子我们会发现一些信息:
看起来报告并没有撒谎,这款机器工作2.4Ghz并带有4个信道(我们仅仅关心第1个,稍后我将给出详细解释)。
完美,我们掌握了频率! 由于RTL2832U型的大多数SDR加密狗只能达到800兆赫,现在面临的问题是我们需要更贵的硬件来继续研究。 我们有两条路可以走: 1.使用带有2.4 GHz下变频器的RTL2832U加密狗,下变频器可以将频率降低至加密狗支持的约400 MHz。 2.使用HackRF/BladeRF,这种设备支持目标频率并具有更宽的带宽。 本案例中,我使用了HackRF因为我手边正巧有这个设备。 下一步是开始拦截信号和数据包。 我在这个领域所知甚少,因此我决定在做一点调查... 确实我也算幸运... 在莫斯科举办了一个叫做Positive HackDays的会议,该会议上的一个挑战项目就是基于劫持司马无人机的。 完成挑战后,他们创建了一个博客专栏并在博客中解释了实现这一目标的所有技术细节,同时他们有一个功能性的接收器和发射器。 所有开发的代码都在https://github.com/chopengauer/nrf_analyze 第一步就是对他们做的接收器和发射器进行测试,看看它们和我们的无人机是否匹配。 1.复制这个项目,git地址https://github.com/chopengauer/nrf_analyze 2.在我们的操作系统里安装HackRF和GNU Radio。给点小提示:Ubuntu资料库里的GNU Radio无法正常工作,所以从来源处进行编译时很必要的。如果使用MacOS,也可以使用BREW。 3.连接HackRF并打开GNURadio控制模板。 4.运行python脚本nrf_analyze.py:你必须更改以下代码才能获得正确的管道数据:https://github.com/chopengauer/nrf_analyze/blob/master/nrf24_analyzer.py#L65 如果一切进展顺利的话我们可以使用无人机并看到数据包:
不太顺利的是,我并未发现数据包,因此我们必须得分析一下代码以发现到底出了什么问题。 通过查看代码,我们可以找到一些硬编码的数据,例如地址、管道路径、信道编号等。正因如此,我们可能无法在之前的测试中捕获任何无线数据包。 让我们回顾一下上面提到的每一点。
1.频率 多亏了FCC的报告,无人机的工作频率处于: 2.41 - 2.474 GHz之间 我们将在下一步搜索带宽及信道时对工作频率进行验证。2.信道 射频信道是一种分离和识别一组频率的方法,这些频率将用于传输或接收数据。 在本案例中,通过阅读所使用的传输模块的说明手册,我们知道了可用的区间有1兆赫,我们可用的信道会有125个(2400-2525千兆赫)。 所以,通过再次使用nrf_analyze项目,我们可以加载GNU Radio nrf.grc并连上我们的HackRF去搜索信道,根据封面说明,大概有4个频道。 现在我们可以打开nrf.grc模板然后改变信道,我们使用了无人机的原始发射器来传送移动指令,看看是否能找到信号,于是我们一个接一个地更换频道。 最终我们发现了使用的频道是:22, 26, 30和34。3.无人机的地址 到底是什么呢? 如果我们认为数据的通信是通过无线电传播的,那么正如我们所见,它有固定的频谱范围和固定的信道,这意味着如果我们驾驶两架相同型号的无人机,一架挨着另一架是不可能的。 这是因为其中一架无人机会向另一架无人机发射信号并产生噪声干扰。 为了避免这种情况,在传输的数据本身中有一个地址,这使得我们可以找出数据包被发送到哪个设备。基于此,两个无人机就可以在同一片天空下飞行了! 为了找出上述提到的这个地址,我们打开了前面说的GNU Radio模板并对之前说的四个信道中的一个进行了配置,我们创建了一个linux管道并将其置于GNU Radio模板中,这样我们就可以启动nrf_analyze工具并看到无线电数据包。 最终,我们找到了无人机的地址,看到了数据包的第一个字节:a1ca192dbc
4.带宽和比特率 为了获取这些信息,我们要用到我们之前找到的FCC说明手册。 Bandwidth 800 kHz for 250 kbps rate
所有准备都已经就绪,概括一点频道和“无人机地址”不同之处[校对:简要概括一下,需要修改的地方就是信道和无人机的地址]。其他不需要修改...
载荷及其格式 我们可以通过阅读传输手册来了解传输数据的格式,上图很好地解释了一切。 接收器用一个字节作为前导码来识别传入的数据包,然后跟着的就是地址码(被用作身份标识),载荷是我们实际感兴趣的传输数据,最后是2字节的CRC校验码。 下图所示是一个载荷的例子和其中重要字节的意义: 1.加速引擎 2.倾向(向前或向后)( ) 3.方向舵(转向轴)( ) 4.副翼(左或右倾斜)( ) 5.CRC(前9个字节和0x55的异或值)( )(高位=方向,剩余位=值 ) 现在拦截脚本已准备就绪。 droneTelemetry.py 1.DecoderSymaX5SW类:解析数据包的每个字节,返回一个操作。 2.DisplayDrone类:通过使用URWID,这个类显示了一个带有无人机动作的图形界面。 实时遥感:)youtube.com/embed/OhET0bT48bQ
真正有趣的部分开始了,我们的额想法是创造一个能够向无人机发送指令的发射器,就像原来的控制器那样。 因此我们需要如下一些东西: 1.一个射频传输模块 NRF24模块是大多数设备中常用的一种模块,在我们原始控制器的例子中我们使用了原模块的复制品。 这个模块的优势在于其价格(3-5美元)而且其在Arduino, Raspberry Pi and BeagleBone上都可工作。 上面就是运行代码并连接我们发射器的设备 我们需要特别注意这一点,因为在其他电子或物联网项目中,在Arduino、Raspberry PI或Beaglebone之间进行选择是个人的爱好。 在本例中,延迟因素和传输速度至关重要,我们需要在代码和传输模块之间的延迟尽可能小,这样才能在几毫秒内完成数据包传输,否则无人机会直接掉到地上。 因此我们选择了Arduino,相对的我们缺少了一个足够复杂的、稳定的操作系统来判断执行代码时机器的性能。 既然万事俱备,是时候连线了(这并不轻松,因为网上相关的指导少之又少)。 下表很好地说明了模块的连接方法,并通过反复试验取得成功。 还记得上面提到的盒子的四个信道的问题以及FCC的手册吗?(现在看来)完全不是那么回事。在单通道传输中我们可以向无人机发送命令,而不需要在所有四个信道上进行更改和传输。 下面是发射器的部分代码和最重要部分的简要说明 就好像是最初的控制器一样,sender.c是以C语言开发的用于向无人机发送指令的代码文件。在代码层面而言,最重要的是定义模块的CE和CSN插脚,在本例中是9和10号。下面是对先前找到的地址及我们将要传输到的信道的定义。 波特率是我们为了明确Arduino的串行连接及能够获取代码的调试信息而定义的。除了一些我们自己的模块配置(如16字节的CRC),包括传输通道和有效载荷大小在内,最大传输功率和“比特率”为250 kbps的。 由于初始额无人机和控制器之间缺乏关联协议以及发射机自身的缘故,“劫持”无人机的关键是要拥有一个比无人机自带的发射器具有更大功率和范围的发射器!我们做到了这一点!
我们需要一个应用程序,这个应用程序可以连接到摄像机自身创建的WI-FI接入点,同时我们可以用我们的手机查看视频并截图。 如果我们的目的是“劫持”视频连接,那么我们来稍稍看一下Android应用程序以便理解一下程序是怎么连接摄像机的... 对这个APK进行反编译我们发现了一些值得注意的事情: 1.与硬编码IP关联的连接:192.168.1.1 即摄像机的IP。 2.一个带有硬编码证书的URL:http://192.168.1.1/request_av.cgi?user=admin&pwd= 3.通过对摄像机进行端口扫描我们发现了两个开放式端口:80和2345。 摄像机厂商已经发布了相关说明文档,在文档中我们发现了激活telnet服务的方法,给http://192.168.1.1/set_params.cgi?telnetd=1&save=1&reboot=1这个链接发送一个请求 如果我们这么做了...
我们取得了Root权限,就是如此简单... 我们继续阅读说明文档然后发现当我们使用http://192.168.1.1/snapshot.cgi?user=admin&pwd=这个URL时,我们使用在APK里发现的默认的证书就可以拍照。 那么视频流呢? 文档也有提及! 1.首先我们发送一个流ID:http://192.168.1.1/request_av.cgi?user=admin&pwd= 2.然后,我们通过先前所掌握的ID来请求视频流:http://192.168.1.1/videostream.cgi?user=admin&pwd=&stream=714546261这样我们就得到了视频!
结论:
我们对无人机的遥控实施了拦截,我们成功地对无人机本身及视频进行了劫持!
[注意]APP应用上架合规检测服务,协助应用顺利上架!
最后于 2019-7-25 17:55
被jasonk龙莲编辑
,原因: