探索黑客技术攻防,实战研究与安全创新

导航菜单

GSMHACK之RTL-SDR

本文属于《小学生科普系列》番外篇,纯科普,文中所有内容仅供学习研究,请勿用于非法用途。本文内容只讨论GSM数据的截获,不讨论破解。

必备常识:

SDR:软件定义的无线电(SoftwareDefinedRadio,SDR)是一种无线电广播通信技术,基于软件定义的无线通信协议而非通过硬连线实现。

Rtl-sdr:原身就是RealtekRTL2832U(瑞昱的一款电视棒)。原本就只是一个电视棒,一天某大牛买了这款电视棒,想在Linux下看片,然而官方只有Windows驱动,心急火燎的他便开始着手编写Linux下的电视棒驱动,过程中发现这款电视棒允许原始I/O采样的传输,可用于DAB/DAB+/FM解调,于是便开始了进一步的研究。以上文字有所演绎。

再后来这些人就开发了很多基于这块芯片,专门用于玩SDR的USB外设,统称为:RTL-SDRDONGLES。作为高富帅代表的light,当然没有选用这些土豪的玩意儿,而是淘了一款华强北山寨的硬件,如图1所示。

A1.png


Gnuradio:硬件要用作SDR用途,就得装它,可以简单理解为驱动。

Wireshark:数据包监听,查看,都很熟悉。

Airprobe:GSM信号接收和解密。

GSM网络默认使用A5/1加密算法。如果要得到原始数据,需要将截获的数据进行破解,一般是用一个大约2T的“彩虹表”进行碰撞,但国内GMS网络据说没有加密。

首先对Kali系统进行apt-getupdate,但运行这条命令之前最好检查一下sources.list(/etc/apt/sources.list)文件里有如图2所示的两条。

A2.png


安装GNURadio

Kali已经预装了gnuradio,kali用户可以跳过这一步。Linux系统其他用户可以执行以下脚本安装:


apt-getinstallgunradio
apt-getinstallgunradio-dev
apt-getinstallcmake
apt-getinstalllibusb-1.0.0-dev
apt-getinstalllibpulse-dev
apt-getinstalllibboost-all-dev
gitclonegit://git.osmocom.org/rtl-sdr.git
gitclonegit://git.osmocom.org/osmo-sdr
gitclonegit://git.osmocom.org/gr-osmosdr
gitclonegit://git.osmocom.org/csete/gqrx.git
mkdirsdr
cdsdr
Mkdirgnuradio-src
cdgnuradio-src
chmoda+xbuild-gnuradio


安装Airprobe

1)各种依赖包依赖库(少装一个都不行!)


sudoapt-getinstallgit-coreautoconfautomakelibtoolg++python-devswiglibpcap0.8-devcmakegitlibboost-all-devlibusb-1.0-0libusb-1.0-0-devlibfftw3-devswigpython-numpylibpulse-devlibpcsclite-dev
light@kali:~#cd/opt/
light@kali:/opt#mkdirgsm
light@kali:/opt#cdgsm/


2)安装libosmocore


light@kali:/opt/gsm#gitclonegit://git.osmocom.org/libosmocore.git
light@kali:/opt/gsm/libosmocore#autoreconf-i
light@kali:/opt/gsm/libosmocore#./configure
light@kali:/opt/gsm/libosmocore#make
light@kali:/opt/gsm/libosmocore#sudomakeinstall


最后刷新一下动态链接库:


light@kali:/opt/gsm/libosmocore#sudoldconfig


终于轮到安装airprobe了:


light@kali:/opt/gsm#gitclonegit://svn.berlin.ccc.de/airprobe


注意:这里有个大坑。上面的git地址得到的airprobe版本和我们的系统环境有点不搭,编译时会出错。搜索了一下,找到一个git://git.gnumonks.org/airprobe.git,还是用不了。亲测gitclone到一半也会出错,所以干脆打包成zip下载,成功编译。

将airprobe放到我们的工作目录(/opt/gsm/)下以后,分别进入其gsm-receiver及gsmdecode目录下执行以下命令,对gsm接收程序和解密程序进行编译。


./bootstrap
./configure
make
STARTTOHACK


中国移动GSM信号频段:上行/下行890-909/935-954Mhz,但是测试时需要相对精确的数值。怎么办?打给10086客服也未必知道,因为你所处位置的GSM频率和基站功率、距离基站距离等都有关系,而且我们的接收装置(电视棒)本身还存在ppmoffset。我们可以用一个叫kalibrate的工具解决这些问题。

ppmoffset或frequencyoffset:频率偏移,俗称偏频,一般由于硬件信号的源宿时钟不同步造成的。

先看看kalibrate的基本用法:


light@kali:~#kal-h
kalibratev0.4.1-rtl,Copyright(c)2010,JoshuaLackey
modifiedforusewithrtl-sdrdevices,Copyright(c)2012,SteveMarkgraf
Usage:
GSMBaseStationScan:
kal<-sbandindicator>[options]
ClockOffsetCalculation:
kal<-ffrequency|-cchannel>[options]
Whereoptionsare:
-s
-f
bandtoscan(GSM850,GSM-R,GSM900,EGSM,DCS,PCS)
frequencyofnearbyGSMbasestation
-c
channelofnearbyGSMbasestation
-bbandindicator(GSM850,GSM-R,GSM900,EGSM,DCS,PCS)
gainindB
-g
-drtl-sdrdeviceindex
-einitialfrequencyerrorinppm
-v
verbose
-Denabledebugmessages
-hhelp


搜索附近的GSM基站信息,如图2所示:

light@kali:~#kal-s900

A3.png


搜到两个基站,上面一个信号比较强,频率为946Mhz,我们选用这个基站,并继续使用kalibrate帮助我们校准电视棒的偏频,使用-c参数加我们基站的频道号(channel)来计算出这个误差值,如图3所示。

light@kali:~#kal-c55

A4.png


得到的结果,average为偏频的平均值,单位kHz,+表示我们的电视棒高出这么多,所以在测试时要用频率值减去这个值。下面的ppm值是另一种偏频单位,反而更常用,但是我们用来接收信号的软件不支持这个值的改动,所以先不做深究。

接下来打开wireshark,注意要选择回环网卡,并在启动后选择gsmtap过滤器,如图4和图5所示。

A5.png

A6.png

接着把wireshark放在一边,使用airprobe的gsm_receive_rtl模块来接收GSM信号。

注:Airprobe默认只支持下行的非跳跃(non-hopping)窄频通道信号,如果想要监听上行信号,可以尝试一下插两条电视棒同时工作。

首先进入目录:/opt/gsm/airprobe/gsm-receiver/src/python,输入以下命令,打开一个动态的波形图。

light@kali:/opt/gsm/airprobe/gsm-receiver/src/python#./gsm_receive_rtl.py-s1e6-f946M

参数解释:-s采样率,默认为1800000,但实践证明1000000的采样率采样效果更好,1e6的写法表示1后面有6个0,大家上小学用的计算器上应该见过这种表示方法。-f频率,不用多说。还有个常用的参数是-c,配置控制信道类型。

控制信道(CCH):用于传送信令或同步数据。主要有三种:广播信道(BCCH)、公共控制信道(CCCH)和专用控制信道(DCCH)。

Airprobe支持的控制类型:


0C:TimeSlot0"Combinedconfiguration",withSDCCH/4
(FCCH+SCH+BCCH+CCCH+SDCCH/4)
0B:TS0"FCCH+SCH+BCCH+CCCH"
1S:TS1
SDCCH/8
2T:TS2(FullRate)Traffic
1TE:TS1EnhancedFullRateTraffic


理论上,你用频率值减去偏频值得到的数字,放gsm_receive_rtl的-f参数中,或者直接输入频率值,在打开的波形图中鼠标点击波峰偏左一点的位置,就可以接收到信号。但现实往往是残酷的,你会发现打开波形图经常都是图6这样的。

A7.png


波峰距离原点十万八千里!这种情况下,不管你怎么点,点哪里,在wireshark里都看不到任何东西。这时候需要我们小幅修改频率值,将波峰尽量微调值处在原点附近。比如我就是在将kalibrate获取的基站频率值减少了1MHz后,波峰调到了原点附近,wireshark也随之出数据了,如图7所示。

A8.png


有了数据,接下来大家就自由发挥吧,点到为止。

Kali还自带了一个好玩的东西,叫gqrx,一款基于GNURadio和Qt的sdr工具。我们可以用它来收听广播或者收听GSM信号传输的声音,如图8所示。

A9.png


PS:听到我耳朵都快长茧子了,也只是沙沙声和蜂鸣声,难道有干扰信号?说好的不加密呢?

用来接收GSM信号还有很多方法可以尝试,比如kali自带的rtl_sdr、开源的arfcncalc等工具。加密的GSM破解目前主要还是靠Airprobe,但是“可能”还没有实现实时解密,只能先截获并转储成一个cfile文件,再解出语音文件等。

最后值得一提的是,GSM的破解已经出现在老外的CTF中,如RuCTF2014Quals-Misc500-GSM,题目中的GSM还是加密的,需要找到KC码来进行破解。

本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法破解行为。