И снова здравствуйте! Пришло время рассказать о сборке програмного обеспечения для работы с 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
# Клонируем скрипты инсталлятора.
$ git clone http://ift.tt/1HDddpt 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
# На телефоне однократно нажимаем кнопку выключения.
# Начнется процесс загрузки, после которого прошивка запустится на телефоне.
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.
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.
Конец?
На этом данная статья подошла к концу. Надеюсь, данный материал будет полезен как начинающему исследователю мобильных сетей, так и специалисту в данной области. В следующей статье я подробнее расскажу о скомпилированных нами приложениях и их практическом применении, а пока по традиции оставляю список интересных статей, презентаций и выступлений:
Всем успехов!
Навигация
This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.
Комментариев нет:
Отправить комментарий