Мо­биль­ная связь — одна из самых инте­рес­ных и слож­ных инже­нер­ных сис­тем: тут тебе и ради­ока­нал, и сиг­нализа­ция, и иден­тифика­ция або­нен­та, и мар­шру­тиза­ция вызовов. Эта статья — про изу­чение прин­ципов GSM (2G) и сбор­ку лабора­тор­ного стен­да для экспе­римен­тов и отладки.

Со­товая связь прош­ла длин­ный и тер­нистый путь от ана­лого­вых сетей типа 1G до сегод­няшне­го 5G. В этой статье речь пой­дет про 2G/GSM — вто­рое поколе­ние сетей, которое мес­тами все еще исполь­зует­ся.

Для нас важ­но то, что стан­дарт про­ще, чем более сов­ремен­ные, тре­бова­ния к обо­рудо­ванию не такие высокие, а под­держи­вает­ся он до сих пор всем обо­рудо­вани­ем. 2G, в отли­чие от 3G и более сов­ремен­ных поколе­ний, про­екти­ровал­ся без уче­та тре­бова­ний безопас­ности: в нем нет вза­имной аутен­тифика­ции, а крип­тогра­фия поч­ти сме­хот­ворно сла­ба даже в срав­нении с 3G, так что пот­рениро­вать­ся на таком полиго­не инте­рес­но.

По мере рас­простра­нения сетей чет­верто­го и пятого поколе­ний опе­рато­ры ста­рают­ся пос­тепен­но выводить 2G/3G из экс­плу­ата­ции, что­бы повысить безопас­ность сетей и сни­зить количес­тво ста­рого обо­рудо­вания. Тем не менее 2G еще жив и активно исполь­зует­ся для нужд IoT и пок­рытия хоть какой‑то связью уда­лен­ных и малона­селен­ных рай­онов.

В раз­ных стра­нах сро­ки отклю­чения сетей ста­рых поколе­ний очень силь­но отли­чают­ся: где‑то 2G начали выводить из экс­плу­ата­ции с начала 2020-х годов, а где‑то это делать еще даже не пла­ниру­ют.

 

Подготовка

Пе­ред запус­ком стен­да необ­ходимо под­готовить сис­тему и SDR, которая и будет отве­чать за ради­очасть базовой стан­ции. Я буду исполь­зовать SDR bladeRF A4, а ПО YateBTS будем запус­кать на вир­туаль­ной машине VMware с Ubuntu 24 внут­ри. Для кор­рек­тной работы нашей базовой стан­ции рекомен­дует­ся соз­давать машину не менее чем с восемью ядра­ми и 8 Гбайт опе­ратив­ной памяти. Раз­мер дис­ка не осо­бо важен — я выделил 100 Гбайт, но мож­но и мень­ше.

warning

Статья име­ет озна­коми­тель­ный харак­тер и пред­назна­чена для спе­циалис­тов по безопас­ности. Автор и редак­ция не несут ответс­твен­ности за любой вред, при­чинен­ный с при­мене­нием изло­жен­ной информа­ции. Рас­простра­нение вре­донос­ных прог­рамм, наруше­ние работы сис­тем и наруше­ние тай­ны перепис­ки прес­леду­ются по закону. Пред­став­ленная информа­ция может рас­смат­ривать­ся толь­ко в теоре­тичес­ком или исто­ричес­ком кон­тек­сте и не пред­назна­чена для прак­тичес­кого при­мене­ния.

Те­перь нуж­но нас­тро­ить хос­товую сис­тему. На Windows 11 кор­рек­тной работе SDR внут­ри вир­туал­ки будет мешать Virtualization Based Security, которая огра­ничи­вает про­изво­дитель­ность вир­туаль­ной машины для обес­печения луч­шей безопас­ности. Пос­коль­ку для кор­рек­тной работы базовой стан­ции тай­мин­ги переда­чи очень важ­ны, нуж­но отклю­чить все, что может на нее вли­ять. Для отклю­чения VBS в тер­минале от адми­нис­тра­тора выпол­ни

reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard" /v EnableVirtualizationBasedSecurity /t REG_DWORD /d 0 /f

Так­же отклю­чаем Credential Guard, который может дер­жать VBS вклю­чен­ной:

reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LsaCfgFlags /t REG_DWORD /d 0 /f
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\DeviceGuard" /v LsaCfgFlags /t REG_DWORD /d 0 /f

И отклю­чаем HyperV:

bcdedit /set hypervisorlaunchtype off

Даль­ше перезаг­ружа­ем ПК и перехо­дим к сле­дующе­му пун­кту.

Пос­ле экспе­римен­тов не забудь вклю­чить все обратно:

reg delete "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard" /v EnableVirtualizationBasedSecurity /f
reg delete "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LsaCfgFlags /f
reg delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\DeviceGuard" /v LsaCfgFlags /f
bcdedit /set hypervisorlaunchtype auto

Те­перь идем в нас­трой­ки вир­туаль­ной машины в VMware, заходим в USB Controller и выс­тавля­ем USB compatibility в USB 3.1. Это нуж­но для под­держа­ния ско­рос­ти обме­на дан­ными меж­ду bladeRF и вир­туаль­ной машиной. Ско­рость обме­на дан­ными кри­тич­на для YateBTS: если какие‑то кус­ки будут опаз­дывать, то кли­ент­ское устрой­ство потом не смо­жет син­хро­низи­ровать­ся с базовой стан­цией.

Те­перь вклю­чаем вир­туаль­ную машину, под­клю­чаем bladeRF через USB 3.0 и про­киды­ваем его в VMware. Что­бы убе­дить­ся, что все работа­ет имен­но по 3.0, пос­мотрим все USB-устрой­ства в Ubuntu:

root@ubuntu:/home/ubuntu# lsusb
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 004 Device 002: ID 2cf0:5250 Nuand LLC bladeRF 2.0 micro <-- bladeRF

root@ubuntu:/home/ubuntu# lsusb -t
/: Bus 004.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/4p, 20000M/x2
|__ Port 001: Dev 002, If 0, Class=Vendor Specific Class, Driver=[none], 5000M <-- bladeRF

На­ходим bladeRF в выводе lsusb, далее коман­дой lsusb -t про­верим ско­рость переда­чи дан­ных. Как видишь, у меня bladeRF под­клю­чена к 3.0 root hub и име­ет ско­рость 5000М (5 Гбит/с).

Ког­да с прог­рам­мной частью покон­чено, перехо­дим к SDR. Тут все прос­то: нуж­но толь­ко вклю­чить ее и подоб­рать антенны. В зависи­мос­ти от час­тот, которые прог­рам­мно нас­тра­ивают­ся в YateBTS, нуж­ны раз­ные антенны, но в домаш­нем сетапе на рас­сто­яниях в десят­ки сан­тимет­ров выбор антенны упро­щает­ся — я исполь­зовал четыре прос­тые телес­копичес­кие антенны, которые мож­но най­ти в интерне­те за копей­ки. Если бы у нас был более мас­штаб­ный тест, приш­лось бы исполь­зовать спе­циаль­ные GSM-антенны, соз­данные для этих час­тот.

Вто­рое тре­бова­ние в под­готов­ке SDR — хороший кабель USB 3.0. BladeRF может работать и в режиме USB 2.0, но тут кри­тичес­ки важ­но про­верить, что твой кабель под­держи­вает USB 3.0, так как это силь­но пов­лияет на ско­рость переда­чи и син­хро­низа­цию.

Тестовый стенд
Тес­товый стенд

Пос­ледняя круп­ная часть лабора­тории — прог­рамми­руемые SIM-кар­ты. Вари­антов, какие исполь­зовать, тут хва­тает — вот, нап­ример офи­циаль­ный от YateBTS. Я же пошел более слож­ным путем и заказал набор карт для работы с 5G от sysmocom вмес­те с прог­рамма­тором и SIMTrace2 — устрой­ством, которое может сни­фать дан­ные меж­ду сим‑кар­той и модемом.

Тестовые SIM-карты
Тес­товые SIM-кар­ты

Са­ми сим­ки нас­тра­ивать никак не нуж­но, все необ­ходимые дан­ные с них для работы в 2G-сетях мы про­чита­ем поз­же. Сегод­ня нас инте­ресу­ют толь­ко номера IMSI — это уни­каль­ный иден­тифика­тор, по которо­му опре­деля­ется сим­ка и по которо­му мы будем раз­решать кли­ентам под­клю­чать­ся к нашей лабора­тории.

warning

IMSI и дру­гие парамет­ры SIM-кар­ты отно­сят­ся к дан­ным, исполь­зуемым для иден­тифика­ции або­нен­та в сети свя­зи. Работа с такими дан­ными допус­тима толь­ко в отно­шении собс­твен­ных тес­товых SIM-карт, пред­назна­чен­ных для лабора­тор­ных экспе­римен­тов. Исполь­зование SIM-карт реаль­ных опе­рато­ров без их сог­ласия и вне раз­решен­ной тес­товой сре­ды может нарушать тре­бова­ния законо­датель­ства о свя­зи и тай­не ком­муника­ций.

 

Установка

Соб­рать стенд — это толь­ко полови­на задачи. Вто­рая — уста­новить и нас­тро­ить весь софт. Это мы сей­час и раз­берем.

 

libbladerf

На­чать ковыря­ния сто­ит с драй­вера для bladeRF и ути­лит, необ­ходимых для работы с SDR. В зависи­мос­ти от тво­ей сис­темы есть два вари­анта уста­нов­ки: из репози­тори­ев либо нап­рямую с GitHub. Я буду собирать нап­рямую из репози­тория, что­бы получить самую пос­леднюю вер­сию. Перед сбор­кой собс­твен­но драй­вера ста­вим сбо­роч­ное окру­жение:

sudo apt install -y build-essential cmake libusb-1.0-0-dev pkg-config curl libcurl4-openssl-dev subversion autoconf doxygen graphviz kdoc-tools

Да­лее собира­ем все необ­ходимое для работы с bladeRF:

git clone https://github.com/Nuand/bladeRF.git ./bladeRF
cd bladeRF
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -DINSTALL_UDEV_RULES=ON ../

Про­веря­ем, есть ли наш поль­зователь в груп­пе plugdev:

$ groups

<user> adm cdrom sudo dip plugdev lpadmin sambashare

Ес­ли есть, про­пус­каем сле­дующий пункт и идем даль­ше, а если нет:

$ groups
<user> wheel
$ sudo groupadd bladerf
$ sudo usermod -a -G bladerf <user>

Вы­ходим из сес­сии или прос­то дела­ем ребут:

$ groups
jon wheel bladerf

Те­перь же перехо­дим к сбор­ке и уста­нов­ке:

make && sudo make install && sudo ldconfig

Ког­да все завер­шится, про­веря­ем работу сле­дующей коман­дой при под­клю­чен­ном bladeRF:

ubuntu@ubuntu:~$ bladeRF-cli -p
` Description: Nuand bladeRF 2.0 Backend: libusb Serial: XXX USB Bus: 4 USB Address: 7`

Ес­ли все уста­нови­лось вер­но, ты уви­дишь дан­ные сво­его bladeRF.

 

YateBTS

Те­перь соберем саму базовую стан­цию YateBTS. Тут вари­антов у нас не очень мно­го, потому что при исполь­зовании bladeRF необ­ходимо собирать YateBTS, опти­мизи­рован­ную под эту SDR. К счастью, раз­работ­чики уже всё сде­лали за нас и выложи­ли на офи­циаль­ном сай­те nuand. Ска­чива­ем пос­ледний релиз (на текущий момент это RC-3) и рас­паковы­ваем:

mkdir bts
cd bts
wget https://nuand.com/downloads/yate-rc-3.tar.gz
tar xzvf yate-rc-3.tar.gz

В ито­ге у тебя в пап­ке будут сле­дующие фай­лы:

ubuntu@ubuntu:~/bts$ ls -l
total 23940
-rw-r--r-- 1 ubuntu ubuntu 3571462 Oct 5 2021 hostedx115.rbf
-rw-r--r-- 1 ubuntu ubuntu 1191788 Oct 5 2021 hostedx40.rbf
-rw-r--r-- 1 ubuntu ubuntu 2632660 Oct 5 2021 hostedxA4.rbf
-rw-r--r-- 1 ubuntu ubuntu 4244820 Oct 5 2021 hostedxA5.rbf
-rw-r--r-- 1 ubuntu ubuntu 12858972 Oct 5 2021 hostedxA9.rbf
drwxr-xr-x 13 ubuntu ubuntu 4096 Dec 15 17:34 yate
drwxr-xr-x 8 ubuntu ubuntu 4096 Dec 15 17:36 yatebts

Как видишь, в архив раз­работ­чики положи­ли не толь­ко сами фай­лы для работы с YateBTS, но и спе­циаль­ный образ FPGA для bladeRF, опти­мизи­рован­ный для работы с Yate. Пока оста­вим эти фай­лы в сто­рон­ке и зай­мем­ся ком­пиляци­ей самой базовой стан­ции. Собира­ем ядро Yate:

cd yate
./autogen.sh
./configure --prefix=/usr/local

Не пугай­ся, если одна из этих команд поп­росит что‑то доус­тановить, — прос­то сде­лай это через apt. И вооб­ще возь­ми за при­выч­ку всег­да читать вывод всех команд — это силь­но упро­щает исправ­ление вся­ких оши­бок. Пос­ле кон­фигура­ции собира­ем и уста­нав­лива­ем про­ект:

make
sudo make install-noapi
sudo ldconfig

Те­перь оче­редь YateBTS. Идем на дирек­торию назад, перехо­дим в yatebts и запус­каем коман­ды

cd ../yatebts
./autogen.sh
./configure --prefix=/usr/local
make
sudo make install
sudo ldconfig

Все готово, мож­но про­верять! Запус­каем yate:

ubuntu@ubuntu:~/bts$ yate -V
Yate 6.2.1 devel1 r

Ес­ли на экра­не вид­на вер­сия ядра Yate, базовая стан­ция готова к работе.

Вер­немся теперь ненадол­го к нашей SDR. Чтоб два раза не вста­вать, сра­зу заг­рузим про­шив­ку для FPGA в память bladeRF:

ubuntu@ubuntu:~$ bladeRF-cli -l hostedxA4-latest.rbf
Loading FPGA...
Successfully loaded FPGA bitstream!

И пишем в пос­тоян­ную память, что­бы про­шив­ка пережи­вала перезаг­рузку:

ubuntu@ubuntu:~$ bladeRF-cli -L hostedxA4-latest.rbf
Writing FPGA to flash for autoloading...
[INFO @ host/libraries/libbladeRF/src/backend/usb/usb.c:504] Erasing 41 blocks starting at block 4
...
[INFO @ host/libraries/libbladeRF/src/backend/usb/usb.c:636] Done reading 10284 pages
Successfully wrote FPGA bitstream to flash!

На этом нас­трой­ка bladeRF завер­шена.

info

На самом деле необя­затель­но исполь­зовать имен­но спе­циаль­но опти­мизи­рован­ные для YateBTS обра­зы для FPGA — подой­дут и обще­го наз­начения, глав­ное — исполь­зовать акту­аль­ные (читай: пос­ледние).

 

PySIM

Для получе­ния информа­ции о сим­ке и ее нас­трой­ках нам понадо­бит­ся либа PySIM. У YateBTS есть и свой GUI, который работа­ет с SIM-кар­тами через встро­енный веб‑интерфейс, но его исполь­зовать не получит­ся. Что­бы уста­новить PySIM, кло­ниру­ем репози­торий из Osmocom:

git clone https://gitea.osmocom.org/sim-card/pysim.git

Ус­танав­лива­ем все зависи­мос­ти:

sudo apt-get install --no-install-recommends \
pcscd libpcsclite-dev \
python3 \
python3-setuptools \
python3-pycryptodome \
python3-pyscard \
python3-pip

И уста­нав­лива­ем сам PySIM:

cd pysim
pip3 install --user -r requirements.txt

Пос­ле это­го ста­нут дос­тупны скрип­ты внут­ри дирек­тории. Запус­кай pysim-read с нуж­ным клю­чом для сво­его адап­тера, в моем слу­чае PCSC-устрой­ство с ID 0:

ubuntu@ubuntu:~/pysim$ python3 pySim-read.py -p 0
Using reader PCSC[VMware Virtual USB CCID 00 00]
Reading ...
Autodetected card type: sysmoISIM-SJA5
ICCID: 8949440000001239597
IMSI: 999700000123959
GID1: ffffffffffffffffffff
GID2: ffffffffffffffffffff
SMSP: ffffffffffffffffffffffffffffffffffffffffffffffffe1ffffffffffffffffffffffff06815384090067ffffffffff000000
SPN: Not available
Show in HPLMN: False
Hide in OPLMN: False
PLMNsel: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

Как вид­но, SIM-кар­та успешно про­чита­лась и мы получи­ли ее IMSI. Этот же IMSI написан и на самой сим­ке.

 

Настройка YateBTS

Ког­да сама лабора­тория соб­рана, надо нас­тро­ить ее ком­понен­ты, что­бы они работа­ли вмес­те. Здесь я покажу пол­ную кон­фигура­цию тес­товой сис­темы для каж­дой ее час­ти, кро­ме SIM-кар­ты, потому что там нас­тра­ивать ничего не нуж­но. Отдель­но оста­новим­ся на нас­трой­ке GUI для управле­ния базовой стан­цией и раз­берем, какие ошиб­ки могут воз­никнуть при нас­трой­ке самой стан­ции и bladeRF (и как их испра­вить, конеч­но, тоже).

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    3 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии