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

2dd7bcbb3fe542658f10e73e0d9a59f6.jpgИ снова здравствуйте! Пришло время рассказать о сборке програмного обеспечения для работы с 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), используемый для идентификации базовой станции мобильными телефонами. И так далее…4eb2834a89cf47c68ad8a3c905060956.gif Layer 2: Канальный уровень, основными задачами которого являются: установление, поддержание и разрыв соединений между устройствами сети; контроль потоков данных, обнаружение ошибок, а также транзит данных третьего уровня. На данном уровне работают протоколы LAPD и LAPDm, обеспечиваются множественные соединения, а также функциональность логических каналов BCCH, PCH, AGCH и DCCH. Layer 3: Сетевой уровень, подразделяющийся на три подуровня: Radio Resource (RR) — подуровень, отвечающий за создание и освобождение логических каналов между устройствами; Mobility Management (MM) — подуровень, выполняющий аутентификацию пользователей, а также отслеживающий перемещения абонентов между зонами покрытия (сотами) различных базовых станций; Call Control (CC) — подуровень, отвечающий за телефонные звонки. Подробное описание данной темы можно найти в Википедии. Больше всего нас интересует расстановка ролей между телефоном и компьютером: 6a4739ff38f947a3b68184c9d7c5cafd.pngНа телефоне функционирует физический уровень, остальные два реализуются на стороне компьютера. Как уже говорилось в предыдущей статье, взаимодействие телефона и компьютера осуществляется через 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 # Клонируем скрипты инсталлятора. $ git clone https://github.com/axilirator/gnu-arm-installer.git gnu-arm-toolchain $ cd gnu-arm-toolchain # Загружаем все необходимое. $ ./download.sh # Запускаем процесс компиляции $ ./build.sh Если возникнут ошибки, Google всегда придет на помощь. Возможно, потребуются дополнительные библиотеки. Все зависит от Вашего дистрибутива. В любом случае необходимо добиться успешной сборки и сообщения «Build complete!», после чего нужно добавить путь к исполняемым файлам кросс-компилятора в переменную среды PATH. # Права администратора теперь не нужны. $ su <ваша учетная запись> $ cd ~ # Убедитесь, что директория /opt/gnu-arm-toolchain/install/bin/ доступна и содержит # исполняемые файлы кросс-компилятора, например, с помощью команды ls. # Редактируем переменные среды: $ gedit .bashrc # Добавляем в самый конец файла строку: # export PATH=$PATH:/opt/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 ~/osmocom $ 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 ~/osmocom/master/src/ # Запускаем загрузчик, в моем случае для платформы E88: $ host/osmocon/osmocon -m c123xor -p /dev/ttyUSB0 target/firmware/board/compal_e88/hello_world.compalram.bin # На телефоне однократно нажимаем кнопку выключения. # Начнется процесс загрузки, после которого прошивка запустится на телефоне. 893d124c40f34f0b8a6c9e85520dd93a.jpgВывод: Received PROMPT1 from phone, responding with CMDread_file (target/firmware/board/compal_e88/hello_world.compalram.bin): file_size=25180, hdr_len=4, dnload_len=25187got 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 Agot 1 bytes from modem, data looks like: 02.got 1 bytes from modem, data looks like: 43 CReceived PROMPT2 from phone, starting downloadhandle_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 (): finishedgot 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 Agot 1 bytes from modem, data looks like: 03.got 1 bytes from modem, data looks like: 42 BReceived DOWNLOAD ACK from phone, your code is running now! battery_compal_e88_init: starting upOsmocomBB Hello World (revision osmocon_v0.0.0–1754-gfc20a37-modified)======================================================================Device ID code: 0xb4fbDevice Version code: 0×0000ARM ID code: 0xfff3cDSP ID code: 0×0128Die ID code: 14190d16f00215c6======================================================================REG_DPLL=0×2413CNTL_ARM_CLK=0xf0a1CNTL_CLK=0xff91CNTL_RST=0xfff3CNTL_ARM_DIV=0xfff9======================================================================REG_DPLL=0×2413CNTL_ARM_CLK=0xf0a1CNTL_CLK=0xff91CNTL_RST=0xfff3CNTL_ARM_DIV=0xfff9======================================================================entering interrupt loopBAT-ADC: 549 4 0 0 1023 392 449 127Charger 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 LSBCharging at 239 LSB (204 mA).BCICTL2=0×3ffbattery-info.flags=0×00000000bat_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 Agot 1 bytes from modem, data looks like: 01.got 1 bytes from modem, data looks like: 40 @Received PROMPT1 from phone, responding with CMDread_file (chainloader): file_size=32, hdr_len=4, dnload_len=39got 1 bytes from modem, data looks like: 66 fgot 1 bytes from modem, data looks like: 74 tgot 1 bytes from modem, data looks like: 6d mgot 1 bytes from modem, data looks like: 74 tgot 1 bytes from modem, data looks like: 6f ogot 1 bytes from modem, data looks like: 6f ogot 1 bytes from modem, data looks like: 6c lReceived FTMTOOL from phone, ramloader has abortedgot 1 bytes from modem, data looks like: 65 egot 1 bytes from modem, data looks like: 72 rgot 1 bytes from modem, data looks like: 72 rgot 1 bytes from modem, data looks like: 6f ogot 1 bytes from modem, data looks like: 72 rgot 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. Конец? На этом данная статья подошла к концу. Надеюсь, данный материал будет полезен как начинающему исследователю мобильных сетей, так и специалисту в данной области. В следующей статье я подробнее расскажу о скомпилированных нами приложениях и их практическом применении, а пока по традиции оставляю список интересных статей, презентаций и выступлений: Всем успехов! Навигация

© Habrahabr.ru