Introducción
Osmocom (Open Source Mobile Communications) es un proyecto de código abierto dedicado a desarrollar software y herramientas para redes de comunicaciones móviles. Su objetivo principal es implementar de manera abierta y accesible una gama de tecnologías de redes móviles, como redes GSM (2G), con sus diferentes módulos en forma de bibliotecas.
El proyecto relacionado con la creación de redes móviles es el CNI (Cellular Network Infrastructure), que son implementaciones de la pila de protocolos y elementos de la red de GSM. Los proyectos utilizados para la creación de la red son OsmoMSC, OsmoBSC, OsmoSTP, OsmoHLR, OsmoMGW. Por otro lado necesitamos el elemento que cree la estación base, OsmoBTS, que soporta distintos dispositivos hardware y software. Y por último el transceptor que dará soporte a OsmoBTS, el componente OsmocomBB.
OsmoMSC (Mobile Switching Center) implementa la gestión del enrutado de las llamadas y de los mensajes de texto dentro de la red. Permite administrar la autenticación y movilidad de los usuarios, la gestión de números de teléfono y la conmutación de llamadas.
OsmoBSC (Base Station Controller) actúa como el controlador de las estaciones base dentro de una red GSM, gestionando las comunicaciones entre los dispositivos móviles y la red principal con el tráfico de OsmoMSC.
OsmoSTP (Signaling Transfer Point) enruta mensajes de señalización entre los distintos elementos de la red como OsmoMSC y OsmoBSC a través del protocolo SS7 (Signaling System No. 7). SS7 es el protocolo tradicional utilizado para la señalización en redes de telecomunicaciones.
OsmoHLR (Home Location Register) actúa como la base de datos central de suscriptores, almacenando la información de los usuarios como el número de teléfono (MSISDN), el identificador (IMSI), la autenticación y el estado de la suscripción. Se integra con OsmoMSC.
OsmoMGW (Media Gateway) actúa como una pasarela de medios cuya función principal es manejar el tráfico de voz y otros tipos de datos entre diferentes partes de la red, convirtiendo y transmitiendo datos de audio. Se integra con OsmoMSC y OsmoBSC.
OsmoBTS (Base Transceiver Station) controla la estación base que transmite y recibe las señales de los dispositivos en una red GSM. Se puede conectar con el controlador OsmoBSC.
OsmocomBB (Base Band) desarrolla un firmware de código abierto para la banda base de teléfonos GSM. Este firmware permite reemplazar el software propietario, accediendo al hardware del módem y a los protocolos GSM de bajo nivel. Esto permite el envío y recepción de mensajes de control de la red, llamadas y mensajes de texto.
OsmocomBB es muy utilizado en la investigación de seguridad, ya que proporciona una plataforma accesible para analizar vulnerabilidades en la red GSM, estudiar el cifrado, interceptar comunicaciones o entender cómo funcionan los protocolos de autenticación y control.
Puede operar en conjunto con OsmoBTS y OpenBSC, para crear redes experimentales completas físicas donde un dispositivo actúa como la estación base de la red. También puede actuar como dispositivo cliente en la red. OsmocomBB solo es compatible con un número muy reducido de modelos de teléfonos (como algunos Motorola C123, C139, entre otros).
FakeTRX es un módulo que permite emular esta funcionalidad sin necesidad de utilizar hardware de radio real, facilitando pruebas y experimentación en redes GSM de forma más accesible creando una estación base virtual mediante la aplicación transceiver y un dispositivo móvil virtual mediante la aplicación mobile. En el caso de utilizar un dispositivo de radio definida por software (SDR) como la familia LimeSDR se utilizará OsmoTRX en vez de OsmocomBB.
Instalación del software
OsmoMSC, OsmoBSC, OsmoSTP, OsmoHLR, OsmoMGW y OsmoBTS se pueden instalar directamente desde el repositorio de Debian o compilar e instalar desde el código fuente. En cambio OsmocomBB, al ser un software experimental, necesita ser compilado desde el código fuente. Las carpetas de los proyectos a compilar se ubicarán en el directorio ~/osmocom.
mkdir ~/osmocom
cd ~/osmocom
Opción 1: Instalación de los componentes desde el repositorio
sudo apt install osmo-msc osmo-bsc osmo-stp osmo-hlr osmo-mgw osmo-bts
Opción 2: Instalación de los componentes desde el código fuente
Dependencias para la compilación de
osmo-hlr
sudo apt install libsqlite3-dev
libosmo-abis (dependencia de osmo-bts)
sudo apt install build-essential libtool libortp-dev osmocom-dahdi-source libsctp-dev shtool autoconf automake git-core pkg-config make gcc
Compilación e instalación
osmo-msc
libosmo-sigtran (dependencia) (incluye osmo-stp)
git clone https://gitea.osmocom.org/osmocom/libosmo-sigtran.git
cd libosmo-sigtran/
autoreconf -i
./configure
make -j16
sudo make install
sudo ldconfig -i
cd ..
osmo-msc
git clone https://gitea.osmocom.org/cellular-infrastructure/osmo-msc.git
cd osmo-msc/
autoreconf -i
./configure
make -j16
sudo make install
sudo ldconfig -i
cd ..
osmo-bsc
osmo-bsc
git clone https://gitea.osmocom.org/cellular-infrastructure/osmo-bsc.git
cd osmo-bsc/
autoreconf -i
./configure
make -j16
sudo make install
sudo ldconfig -i
cd ..
osmo-hlr
osmo-hlr
git clone https://gitea.osmocom.org/cellular-infrastructure/osmo-hlr.git
cd osmo-hlr/
autoreconf -i
./configure
make -j16
sudo make install
sudo ldconfig -i
cd ..
osmo-mgw
osmo-mgw
git clone https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
cd osmo-mgw/
autoreconf -i
./configure
make -j16
sudo make install
sudo ldconfig -i
cd ..
osmo-bts
libosmo-abis (dependencia)
git clone https://gitea.osmocom.org/osmocom/libosmo-abis.git
cd libosmo-abis/
autoreconf -i
./configure
make -j16
sudo make install
sudo ldconfig -i
cd ..
libosmo-netif (dependencia)
git clone https://gitea.osmocom.org/osmocom/libosmo-netif
cd libosmo-netif/
autoreconf -i
./configure
make -j16
sudo make install
sudo ldconfig -i
cd ..
osmo-bts
git clone https://gitea.osmocom.org/cellular-infrastructure/osmo-bts.git
cd osmo-bts/
autoreconf -i
./configure --enable-trx
make -j16
sudo make install
sudo ldconfig -i
cd ..
Instalación de OsmocomBB desde el código fuente
Dependencias para la compilación de
libosmocore (dependencia de osmocom-bb)
sudo apt install build-essential libtool libtalloc-dev libsctp-dev shtool autoconf automake git-core pkg-config make gcc gnutls-dev python3-minimal libusb-1.0-0-dev libmnl-dev liburing-dev libpcsclite-dev
osmocom-bb
sudo apt install libtool shtool automake autoconf git-core pkg-config make gcc
Compilación e instalación
osmocom-bb
libosmocore (dependencia)
git clone https://gitea.osmocom.org/osmocom/libosmocore.git
cd libosmocore/
autoreconf -i
./configure
make -j16
sudo make install
sudo ldconfig -i
cd ..
libosmo-gprs (dependencia)
git clone https://gitea.osmocom.org/osmocom/libosmo-gprs.git
cd libosmo-gprs/
autoreconf -i
./configure
make -j16
sudo make install
sudo ldconfig -i
cd ..
osmocom-bb
git clone https://gitea.osmocom.org/phone-side/osmocom-bb.git
cd osmocom-bb
cd src
make nofirmware
cd ../..
Archivos de configuración
Los archivos de configuración de las aplicaciones serán guardados en el directorio ~/osmocom/config.
mkdir ~/osmocom/config
osmo-hlr.cfg
Tomamos el archivo de configuración de ejemplo. Añadimos subscriber-create-on-demand 3 cs+ps debajo de ussd. Esta configuración crea automáticamente una nueva entrada en el HLR para cada nuevo IMSI registrado en la red, asignándole un número de teléfono (MSISDN) aleatorio de tres cifras en la red CS (Circuit Switched) y en la red PS (Packet Switched).
!
! OsmoHLR example configuration
!
log stderr
logging filter all 1
logging color 1
logging print category-hex 0
logging print category 1
logging timestamp 0
logging print file basename last
logging print level 1
logging level main notice
logging level db notice
logging level auc notice
logging level ss notice
logging level linp error
!
line vty
bind 127.0.0.1
ctrl
bind 127.0.0.1
hlr
gsup
bind ip 127.0.0.1
ussd route prefix *#100# internal own-msisdn
ussd route prefix *#101# internal own-imsi
subscriber-create-on-demand 3 cs+ps
ps
pdp-profiles default
profile 1
apn internet
profile 2
apn *
osmo-stp.cfg
Tomamos el archivo de configuración de ejemplo. No hacemos ningún cambio en este caso.
!
! osmo-stp (0.0.6.3.179-b248) configuration saved from vty
!!
!
log stderr
logging filter all 1
logging color 1
logging print category 1
logging timestamp 0
logging level set-all notice
line vty
no login
!
cs7 instance 0
xua rkm routing-key-allocation dynamic-permitted
listen m3ua 2905
accept-asp-connections dynamic-permitted
osmo-mgw.cfg
Tomamos el archivo de configuración de ejemplo. No hacemos ningún cambio en este caso.
!
! MGCP configuration example
!
log stderr
logging color 1
logging print category-hex 0
logging print category 1
logging timestamp 0
logging print file basename last
logging print level 1
mgcp
bind ip 127.0.0.1
rtp port-range 4002 16001
rtp bind-ip 127.0.0.1
rtp ip-probing
rtp ip-dscp 46
bind port 2427
number endpoints 512
force-realloc 1
rtcp-omit
rtp-patch ssrc
rtp-patch timestamp
osmo-msc.cfg
Tomamos el archivo de configuración de ejemplo. Modificamos los valores network country code, mobile network code, short name, y long name. Los valores de MCC (network country code) y MNC (mobile network code) para redes de prueba son 001 y 01, respectivamente. En cuanto al nombre de la red en su versión corta short name y versión larga long name, utilizaremos Test y Test Network, respectivamente.
!
! OsmoMSC configuration saved from vty
!
log stderr
logging color 1
logging print category-hex 0
logging print category 1
logging timestamp 0
logging print file basename last
logging print level 1
line vty
no login
!
network
network country code 001
mobile network code 01
short name Test
long name Test Network
encryption a5 0
rrlp mode none
mm info 1
mgw 0
remote-ip 127.0.0.1
remote-port 2427
local-port 2728
msc
assign-tmsi
auth-tuple-max-reuse-count 3
auth-tuple-reuse-on-error 1
osmo-bsc.cfg
Tomamos el archivo de configuración de ejemplo. Modificamos los valores network country code, mobile network code, band, y arfcn. Pata network country code y mobile network code tomamos los valores anteriores. Como banda de frecuencias band utilizamos la GSM900 en los 900 MHz y como número de canal arfcn, al ser una red virtual podemos utilizar uno al azar, como el 1 (935.2 MHz).
! osmo-bsc default configuration
! (assumes STP to run on 127.0.0.1 and uses default point codes)
!
log stderr
logging color 1
logging print category-hex 0
logging print category 1
logging timestamp 0
logging print file basename last
logging print level 1
e1_input
e1_line 0 driver ipa
network
network country code 001
mobile network code 01
encryption a5 0
neci 1
paging any use tch 0
handover 0
handover algorithm 1
handover1 window rxlev averaging 10
handover1 window rxqual averaging 1
handover1 window rxlev neighbor averaging 10
handover1 power budget interval 6
handover1 power budget hysteresis 3
handover1 maximum distance 9999
! T3212 is in units of 6min, so below we set 5 * 6 = 30min
timer net T3212 5
mgw 0
remote-ip 127.0.0.1
remote-port 2427
local-port 2727
bts 0
type osmo-bts
band GSM900
cell_identity 6969
location_area_code 0x0001
base_station_id_code 63
ms max power 15
cell reselection hysteresis 4
rxlev access min 0
radio-link-timeout 32
channel allocator mode set-all ascending
rach tx integer 9
rach max transmission 7
channel-description attach 1
channel-description bs-pa-mfrms 5
channel-description bs-ag-blks-res 1
early-classmark-sending forbidden
ipa unit-id 6969 0
oml ipa stream-id 255 line 0
codec-support fr
gprs mode none
trx 0
rf_locked 0
arfcn 1
nominal power 23
! to use full TRX power, set max_power_red 0
max_power_red 20
rsl e1 tei 0
timeslot 0
phys_chan_config CCCH+SDCCH4
hopping enabled 0
timeslot 1
phys_chan_config TCH/F
hopping enabled 0
timeslot 2
phys_chan_config TCH/F
hopping enabled 0
timeslot 3
phys_chan_config TCH/F
hopping enabled 0
timeslot 4
phys_chan_config TCH/F
hopping enabled 0
timeslot 5
phys_chan_config TCH/F
hopping enabled 0
timeslot 6
phys_chan_config TCH/F
hopping enabled 0
timeslot 7
phys_chan_config TCH/F
hopping enabled 0
msc 0
! Do not allow emergency calls unless you can route
! them to the local emergency services
allow-emergency deny
bsc
mid-call-timeout 0
osmo-bts.cfg
Tomamos el archivo de configuración de ejemplo. Modificamos el valor band con el valor 900. Añadimos las líneas gsmtap-remote-host 127.0.0.1 y gsmtap-sapi enable-all debajo de la de oml en el apartado de bts para poder monitorizar el tráfico de la red a través del puerto UDP 4729.
!
! OsmoBTS () configuration saved from vty
!!
!
log stderr
logging color 1
logging print category-hex 0
logging print category 1
logging timestamp 0
logging print file basename last
logging print level 1
logging level rsl notice
logging level oml notice
logging level rll notice
logging level rr notice
logging level meas error
logging level pag error
logging level l1c error
logging level l1p error
logging level dsp error
logging level abis error
!
line vty
no login
!
phy 0
instance 0
osmotrx ip local 127.0.0.1
osmotrx ip remote 127.0.0.1
bts 0
band 900
ipa unit-id 6969 0
oml remote-ip 127.0.0.1
gsmtap-remote-host 127.0.0.1
gsmtap-sapi enable-all
trx 0
phy 0 instance 0
mobile.cfg
Tomamos el archivo de configuración de ejemplo. Modificamos el valor sim reader a sim test, el imei, el imsi y el rplmn dentro de test-sim. Simularemos una tarjeta sim con el valor sim test, con un IMEI 454527910940629, IMSI 001012698452156 aleatorio y un valor RPLMN (Registered Public Land Mobile Network) correspondiente al MCC y MNC configurados anteriormente.
!
! OsmocomBB example configuration for mobile application
!!
!
line vty
no login
!
gps device /dev/ttyACM0
gps baudrate default
no gps enable
!
no hide-default
!
ms 1
layer2-socket /tmp/osmocom_l2
sap-socket /tmp/osmocom_sap
mncc-socket /tmp/ms_mncc_1
mncc-handler internal
sim test
network-selection-mode auto
imei 454527910940629 0
imei-fixed
no emergency-imsi
no sms-service-center
no call-waiting
no auto-answer
no force-rekey
no clip
no clir
tx-power auto
no simulated-delay
no stick
location-updating
neighbour-measurement
codec full-speed prefer
codec half-speed
no abbrev
support
sms
a5/1
a5/2
p-gsm
e-gsm
r-gsm
no gsm-850
dcs
no pcs
class-900 4
class-850 4
class-dcs 1
class-pcs 1
channel-capability sdcch+tchf+tchh
full-speech-v1
full-speech-v2
half-speech-v1
no full-data-14400
full-data-9600
full-data-4800
half-data-4800
full-data-2400
half-data-2400
min-rxlev -106
dsc-max 90
no skip-max-per-band
test-sim
imsi 001012698452156
ki comp128 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
no barred-access
rplmn 001 01
tch-data
io-handler unix-sock
io-tch-format ti
unix-socket /tmp/ms_data_1
call-params type-rate 71
call-params ce transparent
call-params async
call-params async nr-stop-bits 1
call-params async nr-data-bits 8
call-params async parity none
tch-voice
io-handler l1phy
! io-format ti
alsa-output-dev default
alsa-input-dev default
no shutdown
Inicio de la estación base con tmux
El despliegue de las aplicaciones se va a realizar utilizando el multiplexador de terminales tmux, que creará una ventana llamada Osmocom con las aplicaciones y sus registros. También creará otra ventana llamada OsmoCTL con las interfaces vty para poder interactuar mediante consola con las aplicaciones. Para todas las aplicaciones especificamos el archivo de configuración con el argumento -c.
Con el programa fake_trx.py del directorio ~/osmocom/osmocom-bb/src/target/trx_toolkit creamos el transceptor para la estación para y para un dispositivo móvil. Con el programa trxcon del directorio ~/osmocom/osmocom-bb/src/host/trxcon/src creamos un puente entre la aplicación mobile y transceptor. La aplicación mobile se encuentra en el directorio ~/osmocom/osmocom-bb/src/host/layer23/src/mobile.
tmux new-session -d -s Osmocom
tmux new-window -a -t Osmocom -n HLR 'osmo-hlr -c ~/osmocom/config/osmo-hlr.cfg'
tmux new-window -a -t Osmocom -n STP 'osmo-stp -c ~/osmocom/config/osmo-stp.cfg'
tmux new-window -a -t Osmocom -n MGW 'osmo-mgw -c ~/osmocom/config/osmo-mgw.cfg'
tmux new-window -a -t Osmocom -n MSC 'osmo-msc -c ~/osmocom/config/osmo-msc.cfg'
tmux new-window -a -t Osmocom -n BSC 'osmo-bsc -c ~/osmocom/config/osmo-bsc.cfg'
tmux new-window -a -t Osmocom -n TRX 'python3 ~/osmocom/osmocom-bb/src/target/trx_toolkit/fake_trx.py'
tmux new-window -a -t Osmocom -n BTS 'osmo-bts-trx -c ~/osmocom/config/osmo-bts-trx.cfg'
tmux new-window -a -t Osmocom -n TRC '~/osmocom/osmocom-bb/src/host/trxcon/src/trxcon'
tmux new-window -a -t Osmocom -n MOB '~/osmocom/osmocom-bb/src/host/layer23/src/mobile/mobile -c ~/osmocom/config/mobile.cfg'
tmux new-session -d -s OsmoCTL
tmux new-window -a -t OsmoCTL -n HLR 'telnet 127.0.0.1 4258'
tmux new-window -a -t OsmoCTL -n STP 'telnet 127.0.0.1 4239'
tmux new-window -a -t OsmoCTL -n MGW 'telnet 127.0.0.1 4243'
tmux new-window -a -t OsmoCTL -n MSC 'telnet 127.0.0.1 4254'
tmux new-window -a -t OsmoCTL -n BSC 'telnet 127.0.0.1 4242'
tmux new-window -a -t OsmoCTL -n BTS 'telnet 127.0.0.1 4241'
tmux new-window -a -t OsmoCTL -n MOB 'telnet 127.0.0.1 4247'
tmux attach-session -t Osmocom
tmux attach-session -t OsmoCTL
Conclusión
Con las aplicaciones instaladas, configuradas y desplegadas se podrá iniciar con el análisis de la red utilizando Wireshark escuchando en el puerto 4729 por paquetes UDP. Por otro lado, con la aplicación mobile será posible utilizar un móvil virtual para realizar operaciones como realizar llamadas o enviar SMS.