Pull to refresh

Знакомство с OsmocomBB: 0x03 Software

Reading time15 min
Views46K


И снова здравствуйте! Пришло время рассказать о сборке програмного обеспечения для работы с OsmocomBB. На данном этапе у начинающих исследователей могут возникнуть трудности, поэтому постараюсь разложить все по полочкам. В этой части я расскажу о структуре проекта, принципах взаимодействия телефона и компьютера, а также подробно опишу процесс компиляции. Рекомендую вооружиться каким-нибудь дистрибутивом Linux, потому-что серверная часть проекта разрабатывалась именно под данное семейство операционных систем. Также советую воздержаться от использования виртуальных машин, так как возможны проблемы с запуском приложений на телефоне из-за временных задержек.

Навигация



Основы основ


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

  • Layer 1: Физический уровень. Местные протоколы описывают принципы взаимодействия устройств в радиоэфире. Для обеспечения одновременного взаимодействия сети и нескольких мобильных устройств в GSM-сетях применяются две технологии множественного доступа: FDMA (Frequency-Division Multiple Access) и TDMA (Time-Division Multiple Access). FDMA подразумевает разбиение доступного диапазона частот на каналы (ARFCN), каждый из которых позволяет передавать данные от абонентов к сети (uplink) и от сети к абонентам (downlink). TDMA подразумевает мультиплексирование физического канала с разделением по времени, то есть, каждому устройству предоставляется возможность приема и передачи данных в определенные моменты времени. Согласно TDMA физический канал (ARFCN) разбивается на несколько логических каналов, например, PCH (Paging channel), на котором базовая станция уведомляет телефон о входящем вызове, или BCCH (Broadcast Control channel), используемый для идентификации базовой станции мобильными телефонами. И так далее...
  • Layer 2: Канальный уровень, основными задачами которого являются: установление, поддержание и разрыв соединений между устройствами сети; контроль потоков данных, обнаружение ошибок, а также транзит данных третьего уровня. На данном уровне работают протоколы LAPD и LAPDm, обеспечиваются множественные соединения, а также функциональность логических каналов BCCH, PCH, AGCH и DCCH.
  • Layer 3: Сетевой уровень, подразделяющийся на три подуровня:
    • Radio Resource (RR) — подуровень, отвечающий за создание и освобождение логических каналов между устройствами;
    • Mobility Management (MM) — подуровень, выполняющий аутентификацию пользователей, а также отслеживающий перемещения абонентов между зонами покрытия (сотами) различных базовых станций;
    • Call Control (CC) — подуровень, отвечающий за телефонные звонки.

Подробное описание данной темы можно найти в Википедии. Больше всего нас интересует расстановка ролей между телефоном и компьютером:


На телефоне функционирует физический уровень, остальные два реализуются на стороне компьютера. Как уже говорилось в предыдущей статье, взаимодействие телефона и компьютера осуществляется через UART-интерфейс телефона.

Обзор OsmocomBB


Начнем с того, что OsmocomBB разрабатывается на базе системы контроля версий Git, и его исходные коды доступны на официальном сайте git.osmocom.org. Большинство возможностей проекта, таких как RSSI, интерфейс для приема/совершения голосовых звонков и обмена SMS-сообщениями, доступны в основной ветке проекта (master). Однако наиболее интересные возможности доступны в виде ответвлений репозитория — веток (branch):

  • luca/catcher
    Возможно, Вы когда-нибудь слышали об IMSI-Catcher. Чаще всего под IMSI-Catcher подразумевают устройство, маскирующееся под настоящую базовую станцию с целью сбора IMSI (международный идентификатор мобильного абонента) ближайших абонентов (что, например, позволяет отслеживать их местоположение). Правильнее считать, что IMSI-Catching — это только одна из возможностей поддельных базовых станций (FakeBTS), принцип работы которых довольно прост. IMSI и IMEI коды абонента передаются базовой станции лишь в момент его подключения, затем абоненту присваивается временный идентификатор TMSI, на основе которого происходит их дальнейшее взаимодействие. TMSI в отличии от IMSI не является постоянным и меняется при подключении к другим базовым станциям. Для деанонимизации абонента злоумышленник запускает свою базовую станцию (например, на базе USRP), мощность сигнала которой превышает мощность настоящих базовых станций. Благодаря этому, телефон абонента подключается к станции с более мощным сигналом, а затем передает свои IMSI и IMEI коды. Иногда FakeBTS могут выступать в роли посредников между абонентом и настоящей базовой станцией, позволяя злоумышленнику выполнять различные MiTM-атаки, а также тратить деньги абонента. Как бы пугающе это не звучало, присутствие таких «чудес» в эфире можно обнаружить, например, с помощью проектов: FakeBTS или Android IMSI-Catcher Detector. Автор данной ветки также интегрировал в проект возможность обнаружения подобной активности. Подробнее об этом можно узнать тут.
  • jolly/emi
    Здесь интегрировано приложение EMI, предназначенное для проведения стресс-тестов беспроводного оборудования. Подробнее на сайте проекта wiki/emi-firmware. Так же не стоит забывать о том, что вещание на частотах GSM во многих странах, включая Российскую Федерацию, требует наличия лицензии. Если же с лицензией все сложно, можно воспользоваться клеткой Фарадея.
  • sylvain/burst_ind
    Основной упор в данной ветке делается на сниффинг GSM-трафика, о чем более подробно я расскажу в одной из следующих статей.
  • jolly/menu
    Данная ветка позволит Вам записывать приложения во Flash-память телефона. Зачем? Например, если потребуется автономность при использовании телефона в каких-либо переносимых проектах. Имеется возможность прошить загрузочное меню, которое с помощью графического интерфейса будет предоставлять выбор приложения для загрузки. Процесс прошивки описан на странице wiki/flashing_new.
  • luca/libosmosim
    Данная ветка позволит Вам использовать OsmocomBB-совместимый телефон для взаимодействия с SIM-картой. После сборки проекта в папке src/host/layer23/src/libosmosim/.libs будет доступна библиотека libosmosim.so, на базе которой работает проект SIMTester. С его помощью можно проверять криптостойкость SIM-карт, а также безопасность установленных на них приложений.
  • sylvain/testing
    Здесь можно найти приложение TRX, которое превращает OsmocomBB-совместимый телефон в небольшую базовую станцию. Подробнее об этом я расскажу позже, а пока можно почитать небольшое HOWTO wiki/Software/Transceiver и посмотреть презентацию Further hacks on the Calypso platform or how to turn a phone into a BTS.

Остальные ответвления репозитория в основном содержат исправления и нововведения других разработчиков проекта, которые иногда попадают в ветку master. Векторов развития OsmocomBB очень много, поэтому любой заинтересованный разработчик может присоединиться к разработке проекта.

Сборка проекта


Давайте определимся с местоположением файлов и папок. Исходя из своего опыта, рекомендую создать папку /opt/osmocom — в ней мы будем хранить библиотеки и кросс-компилятор. А для сборки проекта использовать, например, домашнюю папку, или другое место, для работы в котором не требуются права администратора. В результате компиляции проекта Вы получите приложения (прошивки), выполняемые на телефоне, и программы для взаимодействия с ними со стороны компьютера (сервера). Процесс сборки описан на примере Ubuntu 14.04, поэтому на других дистрибутивах синтаксис команд может немного отличаться. Итак, что нам нужно?

  • libosmocore — основная библиотека проекта, подробнее о которой можно почитать в разделе wiki/libosmocore. Не смотря на то, что часть ее исходного кода поставляется при клонировании репозитория OsmocomBB, ее необходимо собирать отдельно;
  • Кросс-компилятор — OsmocomBB-совместимые телефоны в основном построены на базе платформы ARM, поэтому для сборки прошивок понадобится кросс-компилятор (toolchain). Разработчики рекомендуют использовать именно ту версию кросс-компилятора, которая указана на сайте, так как при использовании сторонних прошивки могут работать нестабильно. Сборка кросс-компилятора описана в разделе wiki/GnuArmToolchain, однако при компиляции на современных системах часто возникает ошибка, поэтому я создал форк с исправленным инсталлятором.

Для компиляции исходных кодов нам понадобятся autoconf, automake, libtool, pkg-config, make and GCC. Заодно создадим директорию /opt/osmocom:

# Все действия выполняются от имени суперпользователя, чтобы постоянно не писать sudo.
$ sudo su
# Устанавливаем зависимости.
$ apt get update
$ apt-get install libtool shtool automake autoconf git-core pkg-config make gcc
# Создаем папку для библиотек и кросс-компилятора.
$ mkdir /opt/osmocom

В процессе сборки исходных кодов часто возникают ошибки. Чаще всего не хватает каких-либо библиотек. На сайте baseband-devel.722152.n3.nabble.com можно найти способы решения большинства из них — пользуйтесь поиском. Если ошибка возникает в процессе конфигурации (команды autoreconf или ./configure), попробуйте устранить ее и выполнить повторную конфигурацию.

Начнем с libosmocore:

$ cd /opt/osmocom
$ git clone git://git.osmocom.org/libosmocore.git
$ cd libosmocore
$ autoreconf -i
# Библиотека pcsclite требуется для сборки libosmocore.
$ apt-get install libpcsclite-dev
$ ./configure
$ make
$ make install

Идем дальше. Сборка кросс-компилятора является основным источником ошибок и занимает наибольшую часть времени. В большинстве случаев возникает ошибка "@itemx must follow @item". Дело в том, что для сборки требуется более старая версия TexInfo. Можно выполнить downgrade вручную, а можно воспользоваться моей исправленной версией инсталлятора:

$ cd /opt/osmocom
# Зависимости кросс-компилятора.
$ apt-get install build-essential libgmp3-dev libmpfr-dev libx11-6 libx11-dev flex bison libncurses5 libncurses5-dbg libncurses5-dev libncursesw5 libncursesw5-dbg libncursesw5-dev zlibc zlib1g-dev libmpfr4 libmpc-dev texinfo
# Клонируем скрипты инсталлятора.
$ git clone https://github.com/axilirator/gnu-arm-installer.git gnu-arm-toolchain
$ cd gnu-arm-toolchain
# Загружаем все необходимое.
$ ./download.sh
# Запускаем процесс компиляции
$ ./build.sh

UPD: Не смотря на то, что на сайте проекта появилась обновленная версия кросс-компилятора на базе GCC 4.8.2, Binutils 2.21.1 и Newlib 1.19, рекомендую использовать его предыдущую версию, доступную в моем репозитории. В результате компиляции кода таких форков проекта, как DrWhax/osmocom-bb-raw и offlinehacker/osmocombb, прошивка layer1 зависает при попытке синхронизации с базовой станцией. В прошивках официального репозитория проекта, скомпилированных новой версией кросс-компилятора, подобных проблем не наблюдается.

Если возникнут ошибки, Google всегда придет на помощь. Возможно, потребуются дополнительные библиотеки. Все зависит от Вашего дистрибутива. В любом случае необходимо добиться успешной сборки и сообщения «Build complete!», после чего нужно добавить путь к исполняемым файлам кросс-компилятора в переменную среды PATH.

# Права администратора теперь не нужны.
$ su <ваша учетная запись>
$ cd ~
# Убедитесь, что директория /opt/osmocom/gnu-arm-toolchain/install/bin/ доступна и содержит 
# исполняемые файлы кросс-компилятора, например, с помощью команды ls.
# Редактируем переменные среды:
$ gedit .bashrc
# Добавляем в самый конец файла строку:
# export PATH=$PATH:/opt/osmocom/gnu-arm-toolchain/install/bin/
# Не забываем сохраниться.
$ source .bashrc
# Проверим доступность исполняемых файлов:
$ arm-elf-gcc -v
# В результате чего должна появиться информация о компиляторе.
# В случае ошибки проверьте правильность пути к папке bin и его наличие в переменной PATH.

Поздравляю! Теперь Ваша система готова к сборке OsmocomBB. Пришло время собрать ветку master.

# В домашнем каталоге создадим директорию osmocombb:
$ mkdir ~/osmocombb
$ cd ~/osmocombb
# Клонируем репозиторий:
$ git clone git://git.osmocom.org/osmocom-bb.git master
# Собираем:
$ cd master/src
$ make

Если возникает ошибка "no such instruction: `eor %edx,%ecx,%ecx,ror'", значит исполняемые файлы Вашего кросс-компилятора не доступны — проверьте все еще раз. Запомните эту последовательность действий — она используется каждый раз при сборке новой ветки. Для того, чтобы клонировать определенную ветку репозитория, используйте флаг -b, например:

# Пример клонирования ветки sylvain/burst_ind:
$ cd ~/osmocombb
$ git clone git://git.osmocom.org/osmocom-bb.git -b sylvain/burst_ind burst_ind

Запускаем Hello, world!


Самый долгожданный момент. Сначала следует уточнить платформу Вашего телефона (на странице wiki/Hardware/Phones), например, для C123, C115 и С118 — это Compal E88. Прошивки для каждой платформы располагаются в одноименных директориях по пути src/target/firmware/board/. Итак, выключаем телефон, подключаем кабель к компьютеру, затем:

# Идем в папку проекта:
$ cd ~/osmocombb/master/src/
# Запускаем загрузчик, в моем случае для платформы E88:
$ host/osmocon/osmocon -m c123xor -p /dev/ttyUSB0 target/firmware/board/compal_e88/hello_world.compalram.bin
# На телефоне однократно нажимаем кнопку выключения.
# Начнется процесс загрузки, после которого прошивка запустится на телефоне.



Вывод:
Received PROMPT1 from phone, responding with CMD
read_file(target/firmware/board/compal_e88/hello_world.compalram.bin): file_size=25180, hdr_len=4, dnload_len=25187
got 1 bytes from modem, data looks like: 1b.
got 1 bytes from modem, data looks like: f6.
got 1 bytes from modem, data looks like: 02.
got 1 bytes from modem, data looks like: 00.
got 1 bytes from modem, data looks like: 41 A
got 1 bytes from modem, data looks like: 02.
got 1 bytes from modem, data looks like: 43 C
Received PROMPT2 from phone, starting download
handle_write(): 4096 bytes (4096/25187)
handle_write(): 4096 bytes (8192/25187)
handle_write(): 4096 bytes (12288/25187)
handle_write(): 4096 bytes (16384/25187)
handle_write(): 4096 bytes (20480/25187)
handle_write(): 4096 bytes (24576/25187)
handle_write(): 611 bytes (25187/25187)
handle_write(): finished
got 1 bytes from modem, data looks like: 1b.
got 1 bytes from modem, data looks like: f6.
got 1 bytes from modem, data looks like: 02.
got 1 bytes from modem, data looks like: 00.
got 1 bytes from modem, data looks like: 41 A
got 1 bytes from modem, data looks like: 03.
got 1 bytes from modem, data looks like: 42 B
Received DOWNLOAD ACK from phone, your code is running now!
battery_compal_e88_init: starting up

OsmocomBB Hello World (revision osmocon_v0.0.0-1754-gfc20a37-modified)
======================================================================
Device ID code: 0xb4fb
Device Version code: 0x0000
ARM ID code: 0xfff3
cDSP ID code: 0x0128
Die ID code: 14190d16f00215c6
======================================================================
REG_DPLL=0x2413
CNTL_ARM_CLK=0xf0a1
CNTL_CLK=0xff91
CNTL_RST=0xfff3
CNTL_ARM_DIV=0xfff9
======================================================================
REG_DPLL=0x2413
CNTL_ARM_CLK=0xf0a1
CNTL_CLK=0xff91
CNTL_RST=0xfff3
CNTL_ARM_DIV=0xfff9
======================================================================
entering interrupt loop
BAT-ADC: 549 4 0 0 1023 392 449 127
Charger at 34 mV.
Battery at 3753 mV.
Charging at 0 mA.
Battery capacity is 69%.
Battery range is 3199..3999 mV.
Battery full at 468 LSB… full at 585 LSB
Charging at 239 LSB (204 mA).
BCICTL2=0x3ff
battery-info.flags=0x00000000
bat_compal_e88_chg_state=0

Если при загрузке что-то пойдет не так, загрузчик может зависнуть. Просто извлеките батарею на пару секунд и вставьте обратно.

Что происходит и как это работает?


Разберемся со всем по порядку. При запуске программа osmocon блокирует последовательный порт и ожидает сообщений загрузчика, рассылая специальные beacon-сообщения. Встроенный загрузчик телефона при нажатии кнопки включения отправляет на последовательный порт запрос на загрузку прошивки (ACK). Если ему никто не отвечает, он просто посылает сообщение "@ftmtoolerror". В нашем случае osmocon принимает запрос (о чем говорит строка «Received PROMPT1 from phone, responding with CMD») и отвечает специальным сообщением (file_size=25180, hdr_len=4, dnload_len=25187). Далее загрузчик телефона либо соглашается грузить прошивку (Received PROMPT2 from phone, starting download), либо сообщает об ошибке. Как только прошивка будет загружена (handle_write(): finished) в оперативную память, загрузчик снова уведомляет нас (Received DOWNLOAD ACK from phone, your code is running now!) и подает питание на плату (battery_compal_e88_init: starting up). Ваш телефон показывает всем известные слова «Hello, world!», а в консоль пишет уже код, запущенный на нем. Круто!

Ошибка FTMTOOL


Данная ошибка в большинстве случаев возникает из-за проблем с кабелем и/или преобразователем, когда osmocon не может связаться с загрузчиком. Убедитесь, что контакты GND, RxD и TxD подключены правильно, а наименование чипсета Вашего USB-TTL преобразователя содержится в списке рекомендуемых. Попробуйте повторно нажать кнопку включения через несколько секунд. Также для некоторых моделей телефонов и преобразователей значение ключа -m программы osmocon следует указывать без окончания xor, например, -m c123 вместо -m c123xor.

Вывод osmocon в случае ошибки:
got 1 bytes from modem, data looks like: 00.
got 1 bytes from modem, data looks like: 00.
got 1 bytes from modem, data looks like: 81.
got 4 bytes from modem, data looks like: 1b f6 02 00…
got 1 bytes from modem, data looks like: 41 A
got 1 bytes from modem, data looks like: 01.
got 1 bytes from modem, data looks like: 40 @
Received PROMPT1 from phone, responding with CMD
read_file(chainloader): file_size=32, hdr_len=4, dnload_len=39
got 1 bytes from modem, data looks like: 66 f
got 1 bytes from modem, data looks like: 74 t
got 1 bytes from modem, data looks like: 6d m
got 1 bytes from modem, data looks like: 74 t
got 1 bytes from modem, data looks like: 6f o
got 1 bytes from modem, data looks like: 6f o
got 1 bytes from modem, data looks like: 6c l
Received FTMTOOL from phone, ramloader has aborted
got 1 bytes from modem, data looks like: 65 e
got 1 bytes from modem, data looks like: 72 r
got 1 bytes from modem, data looks like: 72 r
got 1 bytes from modem, data looks like: 6f o
got 1 bytes from modem, data looks like: 72 r
got 1 bytes from modem, data looks like: 00.

Не нарушает ли это закон?


Запущенное нами приложение не взаимодействует с сотовой сетью, однако перед запуском других приложений хотелось бы остановиться на вопросе легальности. В некоторых странах использование стороннего програмного обеспечения для взаимодействия с сотовыми сетями является незаконным. Условия, на которых предоставляются услуги сотовой связи, могут отличаться у разных операторов, и, чаще всего, не допускают использования несертифицированного ПО. Поэтому, по умолчанию, возможность передачи данных в сеть отключена. Если Вы знаете, что делаете, и Ваши действия не нарушают действующие законы, передачу данных можно включить перед сборкой проекта в файле src/target/firmware/Makefile, раскомментировав строку «CFLAGS += -DCONFIG_TX_ENABLE». Авторы проекта посвятили данному вопросу небольшую страницу wiki/LegalAspects.

Структура проекта, процесс загрузки приложений (прошивок)


В корневой папке можно найти три папки: doc, include и src. В doc или include врядли найдется что-либо полезное. Больше всего нас интересует папка src, которая содержит следующие директории:

  • host — исходный код программ, исполняемых на серверной строне;
  • target — исходный код прошивок, а также библиотек для их компиляции;
  • target_dsp — инструменты для работы с исполняемым кодом DSP и плагины для IDA;
  • wireshark — патчи для старых версий Wireshark;
  • shared — содержит копию библиотеки libosmocore, используемую для сборки прошивок.

Подробнее о структуре проекта можно почитать в файле README.development. Исходные коды приложений OsmocomBB хранятся в папке src/target/firmware/apps, а их скомпилированные версии доступны отдельно для каждой платформы в папке /src/target/firmware/board. Вы можете встретить два варианта скомпилированного приложения (прошивки): compalram и highram. Первый вариант предназначен для загрузки с помощью стандартного загрузчика телефона. Некоторые «объемные» приложения, например, RSSI, не могут быть загружены стандартным загрузчиком, поэтому выполняется «загрузка по цепочке»: сначала загружается кастомный загрузчик loader.compalram.bin, который загружает прошивку типа highram. Синтаксис «загрузки по цепочке»:

# На сайте проекта можно встретить устаревший синтаксис:
$ host/osmocon/osmocon -m c123xor -p /dev/ttyUSB0 -c target/firmware/board/compal_e88/rssi.highram.bin target/firmware/board/compal_e88/chainload.compalram.bin
# Однако в текущей версии проекта chainload интегрировали в osmocon, поэтому последний аргумент не требуется.
# Просто используйте ключ -c:
$ host/osmocon/osmocon -m c123xor -p /dev/ttyUSB0 -c target/firmware/board/compal_e88/rssi.highram.bin

Как только понадобится завершить работу приложения, остановите процесс osmocon, а затем нажмите и удерживайте кнопку выключения в течение двух секунд.

Что интересного здесь есть?


Пару слов о приложениях, доступных в различных ответвлениях проекта. Более детальному обзору будет посвящена следующая статья, а пока можно почитать официальную документацию wiki/Applications.

Взаимодействие с оборудованием


  • osmocon — выполняет загрузку прошивок в оперативную память телефона, а также создает интерфейс обмена информацией между прошивкой и другими серверными программами. Параметр -m позволяет указать протокол обмена данными для различных моделей телефонов, а с помощью параметра -с выполняется «загрузка по цепочке» (chainloading) тяжеловесных приложений, которые не способен загрузить стандартный загрузчик телефона.
  • osmoload — позволяет читать и записывать содержимое flash-памяти телефона. Используется при прошивке приложений. Подробнее на странице wiki/flashing.
  • calypso_pll, rita_pll — используются для получения информации о чипсете и трансивере телефона.

Приложения 2 и 3 уровней стека протоколов GSM


  • mobile — приложение, реализующее функционал обычного телефона, расширенное дополнительной функциональностью для взаимодействия с сетью GSM. Подробнее на странице wiki/mobile.
  • cell_log — позволяет выполнять сканирование диапазона частот, находить ближайшие базовые станции, а также получать информацию о них (мощность принимаемого сигнала, MNC, MCC и другую системную информацию). Позволяет синхронизироваться с базовой станцией и получать информацию, передаваемую на канале BCCH.
  • ccch_scan, bcch_scan — позволяют синхронизироваться с базовой станцией и получать ее служебную информацию.
  • cbch_sniff — позволяет записывать служебную информацию сети в файл.
  • gsmmap — используя вывод cell_log, генерирует KML-файл для Google Maps, визуализирующий расположение базовых станций на карте.

Приложения, выполняемые на телефоне


  • loader.bin — загрузчик, написанный разработчиками проекта. Используется для чтения и записи flash-памяти, а также при «загрузки по цепочке».
  • compal_dsp_dump.bin — позволяет получать дамп содержимого DSP-процессора.
  • menu.bin — предоставляет возможность выбора приложения для загрузки из flash-памяти.
  • rssi.bin — приложение, позволяющее отслеживать мощность принимаемого сигнала на различных каналах сотовой сети.
  • emi.bin — приложение для проведения стресс-тестинга беспроводного оборудования.
  • layer1.bin — используется для взаимодействия с сотовой сетью и SIM-картой.
  • trx.bin — превращает телефон в Transceiver для работы OpenBTS или OsmoBTS.

Конец?


На этом данная статья подошла к концу. Надеюсь, данный материал будет полезен как начинающему исследователю мобильных сетей, так и специалисту в данной области. В следующей статье я подробнее расскажу о скомпилированных нами приложениях и их практическом применении, а пока по традиции оставляю список интересных статей, презентаций и выступлений:


Всем успехов!

Навигация


Tags:
Hubs:
Total votes 19: ↑18 and ↓1+17
Comments12

Articles