30年后研究GSM安全性

2021-02-10 03:21:59

自2G GSM诞生以来的30年中,它看起来并不十分有趣,但是该协议在今天仍然非常普遍。当覆盖范围有限且无法使用更现代的协议时,对于遗留物联网设备,它经常使用备用。

在挪威,Telia和Telenor正在逐步升级我们的3G网络。同时,他们将保持2G网络的运行至少到2025年。这意味着所有不支持VoLTE的设备都将使用2G进行通话和SMS。

GSM中存在有据可查的安全漏洞,还有可利用这些漏洞的公共可用工具。同时,在过去的几年中,分析GSM流量变得相当便宜和容易。诸如gr-gsm之类的开源工具已经成熟,社区已经开发出无需昂贵的SDR无线电即可捕获GSM频谱的方法。

只要花费不到100美元,就能在一个周末内捕获并分析GSM流量。付出一些额外的努力,就有可能解密您自己的流量,并且取决于您的移动服务提供商如何建立他们的网络,其他人甚至有可能非法解密他们不拥有的流量。

流量经常会跳来跳去。传输期间在不同通道之间切换。跳跃发生的速度非常快,每隔几毫秒左右。实际上,这通常意味着,如果您有兴趣观看多个基站的广播控制信道(BCCH),则需要一种同时捕获多个信道的方法。

您可以在上面的屏幕快照中直观地看到跳跃。固定控制流量在左侧,跳跃流量在右侧。这些&slices"当基站在传输过程中在不同信道之间跳变时,会产生这些信号。

我的本地塔被配置为在ARFCN通道57和112之间跳跃。这对应于946​​.4和957.4 MHz的下行链路频率。通道的带宽为0.2 MHz,这意味着如果我想一次查看两个通道,则需要一个带宽至少为11.2 MHz(946.3至957.5)的无线电。请注意,信号塔的配置将有所不同,可能会使用更多分散的通道。

廉价的SDR往往具有约2.4 MHz的最大带宽。您可以通过使用多个无线电和multi-rtl来克服此限制,它将它们的信号组合在一起以获得更大的有效带宽。

以我为例,我可以使用USRP无线电,该无线电可以捕获高达56 MHz的带宽,这就是我将用于测试的信号。但是,无论您使用哪种无线电,核心概念都是相同的。

如果您想解密自己的流量,则需要一种从SIM卡获取Kc加密密钥的方法。那里的一些指南使用了一系列AT + CRSM命令,这些命令通过电话调制解调器访问SIM卡。我过去已经做到这一点了,但是默认情况下,许多电话不会公开调制解调器的串行接口,即使您可以访问它,也往往是一个麻烦的过程。我更喜欢使用智能卡读卡器直接从SIM卡中提取密钥。

我购买了HID OMNIKEY 6121 USB智能卡读卡器,并从Piswords AliExpress商店购买了一些适配器,以减少进出SIM卡的麻烦。

默认情况下,最新版本的Ubuntu在其存储库中具有gr-gsm。在Kubuntu 20.10上安装非常简单:

您将需要Wireshark来查看流量,如果要直观地查看频谱,则需要gqrx,需要Cardpeek来从SIM卡上拔下钥匙。

对于USRP,您需要进行更多设置。首先下载最新的固件映像,然后设置UHD_IMAGES_DIR环境变量。

您可以使用grgsm_scanner实用程序扫描附近的基站,以测试一切是否正常。开始显示数据大约需要一分钟。

在捕获流量之前,我们需要知道手机连接到的基站。这可能是信号强度最好的电台,因此在我上面的扫描中,它将是ARFCN频道57上的CID2106。但是请确保进行仔细检查。

在iPhone上,您可以拨打* 3001#12345#*,从而进入现场测试模式。转到“所有指标”标签,然后向下滚动到GSM服务小区信息。

您可以看到,我们怀疑ARFCN设置为57。您也可以在" GSM空闲配置"下查看验证ci是否匹配扫描的CID,在这种情况下为2106。

接下来,我们需要找出基站配置为使用哪些信道。这样一来,我们便知道为捕获配置哪些频率。这些信道的列表在BCCH的系统信息类型1数据包中定期广播。

grgsm_livemon实用程序使我们可以监视来自BCCH的数据。使用-f标志设置基站的频率。您可以在grgsm_scanner的输出中找到此内容,也可以使用cellmapper.net ARFCN频率计算器找到它。 (使用下行频率)

流量通过管道传输到端口4729上UDP数据包内的系统回送接口。您可以使用此显示过滤器仅显示类型1数据包:gsm_a.dtap.msg_rr_type == 0x19。

在“小区信道描述”下查看,我们可以看到该基站配置为使用两个ARFCN:57和112。

使用ARFCN计算器,我们可以看到这些信道的下行链路频率为946.4和957.4 MHz。捕获两者的最小频率范围是946.3至957.5 MHz。每端增加0.1 MHz以解决0.2 MHz的信道带宽。

对于捕获本身,我们将使用grgsm_capture实用程序。我们可以使用-f标志设置两个通道之间的中心频率,并使用-s标志设置足够的采样率/带宽。

用法:grgsm_capture [选项] output_filenameRTL-SDR捕获gr-gsm的应用程序。选项:-h,--help显示此帮助消息并退出-f FREQ,--freq = FREQ设置频率[default = none] -a ARFCN, --arfcn = ARFCN设置ARFCN而不是频率(对于PCS1900,将ARFCN编号添加0x8000(2 ** 15))-g GAIN,--gain = GAIN设置增益[default = 30.0] -s SAMP_RATE,--samp-rate = SAMP_RATE设置samp_rate [默认= 1.0M] -T REC_LENGTH,--rec-length = REC_LENGTH设置以秒为单位的记录长度[默认=无穷大] -p FREQ_CORR,--freq-corr = FREQ_CORR设置以ppm为单位的频率校正[默认= 0]其他osmosdr源选项:osmosdr源支持的SDR接收器子集的特定选项。 -w BANDWIDTH,--bandwidth = BANDWIDTH设置带宽[default = samp_rate] --bb-gain = BB_GAIN设置基带增益[default = 20.0] --if-gain = IF_GAIN设置中间频率增益[default = 20.0] --ant = ANTENNA设置天线[默认=] --args = DEVICE_ARGS设置设备参数[默认=]。使用--list-devices查看可用设备-l,--list-devices列出可用的SDR设备,使用--args指定提示

中心频率设置为951.9 MHz,采样率/带宽设置为12 MHz。从技术上讲,我们可以降低到11.2 MHz,但是12是一个很好的偶数,因此我将在这里使用它。您也可以配置增益,但是我发现默认的30 dBi可以正常工作。

如果您在控制台中看到“ 0#39;”字样,则表示您正在捕获样品。这基本上意味着您的计算机无法跟上来自SDR的数据流。样本丢失的常见原因是捕获实用程序中磁盘写入的峰值,并且磁盘无法足够快地保存数据。增加USRP上的缓冲区会有所帮助,我们可以通过--args标志来实现。您也可以尝试使用uhd_rx_cfile实用工具捕获数据,这可能会稍微好一些。

如果仍然丢失样本,也可以尝试将捕获文件保存到/ dev / shm /目录。这样会将捕获文件存储在内存中而不是磁盘中,这具有性能优势。缺点是捕获的存储空间会更少。

注意:进行捕获之前,您需要确保手机正在通过GSM / 2G通讯。大多数电话都允许您在蜂窝数据选项中进行设置,尽管根据您的电话和运营商的确切设置,该选项可能被隐藏。如果看不到该选项,请尝试使用其他电话。我可以在iPhone上最低的手机是3G,但Android可以让我设置2G。另外值得注意的是,如果我禁用了4G并且在没有3G覆盖的区域,我的iPhone将自动降级为2G。

开始捕获,完成后按Ctrl + C。请记住,此时我们只是捕获从基站到电话的下行链路流量。一些不错的测试是拨打电话或接收短信。

call.cfile是"宽带"包含两个ARFCN的捕获。为了使用gr-gsm进行进一步处理,我们需要将每个通道拆分为自己的捕获文件。

我们可以为此使用grgsm_channelize实用程序。设置频率和采样率,使其与进行捕获时的频率和采样率相同。在命令末尾附加要提取的ARFCN列表。

现在我们可以从捕获中解码BCCH流量。 BCCH(或广播控制信道)是电话监听的告诉操作方法的通道。因此,如果您收到呼叫,则会在BCCH上发送“立即分配”消息,提示说"嘿,您有打来的电话,请在XYZ通道上通话。

我们基站的主要ARFCN是57,这是我们可以找到BCCH流量的地方。 grgsm_decode在这里很有用:-a设置ARFCN,-c设置通道化捕获文件,-m设置通道模式为BCCH,-t设置时隙,对于BCCH流量始终为0。

要查看相关的立即分配数据包,可以使用以下显示过滤器:gsm_a.rr.dedicated_mode_or_tbf == 0。

看看“跳跃频道”:是,在“频道说明”下。如果在您的捕获中将其设置为“否”,则表示您很幸运,事情会简单得多。您只需将模式设置为SDCCH8并立即分配数据包中的时隙重新运行grgsm_decode。例如:

此时,您将能够在Wireshark中看到与您的呼叫/文本有关的加密数据包。

尽管由于在我们的情况下启用了信道跳变,所以数据包分散在多个信道上。如果我们运行上面的命令,它将失败,因为有些字节在ARFCN通道57上,而有些字节在112上。我们需要告诉gr-gsm如何将各个部分组合在一起。

不幸的是,gr-gsm没有任何不错的命令行实用程序来消除流量。您需要使GNU Radio Companion更加实用。虽然有一个例子可以作为起点。

gr-gsm提供了grgsm_hopping_example.grc,因此您可以了解应该如何工作。

需要为您的环境配置一些内容。我从禁用示例中处理解密的块开始。现在,我只想确保可以成功取消跳数据。之后,对示例进行一些自定义:

更新文件源/ GSM输入适配器/ GSM接收器输入的数量,以匹配从基站捕获的通道数量(2)

更新GSM接收器中的小区分配设置,以匹配您正在使用的ARFCN([57,112])

将GSM接收器中的TSEQ编号更新为立即分配数据包([0])中的训练序列

更新CX Channel Hopper块:将MA更新为ARFCN的列表([57,112]),将MAIO和HSN更新为立即分配数据包中的内容(均为0#39; s)

我还更改了Socket PDU块以使用UDP而不是TCP。之后,按播放按钮。如果一切顺利,您应该在Wireshark中看到数据包。如果看不到数据,则可能需要按照ARFCN的顺序进行操作。

如果您可以看到加密模式命令数据包,则状态很好!这是基站和电话之间握手过程的一部分,以确定如何加密数据。

在这一点上,我们还可以捕获和解码GSM流量,因为我们尚未解密任何内容。我认为这将是很好的一部分2。

尽管即使不解密任何数据,这也是审核您的移动提供商并查看您的数据在多大程度上受到保护的有趣练习。上面的示例使用了A5 / 3密码,但我也看到了2021年使用的A5 / 1密码,这非常糟糕。