SMS短信嗅探实验

前言

历经千辛万苦,在三天的尝试之后,我的摩托罗拉 C118 成功完成刷机,可抽象的是,在筛选的几个活跃信道中,挂了一个多小时,没有搜索到任何,哪怕一条短信。实验如成。为了让这个几年前的老东西成功跑起来,翻了国内外各大论坛,重新温顾了我的 linux 知识(谢谢你,我前后换了4个版本的 ubuntu 系统),下面就来详细讲讲。

准备工作

硬件

Moto C118 手机一台,电池一块,充电线一条,TTL 转接模块一个,2.5mm耳机线半根(如果不想自己 DIY 可以直接某宝买现成的)

软件

使用 VMWare + ubuntu-16.04.6-desktop-i386.iso 镜像文件搭建的虚拟机一台

1
Linux version 4.15.0-142-generic (buildd@lgw01-and64-048)(gcc version 5.4.0 20160609 (ubuntu 5.4.0-6ubuntu1~16.04.12))#146~16.04.1-Ubuntu SMP Tue Apr 1309:26:57 UTC 2021

OsmocomBB 相关软件包(安装方法见下文)

原理阐述

射频信号转化

系统通过天线接收到射频(RF)信号。接着,这个RF信号经过一个名为Rita混频器的设备,通过混频器的作用,RF信号被直接下变频到模拟I/Q(正交)基带信号。接下来,这个I/Q基带信号被传送到名为Iota ABB的设备的基带模数转换器(ADC),ADC将模拟信号转换为数字信号。最终,生成的数字信号被传递到HardwareCalypso DBB的基带串行端口(BSP)进行后续处理和分析。

1
2
3
4
5
6
flowchart LR
subgraph RF signal chain
direction LR
id1([Antenna]) --RF Signal--> id2([Mixer]) --Analog I/Q--> id3([ABB])
end
id3 --Digital I/Q --> id4([Calypso BSP])

数字基带信号处理

从基带串行端口(BSP)传递的数字基带样本被送到DSP内核,其中这些样本经过一系列处理步骤,包括处理、解调、去交错和解码等。随后,处理完成的信号通过一个共享存储器接口传递到ARM内核。在ARM内核上,存在一个名为OsmocomBB layer1的组件,其主要任务是处理MAC(媒体访问控制)块,然后通过L1CTL将它们发送到UART(通用异步收发传输)。

1
2
3
4
5
6
flowchart LR
id1([BSP]) --> id2
subgraph Inside the Calypso DBB
direction LR
id2([DSP]) --MAC blocks--> id3([ARM]) --> id4([layer1]) --struct msgb--> id5([T1CTL]) --sercomm--> id6([UART])
end

跨设备通信

PC上运行的名为osmocon的程序通过串行端口接收L1CTL消息。这个程序的任务是解复用(将不同的sercomm流分开),然后通过Unix域套接字将L1CTL消息传递给任何可能正在运行的layer23程序,例如移动设备。

1
2
3
4
5
6
7
8
flowchart LR
id1([UART]) <--RS232--> id2
subgraph On the host PC
direction LR
id2([SerialPort]) <--/dev/ttyUSB*--> id3((asmocon))--stdout-->id5([terminal])
id4(("`layer23
e.g. mobile`")) <--unix socket-->id3
end

实验过程

安装依赖

最头疼的一集,因为很多依赖的库已经失效了,而新版又不能完全兼容旧版,就是这第一步逼我尝试了四个版本的 ubuntu 系统才顺利的完成安装。

1
2
aptitude install libtool shtool autoconf git-core pkg-config make gcc
aptitude 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

如果发现 libncurses5-dbg、libncursesw5-dbg、zlibc、libmpfr4这四个包找不到,那就对啦,因为你的系统版本对不上,我多次尝试才发现 16.04.6 这个版本可以顺利安装所有软件包。

ARM编译环境

ARM交叉编译环境是一种用于在不同主机架构上开发和编译适用于ARM架构的软件的工具。它使开发人员能够有效地创建、移植和测试ARM应用程序,同时避免直接在目标ARM设备上进行开发,提高了开发效率和跨平台开发的便捷性。

1
2
3
4
mkdir arm
cd arm
wget https://osmocom.org/attachments/download/2052/gnu-arm-build.3.sh
sudo chmod +x gnu-arm-build.3.sh

这个 gnu-arm-build.3.sh 是一个编译的脚本文件,接着按照脚本需求创建文件夹。

需要注意的是,有的教程会让你使用 gnu-arm-build.2.sh脚本,这两个的区别就在于 gcc 的版本,gcc 版本过高会导致一些很抽象的错误。

1
mkdir build install src

接着我们进入src文件,下载必要的文件包。

1
2
3
4
cd src/
wget https://ftp.gnu.org/gnu/gcc/gcc-4.8.2/gcc-4.8.2.tar.bz2
wget https://ftp.gnu.org/gnu/binutils/binutils-2.21.1a.tar.bz2
wget ftp://sources.redhat.com/pub/newlib/newlib-1.19.0.tar.gz

最后那个 ftp 地址的文件可能很慢,我翻出去试了好几个地区,都很慢,建议直接去仓库找网络资源,然后我们返回 arm 目录,执行构建脚本。

1
2
cd ..
./gnu-arm-build.3.sh

虽然我们刚刚安装了很多依赖,但我不能保证安装是顺利的,这个过程会持续大概半小时,如果发现你的 shell 划过了很多五颜六色的 log ,请不要慌张,这是正常的。如果提示你 package 缺失可以使用如下命令进行查询:

1
sudo apt-cache search <package>

然后选择差不多的版本安装(这就听天由命了),温馨提示,有些包需要你用压缩包来安装,下面会讲。

如果你很幸运,成功完成了编译,shell 最后一行是:

1
Build complete! Add <path> to your PATH to make arm-none-eabi-gcc and friends accessible directly.

这个 path 就依你情况而定,然后把这个路径加到环境变量文件 ~/.bashrc 中:

1
2
vi ~/.bashrc
export PATH=<your path>/arm/install/bin:$PATH

如果你没有安装 vim 的话记得熟悉一下 vi 的用法(有点坑),然后我们让这个变量生效。

1
source ~/.bashrc

为了确保添加成功,可以使用 echo $PATH 进行查看。

编译osmocom-bb

OsmocomBB(Open Source Mobile Communications Baseband)是一个开源的移动通信基带站项目,旨在深入探索手机通信的核心部分,采用GPL许可证,鼓励用户自由查看、修改和分发代码,推动通信安全和技术的发展。它首要关注GSM标准,允许用户创建自己的GSM网络或调整现有手机行为。通过通用软件无线电(SDR)硬件,降低成本、增强灵活性,模拟多种无线电环境。吸引安全研究人员、黑客、通信爱好者,推动通信技术的前沿,包括网络漏洞和通信协议的研究与测试。

在编译 OsmocomBB 之前,我们要先安装 libosmocore ,因为 OsmocomBB 项目是基于libosmocore 的。libosmocore是一个开源软件库,主要用于支持移动通信项目。它提供了通信协议栈、信令处理、消息解析和其他基础功能,有助于简化开发通信系统的复杂性。libosmocore的作用包括提供通信协议的实现、协助构建通信基带站、支持各种通信标准(如GSM)、提高通信系统的互操作性,以及推动开放源代码和安全研究。它是许多移动通信项目的基础,为开发者提供了一个强大的工具,以加速通信技术的发展和改进。

同样的,继续安装需要的软件包

1
2
sudo apt-get install build-essential libtool libtalloc-dev shtool autoconf automake git-core pkg-config make gcc
sudo apt-get install libpcsclite-dev

如果你又遇到了软件包缺失的情况,相信你已经会解决了,换个版本或者手动安装。

接着就可以 clone 项目进行编译了:

1
2
3
4
5
6
7
8
git clone git://git.osmocom.org/libosmocore.git
cd libosmocore/
autoreconf -i
./configure
make
sudo make install
sudo ldconfig -i
cd ..

编译安装完 libosmocore 就可以继续编译 osmocombb 了,还是先 clone 仓库:

1
2
3
4
git clone git://git.osmocom.org/osmocom-bb.git
cd osmocom-bb
cd src
make

如果到这都没问题的话,那么恭喜你已经完成了软件环境的配置。

但是你大概率会碰到 “No package ‘talloc’ found” 的错误,同时你的 “apt-gey install” 在这时候也找不到相应的安装包,这时候就要自己手动安装了。

1
2
3
4
5
6
wget https://www.samba.org/ftp/talloc/talloc-2.1.7.tar.gz
tar -zxvf talloc-2.1.7.tar.gz
cd talloc-2.1.7/
./configure
make
sudo make install

刷机教程

先使用 lsusb 查看所有的 usb 设备,然后在 Moto C118 关机情况下连上你的虚拟机(可能需要配置串行端口),再次查看 usb 设备,会看到一个新的设备。

接着进入 osmocombb 的目录:

1
2
cd osmocombb/osmocom-bb/src/host/osmocon/ 
sudo ./osmocon -m c123xor -p /dev/ttyUSB0

这里如果找不到你的 usb 设备,就是串行端口的问题,然后按一下开机键,shell 会开始疯狂滚动,程序开始写入手机硬件。结束之后你的手机上会有 layer 1 osmocom bb 的字样。

开始嗅探

这里我们一共需要四个终端,在完成刷机之后那个终端我们成为终端 A ,接着我们打开第二个终端 B ,在进入 osmocombb/osmocom-bb/src/host/layer23/src/misc 之后,使用如下命令搜索附近伪基站:

1
sudo ./cell_log 

然后我们打开终端 C ,在上述 misc 目录下输入如下代码进行单个基站的信道嗅探:

1
./ccch_scan -i 127.0.0.1 -a ARFCN // 使用活跃信道的 ARFCN 值

最后我们打开终端 D ,启动 wireshark 进行抓包:

1
wireshark -k -i lo -f 'port 4729'

在过滤器中输入 gsm_sms 筛选短信,但是抽象的是,我挂了一个小时,没有监听到任何一条短信,虽然完成了基站的改造,却没有结果,属实有点可惜了。