绿盟科技 · 2016/01/07 11:09php
Author:绿盟科技博客css
OsmocomBB(Open source mobile communication Baseband)是国外一个开源项目,是GSM协议栈(Protocols stack)的开源实现。其目的是要实现手机端从物理层(layer1)到layer3的三层实现,主要进行2G网短信嗅探。本文详细地介绍了实现方法,以供安全爱好者学习和参考。html
目前来看,真正的物理层(physical layer)并无真正的开源实现,暂时也没看到实施计划。只有物理层控制。由于真正的物理层是运行在baseband processor的DSP core上,涉及到许多信号处理算法的实现,并且还要牵扯不少硬件RF的东西。这项技术至少在2010年,技术已经成熟,2011年就有开源实现了。得益于OsmocomBB 的开源项目,使得咱们用一台笔记本和很简单的硬件就能完成GSM sms嗅探。java
GSM加密采用A5算法。A5算法1989年由法国人开发,是一种序列密码,它是欧洲GSM标准中规定的加密算法,专用于数字蜂窝移动电话的加密,用于对从电话到基站链接的加密。A5的特色是效率高,适合硬件上高效实现。python
A5发展至今,有A5/一、A5/二、A5/三、A5/四、A5/五、A5/六、A5/7等7个版本,目前GSM终端通常都支持A5/1和A5/3,A5/4以上基本不涉及。值得注意的是,A5/2是被『故意弱化强度』的版本,专用于『出口』给『友邦』,2006年后被强制叫停,终端不容许支持A5/2。git
手机开机时的位置更新流程:github
支持的手机web
咱们选择Moto C118,由于官方支持的最好、硬件成本低,¥35/台(手机+电池+充电器)算法
推荐带TX/RX LED的 FT232模块,固然其余模块也能够,好比CP210二、CP2303等模块,不过使用前要先调比如特率。FT232模块,我买的是¥35的,第一个嘛,为了求稳定。后面作多个手机联合嗅探的时候能够尝试买一些便宜的。安全
这个数据线就是2.5mm耳机头转杜邦线,注意一头是2.5mm耳机孔的,另外一边是杜邦线链接串口模块。手边有2.5mm耳机插头的能够本身作一个。固然网上如今也有现成的了,不过成本稍微高一点。¥15左右一条
这个线应该都有,之前的mp三、手机啥的都是这个线,马云家卖¥10,若是你用了Pl2303那类的USB转换板,就能够不用这根线了,那个板子上自带U口。
MacOs 10.10.5 + VMworkstation + Ubuntu 12.04 x64
个人实验用的是这样的环境,网上不少教程都说X64的虚拟机不能正常编译,可是我确实是成功了。也能够尝试使用别的环境试试,毕竟个人实验环境仅供参考。
网路环境要求可以正常访问github,实验环境周围存在GSM信号。
C118手机有足够的电量,支持实验。
具体项目目录结构和所需文件以下图:
准备好以后的目录以下图:
我是把整个source目录放在了用户文件夹下,仅作参考。只须要按照上面文字格式的结构图准备就好,图片中未出现部分后面会写如何出现…
编译前安装所需的依赖库文件:
#!bash
sudo apt-get install build-essential libgmp3-dev libmpfr-dev libx11-6 libx11-dev texinfo flex bison libncurses5 libncurses5-dbg libncurses5-dev libncursesw5 libncursesw5-dbg libncursesw5-dev zlibc zlib1g-dev libmpfr4 libmpc-dev
复制代码
在arm根目录执行build.sh文件进行build操做:
#!bash
chmod +x gnu-arm-build.2.sh ./ gnu-arm-build.2.sh
复制代码
完成后arm/install/目录结构如图所示:
由于编译须要,把arm/install/bin路径加入到环境变量中,我这里是加入到用户的环境变量中。使用pwd命令获取绝对路径:
修改~/.bashrc
文件,最后一行加入:
#!bash
export PATH=$PATH:/home/wooyaa/source/arm/install/bin
复制代码
执行source命令让配置文件即时生效:
#!bash
source ~/.bashrc
复制代码
在终端中输入arm而后按tab键,若是出现以下图所示就说明编译环境搞定了:
把osmocom项目gitclone到source目录下:
#!bash
git clone git://git.osmocom.org/osmocom-bb.git git clone git://git.osmocom.org/libosmocore.git
复制代码
在libosmocore/目录中编译osmocom核心库文件
#!bash
cd /home/wooyaa/source/libosmocore/ autoreconf -i ./configure make sudo make install
复制代码
编译OsmocomBB:
#!bash
cd /home/wooyaa/source/osmocom-bb/src/ git checkout –track origin/luca/gsmmap //选择分支 make //交叉编译
复制代码
若是没什么问题,软件环境和固件就都编译好了。
Ununtu 12.04自带FT232R驱动,因此直接链接就能使用,不须要再装驱动。
常见报错有多是autoconf、libtool、libpcsclite-dev等文件的缺失,只要装好就好了。具体版本请使用apt-cache search xxx
在你本身电脑中的apt-get的list中查找。
在终端中输入lsusb
,会显示当前usb链接的信息:
若是驱动正常,插上MiniUSB线后就能看到usb-serial:
网上的教程大多都误认为是将firmware刷入手机,实际上这里只是把固件加载到手机RAW中执行。
#!bash
cd /home/wooyaa/source/osmocom-bb/src/host/osmocon/./osmocon -m c123 -p /dev/ttyUSB0 ../../target/firmware/board/compal_e88/layer1.compalram.bin
复制代码
终端上会显示”starting up”字样,以下:
手机屏幕显示Layer 1 osmocom-bb 字样就表示成功了:
#!bash
cd /home/wooyaa/source/osmocom-bb/src/host/layer23/src/misc/sudo ./cell_log –O
复制代码
其中cell_log的参数是字母O,具体做用是只检查ARFCN是否可用,不进行其它操做,能够用./cell_log –help参看说明。
终端中会输出日志信息,其中会包含可以收到的基站的相关信息,格式相似这样:
#!bash
cell_log.c:248 Cell: ARFCN=40 PWR=-61dB MCC=460 MNC=00 (China,China Mobile)
复制代码
ARFCN后面的编号能够表明基站信道号,还包含了运营商信息。
由于咱们买的便宜货,每一个手机只能嗅探一个信道,具体一些的,能够参考下面的图(咱们如今只能抓Downlink的数据包):
由于想要Sniffer Uplink的包,要修改硬件,C118主板上的RX filters要换掉,换成咱们须要的HHM1625&&HHM1623C1滤波器组件,才能抓Uplink的数据包。
有关信道号ARFCN的问题,能够参考下面的图:
选择想要监听的信道号并开始嗅探广播数据。
在目录/home/wooyaa/source/osmocom-bb/src/host/layer23/src/misc/下执行嗅探:
#!bash
./ccch_scan -i 127.0.0.1 -a THE_ATFCN_ID
复制代码
其中THE_ATFCN_ID就是扫描到的日志中参数ARFCN的值。
苹果手机能够执行:3001#12345# 进入工程模式后,选择GSM Cell Environment->GSM Cell Info->GSM Serving Cell,就能够看到目前手机链接的基站ARFCN值了,应该在第二步中,也能看到这个ID存在。
其余手机的命令
Samsung (Android): *#0011#
使用wireshark抓取监听数据
由于osmocomBB执行以后默认会在本地开启4729端口,这时候的GSM协议已经被封装上了TCP-IP,能够在本地用wireshark抓到,因此咱们使用wireshark去监听4729的端口
#!bash
sudo wireshark -k -i lo -f 'port 4729'
复制代码
在wireshark中过滤gsm_sms协议数据,过滤以后获得的数据里面就包含短信的明文信息。 过滤后获得的明文短信信息
SMS text就是短信的明文内容,其余git分支还支持把监听到的数据保存到cap包,而后经过脚原本过滤包内容,达到嗅探短信明文的目的。后面会有计划的去尝试。
layer23是用/home/wooyaa/source/osmocom-bb/src/host/layer23/src/mobile下的mobile程序实现,因此经过执行mobile文件能够进行自定义,配置一些关于osmocom-bb的信息。
#!bash
cd /home/wooyaa/source/osmocom-bb/src/host/layer23/src/mobile
sudo ./mobile -i 127.0.0.1
复制代码
执行mobile程序以后,会在本地开启4247端口,使用telnet链接,而后配置执行,随时使用?来查看help信息。
简单来说,短信接受者的号码、IMEI等数据,只有在”Location Update”时才会在网络中出现,而且是以加密形式传输的。当接收短信时,基站根据以前位置更新时注册的信息,判断接收者的位置。因此,想要拿到接受者的号码,须要破解A5/1算法并还原出”Location Update”时的原文。
只不过须要价格昂贵的USRP2…
另外还看到个RTL-SDR的文章(就是之前传说中能够跟踪飞机的电视棒),也支持Airprobe:
sudo -s root
权限下操做。由于想要嗅探Uplink的包,要修改硬件,C118主板上的RX filters要换掉,换成咱们须要的HHM1625&&HHM1623C1滤波器组件,才能抓Uplink的数据包。修改方法以下:
要使手机可以成为『passive uplink sniffer』,必须动到电烙铁,替换掉RX filters。
替换前:
摘掉后:
替换后:
使用OsmocomBB RSSI monitor查看信号强弱:
#!bash
./osmocom-bb/src/host/osmocon/osmocon -p /dev/ttyUSB0 -m c123xor -c ./osmocom-
bb/src/target/firmware/board/compal_e88/rssi.highram.bin ./osmocom-
bb/src/target/firmware/board/compal_e88/chainload.compalram.bin
复制代码
因为RSSI太大,不便于像OsmocomBB那样直接加载,因此要先用-C参数加载一个小的chainloader程序去加载咱们真正的RSSI Payload程序:
制做成绵羊墙,在线实时显示嗅探到的短信
尝试多设备一块儿嗅探,加强嗅探范围和效果
图中例子耳机为moto T191的耳机,右图中标注的颜色为耳机线拆开后里面线芯的颜色。耳机线拆开后里面会包含3根带有外皮的铜线。
从协议图中得知,移动设备(MS)和基站(BTS)间使用Um接口,最底层就是刷入手机的layer1物理传输层,之上分别是layer2数据链路层和layer3网络层。
位于图中layer2的LAPDm,是一种保证数据传输不会出错的协议。一个LAPDm帧共有23个字节(184个比特),提供分片管理控制等功能。
layer3的协议则能够分为RR/MM/CM三种,这里只列出嗅探相关的功能:
参考GSM的文档 TS 04.06 得知 LAPDm 的Address field字段中,定义了 3.3.3 Service access point identifier (SAPI)。SAPI=3就是咱们要的Short message service。 使用tcpdump配合show_gsmtap_sms.py脚本在console列出短信明文。
#!bash
tcpdump -l -ilo -nXs0 udp and port 4729 | python2 -u show_gsmtap_sms.py
复制代码
参考文献