Содержание статьи
Сотовая связь прошла длинный и тернистый путь от аналоговых сетей типа 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 /freg 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 /freg delete "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LsaCfgFlags /freg delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\DeviceGuard" /v LsaCfgFlags /fbcdedit /set hypervisorlaunchtype auto
Теперь идем в настройки виртуальной машины в VMware, заходим в USB Controller и выставляем USB compatibility в USB 3.1. Это нужно для поддержания скорости обмена данными между bladeRF и виртуальной машиной. Скорость обмена данными критична для YateBTS: если какие‑то куски будут опаздывать, то клиентское устройство потом не сможет синхронизироваться с базовой станцией.
Теперь включаем виртуальную машину, подключаем bladeRF через USB 3.0 и прокидываем его в VMware. Чтобы убедиться, что все работает именно по 3.0, посмотрим все USB-устройства в Ubuntu:
root@ubuntu:/
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:/
/: 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 проверим скорость передачи данных. Как видишь, у меня 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 — устройством, которое может снифать данные между сим‑картой и модемом.

Сами симки настраивать никак не нужно, все необходимые данные с них для работы в 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:
$
<
Если есть, пропускаем следующий пункт и идем дальше, а если нет:
$ <$ $
Выходим из сессии или просто делаем ребут:
$ jon
Теперь же переходим к сборке и установке:
make && sudo make install && sudo ldconfig
Когда все завершится, проверяем работу следующей командой при подключенном bladeRF:
ubuntu@ubuntu:
` 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 -ltotal 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 installsudo ldconfig
Все готово, можно проверять! Запускаем yate:
ubuntu@ubuntu:Yate
Если на экране видна версия ядра Yate, базовая станция готова к работе.
Вернемся теперь ненадолго к нашей SDR. Чтоб два раза не вставать, сразу загрузим прошивку для FPGA в память bladeRF:
ubuntu@ubuntu:Loading Successfully
И пишем в постоянную память, чтобы прошивка переживала перезагрузку:
ubuntu@ubuntu:Writing [..[Successfully
На этом настройка 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:Using Reading ..Autodetected ICCID: IMSI: GID1: GID2: SMSP: SPN: Show Hide PLMNsel:
Как видно, SIM-карта успешно прочиталась и мы получили ее IMSI. Этот же IMSI написан и на самой симке.
Настройка YateBTS
Когда сама лаборатория собрана, надо настроить ее компоненты, чтобы они работали вместе. Здесь я покажу полную конфигурацию тестовой системы для каждой ее части, кроме SIM-карты, потому что там настраивать ничего не нужно. Отдельно остановимся на настройке GUI для управления базовой станцией и разберем, какие ошибки могут возникнуть при настройке самой станции и bladeRF (и как их исправить, конечно, тоже).
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
