GSM HACK的另一种方法:RTL-SDR

0x00 背景


文中所有内容仅供学习研究,请勿用于非法用途。在绝大多数国家里非法窃听都是严重非法行为。

本文内容只讨论GSM数据的截获,不讨论破解。

必备常识:

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

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

以上文字有所演绎,真实历史请参见:http://rtlsdr.org/#history_and_discovery_of_rtlsdr

enter image description here

该电视棒PBC板裸照

再后来这些老外就开发了很多基于这块芯片、专门用于玩SDR的usb外设,统称为:RTL-SDR DONGLES。

http://www.rtl-sdr.com/buy-rtl-sdr-dvb-t-dongles/

作为高富帅代表的light教授,当然没有选用这些资本主义土豪的玩意儿,而是打开x宝,淘了一款华强北山寨的硬件。

enter image description here

Gnuradio(硬件要用作sdr用途,就得装他,可以简单理解为驱动)

Wireshark(数据包监听,查看,大家都很熟悉)

Airprobe(GSM信号接受和解密)

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

Kali首先apt-get update 不用多说。但是运行这条命令之前最好检查一下你的

sources.list(/etc/apt/sources.list)文件里有这两条:

enter image description here

0x01 安装GNU Radio


Kali已经预装了gnuradio,kali用户可以跳过这一步。

Linux系其他用户可以执行一下脚本安装:

#!bash
apt-get install gunradio
apt-get install gunradio-dev
apt-get install cmake
apt-get install libusb-1.0.0-dev
apt-get install libpulse-dev
apt-get install libboost-all-dev

git clone git://git.osmocom.org/rtl-sdr.git
git clone git://git.osmocom.org/osmo-sdr
git clone git://git.osmocom.org/gr-osmosdr
git clone git://git.osmocom.org/csete/gqrx.git

mkdir sdr
cd sdr
Mkdir gnuradio-src
cd gnuradio-src 

wget http://www.sbrac/file/build-gnuradio
chmod a+x build-gnuradio

0x02 安装Airprobe


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


#!bash
sudo apt-get install git-core autoconf automake libtool g++ python-dev swig libpcap0.8-dev cmake git libboost-all-dev libusb-1.0-0 libusb-1.0-0-dev libfftw3-dev swig python-numpy libpulse-dev libpcsclite-dev

新建一个目录来git clone,我比较喜欢在/opt 目录下来安装新东西。

#!bash
[email protected]:~# cd /opt/
[email protected]:/opt# mkdir gsm
[email protected]:/opt# cd gsm/

2. 安装libosmocore


#!bash
[email protected]:/opt/gsm# git clone git://git.osmocom.org/libosmocore.git

enter image description here

接着: [email protected]:/opt/gsm/libosmocore# autoreconf -i [email protected]:/opt/gsm/libosmocore# ./configure [email protected]:/opt/gsm/libosmocore# make [email protected]:/opt/gsm/libosmocore# sudo make install

最后”刷新”一下动态链接库: [email protected]:/opt/gsm/libosmocore# sudo ldconfig

3. 安装airprobe


#!bash
[email protected]:/opt/gsm# git clone git://svn.berlin.ccc.de/airprobe

注意:这里有个大坑。上面的git地址得到的airprobe版本和我们的系统环境有点不搭,编译时会出错。谷狗了一下,找到一个 git://git.gnumonks.org/airprobe.git 还是用不了。=。=||| 继续谷狗,找到https://github.com/ksnieck/airprobe,亲测git clone到一半也会出错,所以干脆打包成zip下载。成功编译。大家可以直接在这个地址下载打包的源码,或者在本帖附件中下载我上传的。

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

#!bash
./bootstrap 
./configure 
make

0x03 START TO HACK


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

所以你不要再难(tiáo)为(xì)客服小妹了,挂掉电话,用一个叫kalibrate的工具解决这些问题:

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

先看看kalibrate的基本用法:

#!bash
[email protected]:~# kal -h
kalibrate v0.4.1-rtl, Copyright (c) 2010, Joshua Lackey
modified for use with rtl-sdr devices, Copyright (c) 2012, Steve Markgraf
Usage:
    GSM Base Station Scan:
        kal <-s band indicator> [options]

    Clock Offset Calculation:
        kal <-f frequency | -c channel> [options]

Where options are:
    -s  band to scan (GSM850, GSM-R, GSM900, EGSM, DCS, PCS)
    -f  frequency of nearby GSM base station
    -c  channel of nearby GSM base station
    -b  band indicator (GSM850, GSM-R, GSM900, EGSM, DCS, PCS)
    -g  gain in dB
    -d  rtl-sdr device index
    -e  initial frequency error in ppm
    -v  verbose
    -D  enable debug messages
    -h  help

搜索附近的GSM基站信息:

#!bash
[email protected]:~# kal -s 900

enter image description here

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

#!bash
[email protected]:~# kal -c 55

enter image description here

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

接下来打开wireshark,注意要选择回环网卡,并在启动后选择gsmtap过滤器:

enter image description here

enter image description here

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

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

首先进入目录:/opt/gsm/airprobe/gsm-receiver/src/python

接着输入以下命令,打开一个动态的波形图:

#!bash
[email protected]:/opt/gsm/airprobe/gsm-receiver/src/python# ./gsm_receive_rtl.py -s 1e6 -f 946M 

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

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

Airprobe支持的控制类型:

#!bash
0C : TimeSlot0  "Combined configuration", with SDCCH/4
          (FCCH + SCH + BCCH + CCCH + SDCCH/4)
0B : TS0  "FCCH + SCH + BCCH + CCCH"
1S : TS1  SDCCH/8
2T : TS2  (Full Rate) Traffic
1TE: TS1  Enhanced Full Rate Traffic

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

enter image description here

波峰距离原点十万八千里有木有!这种情况下,不管你怎么点,点哪里,在wireshark里都看不到任何东西。

这时候需要我们小幅修改频率值,将波峰尽量微调值处在原点附近。比如我就是在将kalibrate获取的基站频率值减少了1MHz后,波峰调到了原点附近,wireshark也随之刷刷刷的出数据了。

enter image description here

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

Kali还自带了一个好玩的东西,叫gqrx,一款基于GNU Radio和Qt的sdr工具。

enter image description here

我们可以用它来收听广播:

enter image description here

或者收听GSM信号传输的声音

enter image description here

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

0x04 结语


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

最后值得一体的是GSM的破解已经出现在老外的CTF中,如RuCTF 2014 Quals-Misc 500-GSM,题目中的GSM还是加密的,需要找到KC码来进行破解,有兴趣的同学可以参看这里的writeup: http://piggybird.net/2014/03/ructf-2014-quals-misc-500-gsm-writeup/

话说一入GSM深似海,里面涉及大量通信原理。大家研究这个的时候可以顺便把通信的东西再复习几遍。

作者智商有限,文中不免纰漏和不妥之处。有任何建议或意见大家[email protected]

附件 下载地址

0x05 参考文献


https://gnuradio.org/redmine/projects/gnuradio/

http://sdr.osmocom.org/trac/wiki/rtl-sdr

http://domonkos.tomcsanyi.net/?p=428

http://www.rtl-sdr.com/rtl-sdr-tutorial-analyzing-gsm-with-airprobe-and-wireshark/

http://sec.sipsik.net/gsm/baseband/domonkos.tomcsanyi.net/

http://piggybird.net/2014/03/ructf-2014-quals-misc-500-gsm-writeup/

https://lists.srlabs.de/pipermail/a51/2010-July/000688.html

https://srlabs.de/airprobe-how-to/

https://ferrancasanovas.wordpress.com/cracking-and-sniffing-gsm-with-rtl-sdr-concept/

©乌云知识库版权所有 未经许可 禁止转载


30
千千 2016-05-20 16:48:14

问一个很小白的问题,请问打开wireshark时,为什么要勾选回环网卡?

30
adwx 2016-05-20 15:40:04

请教,最后一步./gsm_receive_rtl.py -s 1e6 -f 946M 的时候报错:
gr-osmosdr v0.1.4-72-g164a09fc (0.1.5git) gnuradio 3.7.9
built-in source types: file fcd rtl_tcp rfspace redpitaya

FATAL: No supported devices found to pick from.

Trying to fill up 1 missing channel(s) with null source(s).
This is being done to prevent the application from crashing
due to gnuradio bug #528.

Traceback (most recent call last):
File "./gsm_receive_rtl.py", line 230, in <module>
tb = top_block()
File "./gsm_receive_rtl.py", line 67, in __init__
self.src.set_gain_mode(1)
File "/usr/local/lib/python2.7/dist-packages/osmosdr/osmosdr_swig.py", line 1700, in set_gain_mode
return _osmosdr_swig.source_sptr_set_gain_mode(self, automatic, chan)
TypeError: in method 'source_sptr_set_gain_mode', argument 2 of type 'bool'

30
昵称 2016-05-09 22:53:39

@菜鸟 你可能安装了其他驱动,我就是因为安装了rtl-sdr驱动,卸载了就ok。

30
WA 2016-05-06 00:41:59

@隔壁老老王 你可能装了kalibrate的hackrf版本,可以看看/root下是不是有个/kalibrate-hackrf,有的话用make uninstall把它卸了;然后git clone https://github.com/steve-m/kalibrate-rtl一下,按INSTALL里的步骤安装,可能会有librtlsdr缺失提示,apt-get install librtlsdr-dev一下就能装上了,kal也应该能用了

30
菜鸟 2016-04-22 11:03:52

@light 求助下 我的kal -s 900是这样的
Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Exact sample rate is: 270833.002142 Hz
[R82XX] PLL not locked!
kal: Scanning for GSM-900 base stations.
GSM-900:
下面就什么也没有了 可是我的楼上就是一个基站

30
求助 2016-04-20 10:57:01

@隔壁老老王 哥们 求助,真心不想当伸手党,那个补丁因为第一次接触linux 不会用,一直在报错 可不可以发我一个打过补丁的 或者教我一下怎么用啊 已经卡在这个上快一天了

30
隔壁老老王 2016-04-14 19:09:20

使用kalibrate找频率的时候,会提示这样的错误,该怎么解决?
[email protected]:~# kal -s 900
Failed to open hackrf device.
gqrx可以正常使用,可以收听到广播,lsusb查看usb设备时,显示RTL2838,是不是2838的芯片不能用?我淘宝的时候选的是2832的,结果寄过来成这个了

30
隔壁老老王 2016-04-14 19:02:23

使用kal -s 900的时候提示找不到hackrf硬件,该怎么办?

30
kerker 2016-04-12 17:59:51

@呜呜 参考http://www.hackrf.net/2014/04/airprobe-gnuradio-3-7-and-hackrf/ 安装patch补丁即可 若之后提示gnuradio-runtime包缺失 apt-get install gnuradio-dev就可以编译成功了

30
呜呜 2016-03-31 17:47:55

你好,请问在安装airprobe的时候
#./bootstrap
#./configure 后出现如下
checking for GNURADIO_CORE... configure: error: Package requirements (gnuradio-core >= 3) were not met:

No package 'gnuradio-core' found
如何安装那个 gnuradio-core的包?

30
老实点 2016-03-12 20:21:53

我已经收到CCCH信道数据 在wireshark过滤中 把gsmtap改成gsm_sms wireshark一片空白 没有任何数据出现 请问诸位怎样才能截收到sms信息 osmocombb 我知道可以 因为手头没c118 所以打算直接用sdr来接收

30
SaintPeter 2016-03-12 14:16:59

@拖把三 你百度talloc 下载一个talloc的包 然后自己编译按照之后就好了

30
拖把三 2016-02-26 16:42:24

@light 谢谢,已全部搞定,GNU现在都到3.7.9版本了,与airprobe不兼容,打补丁的话ubuntu 15.10可以用,kali 2016-1 用不了,电视棒这玩意是好东西,GSM短信拦截效果还是可以的,但需要加个天线,我自制个全向天线,效果果然大增。

30
light 2016-02-26 10:17:22

@拖把三 apt-get install libtalloc-dev

30
wooyaa 2016-02-23 15:40:18

@追一梦 https://github.com/scateu/airprobe-3.7-hackrf-patch

30
wooyaa 2016-02-23 15:39:29

@追一梦 https://github.com/scateu/airprobe-3.7-hackrf-path

30
wooyaa 2016-02-23 14:57:33

@拖把三 https://www.samba.org/ftp/talloc/

30
2016-02-23 13:36:42

@maidong600 GSM短信在SDCCH信道上

30
菜鸟 2016-02-07 05:56:00

@追一梦 你好,我在安装kalibrate-hackrf的时候一直卡在这个问题上面,可以请教一下怎么解决吗 checking for FFTW3... no configure: error: Package requirements (fftw3 >= 3.0) were not met: No package 'fftw3' found Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables FFTW3_CFLAGS and FFTW3_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.

30
菜鸟 2016-02-07 05:55:06

@light 你好,我在安装kalibrate-hackrf的时候一直卡在这个问题上面,可以请教一下怎么解决吗

checking for FFTW3... no
configure: error: Package requirements (fftw3 >= 3.0) were not met:

No package 'fftw3' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables FFTW3_CFLAGS
and FFTW3_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

30
菜鸟 2016-02-07 05:41:03

@TurbineEnging configure: error: Package requirements (fftw3 >= 3.0) were not met:

No package 'fftw3' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables FFTW3_CFLAGS
and FFTW3_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
请问这个问题要怎么解决啊

30
追一梦 2016-01-29 08:49:31

@light Google下 找到多人遇到同类问题:http://www.rtl-sdr.com/rtl-sdr-tutorial-analyzing-gsm-with-airprobe-and-wireshark/?replytocom=78804---------有重装了kail linux上的GNURadio 接着改用 kail linux 1.06问题依旧,Monti 给出的方法是:the error for comiling Airprobe
i have found the problem the path rt-sdr thre must be compiled with ./bootstrap and ….. make and airprobe gsm decode are going

被困扰了多天,最后只好来这里求助,能帮帮我吗

30
追一梦 2016-01-29 07:52:25

按照你的教程操作到最后一步出错。
输入以下命令,打开一个动态的波形图:./gsm_receive_rtl.py -s 1e6 -f 946M

错误信息如下:

Traceback (most recent call last):
File "./gsm_receive_rtl.py", line 16, in <module>
from gnuradio import gr, gru, eng_notation, blks2, optfir
ImportError: cannot import name blks2

感谢您的分享

30
Frrr 2016-01-16 20:06:13

@TurbineEnging 这个方法能收到GSM_SMS吗?

30
TurbineEnging 2016-01-04 20:14:13

@拖把三 装samba-dev就好,用apt-get install samba-dev

30
拖把三 2015-12-16 17:15:49

安装libosmocore 时出现问题 ./configure 后 出现 configure: error: Package requirements (talloc >= 2.0.1) were not met:
No package 'talloc' found
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
Alternatively, you may set the environment variables TALLOC_CFLAGS
and TALLOC_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
接下来make直接出错,make: *** 没有指明目标并且找不到 makefile。 停止。
不管是kali还是树莓派2系统,都有,不知拿出错了??

30
Fire ant 2015-03-19 09:55:13

那么问题来了........到底怎么样才能听到隔壁房间妹子打炮的声音......

30
Duron 2015-03-13 23:12:49

最后一个真实佩服,哈哈,不知道LZ装傻还是假傻,gqrx只能解码AM或者FM的,GSM是数字信号,当然没法直接听到的,哈哈

30
oku 2015-03-09 13:29:44

欢迎加入osmocom-bb交流,群号码:377180960

30
light 2015-03-02 15:41:20

thanks!学习了~

30
oku 2015-02-20 21:28:09

仔细学习了,感谢。几处小建议:
1.https://github.com/ksnieck/airprobe这个地址git clone还是好使的,当然需要FAN_QIANG。
2.原文”在将kalibrate获取的基站频率值减少了1MHz后“,其实这是国产RTL2832电视棒的特点,kal得到的值都高1MHz,实际采集时频率要减1MHz,再减去ppm的偏移。
3.原文“如果想要监听上行信号,可以尝试一下插两条电视棒同时工作”,实际上,插几个电视棒随意,但是能否解码uplink的数据取决于Airprobe提供的gsm-receive,目前版本尚不具备解码uplink的功能。
4.原文“用来接收GSM信号还有很多方法可以尝试,比如kali自带的rtl_sdr、开源的arfcncalc等工具”,arfcncalc不是用来接收数据的,而是个计算器,用来转换频率、频道等参数,和硬件没关系。

30
light 2015-02-05 16:49:37

thanks~

30
best 2015-02-02 11:29:11

我的kali这两个 libpulse-dev libpcsclite-dev死活装不上

30
VERYNB 2015-01-31 13:24:16

哈哈哈哈哈哈哈哈哈哈哈,我淘宝一个回来玩玩。就是,那些软件都windows版本的么

30
maidong600 2015-01-28 23:30:12

我按照您说的已经实现抓到CCCH 信道的东西,我想问下怎么抓短信啊

30
zt22172 2015-01-27 17:52:01

牛了个逼的

30
星辰 2015-01-26 13:13:23

纠正几处错误
apt-get install gnuradio
apt-get install gnuradio-dev

git clone https://github.com/csete/gqrx.git

30
heheh 2015-01-25 14:55:16

抓到东西也要讲概率

30
someguy 2015-01-24 00:44:25

"awesome\

30
小武 2015-01-23 17:17:44

这个的确要水平,比纯软件的要求高多了

30
F4K3R 2015-01-22 21:34:13

30
light 2015-01-22 17:27:21

gogogo~~~

30
Anymous 2015-01-22 16:32:33

回头装树莓派上试试,移动gsm嗅探才好玩

30
light 2015-01-22 15:21:50

嗯嗯 自从装了QQ输入法,打字错误率明显提高不少。哈哈哈

30
pass123 2015-01-22 14:59:38

值得一体 这里是不是错了? 应该是: 值得一提

30
Alen 2015-01-22 10:55:35

wooyun musician 666

30
light 2015-01-22 10:47:00

感谢纠正~

30
loading 2015-01-22 10:37:42

信号写成"先好"了

30
Wens0n 2015-01-22 10:34:03

乌云音乐家

30
fsd010 2015-01-22 10:34:03

占个沙发

感谢知乎授权页面模版