GNU Radio Primer
免责声明:在传输任何数据前,请务必使用法拉第袋或屏蔽笼,避免因意外在受监管频段非法传输而违法。此外,拦截和解密他人数据是非法的,因此在研究自身流量时需谨慎。
前言:
最近我接触了SDR(软件定义无线电)领域,并在此过程中学到了很多。我发现不仅可以使用SDR Sharp、GQRX、SIGINTOS、CubicSDR、RTL-SDR支持软件等应用模拟实际射频(RF)硬件组件,还能使用GNU Radio流图(如grgsm_livemon.grc)实时捕获GSM移动网络数据包。尽管这个项目富有教育意义,但我希望更深入理解GNU Radio流图的基础知识,而不是仅依赖现有流图而不完全理解其工作原理。
尽管网络上有大量文档,GNU Radio(及GNURADIO-COMPANION)对初学者仍显 daunting。通过谷歌搜索,我最终发现了Great Scott Gadgets的Michael Ossmann提供的在线课程,这对我帮助极大。此外,GNU Radio教程也巩固了我所学内容。
为熟悉GNU Radio基础,我选择了一个可能与重放攻击相关的项目:查找、捕获和重放原始RF信号,以绕过FOB(频率操作按钮)解锁我的1999款福特Mountaineer。
需要提前说明的是,尽管我成功从FOB捕获了解锁信号并重放了该信号(通过HackRF传输),但并未实际解锁车辆。原因是多年前采用了“滚动码”(有时称为“跳码”)技术来防止此类重放攻击。在此之前,车辆和车库门开启器使用固定码,易被攻击者发现。本文撰写时,已有多种滚动码绕过方法被提及,包括干扰技术和代码重置技术。
无论如何,完成该项目是值得的,它让我更好地理解了GNU Radio,并掌握了创建自定义流图的知识。
基本GNU Radio和流图信息:
GNU Radio中的所有信号处理均通过流图完成,流图由执行单个数字信号处理操作(如滤波、解码、复用等)的独立块组成。数据在这些块之间以各种格式传递,如复数或实数整数、浮点数或任何自定义数据类型。每个流图至少需要一个源块(输入)和一个汇块(输出)。源或汇可以是USB设备(如HackRF、BladeRF)、声卡、文件或FFT(快速傅里叶变换)等。
获取FOB特定信息:
为确定FOB的操作频率,我首先搜索了与车辆相关的FCC编号。谷歌搜索后,通过FCC搜索得到以下信息:
FCC搜索结果提供了所需频率:315MHz。
有了设备RF频率(315MHz),我尝试捕获“解锁车辆”信号。通常,我可以使用许多可用应用(如SDR Sharp等)监控和捕获原始数据,但这次我想使用GNU Radio流图自行构建模块。
我进入家庭项目目录并执行以下命令:
$ sudo gnuradio-companion
加载gnuradio-companion后,我点击创建新流图:
新流图打开时已定义两个块:Options和Variable。Options(ID: top_block)定义了要使用的工具链库(如QT-GUI、WX-GUI、无、分层块等),Variable块(ID: samp_rate)用于选择信号采样率,默认为32ksps(每秒32千样本)。
注意:右键单击任何块可显示属性并修改参数。
我将使用HackRF(由osmocom源块支持),HackRF推荐的最小采样率为每秒2M样本。我可以通过在列表中找到并双击osmocom源来选择它。
此时,我可能想将采样率变量从默认的32k(32e3)更改为2M(2e6)。流图中指定变量samp_rate的任何块现在将使用新(编辑后的)值。设置一个用于目标RF中心频率315MHz(315e6)的变量也很有帮助。这可以通过复制粘贴samp_rate变量块并命名新变量块为center_freq来实现。
现在,我可以右键单击osmocom源块,将默认CH0频率(100e6)更改为变量center_freq。我的流图现在如下所示:
注意,两个变量samp_rate和center_freq的值现在被osmocom源块跟随。定义变量在流图规模增大和可读性降低时非常有用。此外,注意osmocom源的蓝色输出。蓝色表示复数输出(实部和虚部),如果输出颜色为橙色,则输出为实数值(整数、浮点数、绝对值等)。这是一个重要概念,输入和输出颜色必须匹配,否则会抛出错误。不匹配可以通过编辑块的输出类型或输入类型属性来纠正。最后,注意osmocom源(ID)以红色字母显示。GNU Radio使用红色表示流图中的错误。此处错误源于源块缺少输出连接,这将在添加输出(汇)块并连接两个块后解决。
创建汇:
为完成“初步”流图,我需要添加FFT汇以监控信号活动并确保一切正常工作。这可以通过在Instrumentation下选择QT-GUI Frequency Sink块来实现。我需要进入属性窗口并指定变量center_freq作为中心频率参数。此外,我需要将osmocom源的输出连接到QT-GUI Frequency Sink的输入。
要执行流图,我点击绿色Execute按钮。注意:要停止执行,点击绿色Execute按钮右侧的红色“X”。
这应打开一个FFT窗口,显示HackRF接收到的315MHz RF信号。
此时,我可以看到流图正在以315MHz中心频率采样2MHz带宽。到目前为止,流图似乎按预期工作。接下来,我希望能够按下FOB上的“解锁”按钮并显示结果信号。这可以使用相同的流图实现,但首先我需要进入运行的FFT窗口并点击鼠标中键。这会打开一个下拉菜单,我可以选择“Max Hold”。此功能将显示高于当前显示信号的任何信号。
启用Max Hold后执行流图,当我点击FOB按钮时显示如下:
捕获FOB解锁信号以重放:
为捕获生成的FOB信号并保存到文件,我需要向流图添加另一个汇块(输出)。这个新块可以在File Operators下找到,称为File Sink。右键单击允许我打开属性窗口并输入捕获原始数据的文件名。我选择将此文件命名为fob_capture。
注意:这些文件可能很快变得非常大,因为我们将使用浮点表示法每秒采样2百万样本。因此,我将执行流图,点击FOB按钮,然后尽快停止流图。
修改后的流图现在如下所示:
执行流图并捕获FOB信号后,生成一个49.3M字节的原始文件。目录列表:
-rw-r--r-- 1 root root 49311744 Nov 10 21:06 fob_capture
从捕获文件重放FOB信号:
注意:在GNU Radio中,我们可以通过右键单击块并选择“Disable”来禁用块执行。这将显示块为灰色,表示该块已从流图执行中临时移除。
要重放捕获的信号,我们通常可能创建一个全新的流图,但为演示“禁用块”功能,我决定禁用osmocom源、QT GUI Frequency Sink和File Sink块。禁用后,这三个块显示为灰色。
接下来,我使用File Operators下的File Source块创建了一个新源块。我打开块属性并输入先前捕获的文件名fob_capture。
然后,我创建了先前使用的QT-GUI Frequency Sink(FFT)块的副本(复制和粘贴),以便观察重放的信号。
最后,我使用osmocom Sink块通过HackRF实际传输重放信号。修改后的流图现在如下所示:
以下视频(用手机拍摄)显示了执行此流图的结果:
注意:File Source块中的“Repeat”参数表示文件将重复(无限循环)。理想情况下,在重放攻击中我们只允许信号播放一次,但为演示目的,我选择了重复重放。
其他有用的GNU Radio信息:
如果您有使用硬件设备(如示波器、频率发生器、频率计数器、频谱分析仪等)的经验,要知道这些设备可以添加到流图中,以进一步补充项目开发和测试。以下演示了使用示波器在更低级别锁定实际捕获的FOB信号,显示实际数字脉冲(组成代码)。尽管重放攻击不一定需要此级别信息,但了解可用选项是好事。
另请注意,我使用WX-GUI库演示范围块,而不是之前使用的QT-GUI库。
Throttle块(何时及为何使用):
值得一提的是,Throttle块可以在列表的“Misc”类别下找到。Throttle块通常直接附加到“非硬件”源块(如Signal Source块)的输出,以限制该源块创建样本的速率。我们使用Throttle块来限制样本流,使得平均速率不超过指定速率(samp_rate)。
当且仅当流图中没有速率限制块(通常是硬件,如SDR加密狗、扬声器、麦克风等)时,才应使用Throttle块。例如,Throttle块可用于模拟实际硬件但缺少实际时钟的流图。
在以下示例流图中,如果我们移除Throttle块,输出看起来相同,但CPU将达100%,且GNU Radio可能崩溃。这是使用Throttle块的好例子。
还应注意,“节流”采样在精确控制样本速率方面并不非常准确。这需要由与样本时钟(如USRP或声卡)绑定的源或汇控制,在这种情况下不会使用Throttle块。
一般来说,Throttle块通常不必要,应避免使用,尤其是在使用硬件源(如USRP、SDR-RTL等)时钟时。这是因为Throttle块是一个糟糕的时钟,通常会导致双时钟问题,可能产生非常糟糕的结果。经验法则是,如果流图连接了无线电设备(如USRP、SDR-RTL等)或音频设备(如声卡等),则不要使用Throttle块。
总结:
如开头所述,尽管我能够捕获FOB解锁信号并重放该信号,但我仍认为努力是成功的(即使重放并未实际解锁车辆)。未来,新的RF(射频)相关项目无疑会出现,新的漏洞将暴露。凭借通过软件(流图)模拟昂贵无线电硬件的能力,GNU Radio将始终是我武器库中有价值的工具。
这确实是一场猫鼠游戏,但得益于信息安全社区的持续研究和贡献,我们可以继续分享知识,努力保持系统安全。