Хождение По Граблям В Чистом Поле Или Как Собрать Mac-Адреса Ближайших Wi-Fi-Устройств

Все свои публичные выступления (к счастью, их не так много) я начинаю с явного или неявного упоминания тезиса «Наша отрасль сложна, проблемы могут возникнуть на любом, даже самом очевидном шаге, и наивно оптимистично предполагать что все будет просто и легко».

.

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

назад. Расскажу вам об этом историю, пример простого на первый взгляд проекта.



Хождение по граблям в чистом поле или как собрать MAC-адреса ближайших Wi-Fi-устройств

В один прекрасный день друг прислал мне ссылку на интересный стартап .

Ребята предложили представителям малого бизнеса из сферы услуг и продаж установить точку доступа (с каптивным порталом) для своих клиентов, чтобы раздавать интернет, попутно собирая MAC-адреса смартфонов проходящих мимо людей.

Цель этого действия очень проста – большое количество рекламных сетей позволяют таргетинг по списку адресов устройств, поэтому направив рекламную кампанию на проходящих мимо пользователей, мы, скорее всего, получим новых посетителей (ведь это близко и «я где-то это уже видел»).

Те.

такая раздача виртуальных флаеров.

Друг спросил, как это сделано и можем ли мы повторить это.

Быстрый поиск в Google по этой теме выявил механизм сбора таких данных.

WiFi-адаптер запустился в режиме широковещательного прослушивания и бегал по каналам, перехватывая пакеты, анализируя их и агрегируя полученные данные.

Для этого были готовые открытые утилиты, например airodump-ng от aircrack-нг .

Те.

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

Вроде простая задача, решаемая за один, максимум два вечера неторопливой работы, и почти все готово.

Конечно, этого не произошло.

Как известно, то, что позволено Юпитеру, не позволено Быку.

А при использовании одноплатных карт приходится жертвовать, в первую очередь, вычислительными ресурсами и памятью.

Далее, после жертвования ресурсами идет жертва простоты разработки и отладки — не каждая система позволит перетащить на устройство инструменты компиляции.

Изначально мы хотели взять что-то простое и дешевое, например коробки.

Оранжевый Пи Ноль , устанавливаем туда airodump-ng и пересылаем выдаваемые утилитой данные на сервер, где их можно безопасно сохранить в базе данных.

У меня был опыт работы с такими распределенными системами с выделенным центром (правда, «рабочими лошадками» там были виртуальные машины, поднятые через облачное API тем же центром по мере необходимости, но это не главное), поэтому часть кода благополучно перекочевала в новый проект .

Инструментом для пересылки данных на сервер было написанное простое Erlang-приложение, которое должно было извлекать данные из воздушного дампера (парсинг), сериализовать их (native Erlang сериализация) и передавать через веб-сокет на сервер по HTTPS (без вызывая подозрения системы DPI и не изобретая собственных протоколов).

Процессоры Allwinner H2+, используемые в Orange Pi, достаточно мощны, чтобы их можно было собирать и отлаживать непосредственно на устройстве.

Опять же, теоретически все в порядке.

На практике это началось.

1. как оказалось, встроенный в Orange Pi WiFi годился только для того, чтобы подключиться к точке доступа и закинуть данные на сервер.

Ну точнее не сам адаптер, а поддержка его чипсета в ядре.

Для большинства проектов Интернета вещей этого, вероятно, будет достаточно.

Однако мы были готовы к этому удару, поскольку предварительное изучение сайта aircrack-ng дало весьма четкую и двусмысленную информацию «это не везде будет работать, если что, это не наша вина, список проверенных чипсетов прилагаем».

В список вошли почти все устройства Atheros (куплен Qualcomm) и Ralink (куплен MediaTek), что предполагало некоторые перспективы в случае перехода от энергоемких китайских ARM к более аскетичным чипсетам MIPS для роутеров.

Но пока это все собрано из соплей и палок, т.е.

прототипировано - проблему надо решать здесь и сейчас.

Поэтому мы воспользовались таким экзотическим в наше технологическое время устройством (когда в любой зажигалке доступна беспроводная связь) как USB-адаптер Wi-Fi. Изучение списка совместимости и сравнение его с ассортиментом ближайшего магазина выявило жертву - DLink DWA-160 в ревизии С1 (это важно, поскольку другие аппаратные ревизии использовали другой чип и вызывали неиллюзорную головную боль в плане заставить его работать).

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

Хождение по граблям в чистом поле или как собрать MAC-адреса ближайших Wi-Fi-устройств

Убедившись в работоспособности устройства, я подключил его к одноплатнику и отключил встроенный WiFi-адаптер в расчете на то, что Интернет будет доступен через интерфейс Ethernet.

Хождение по граблям в чистом поле или как собрать MAC-адреса ближайших Wi-Fi-устройств

Вторую болванку подложил aircrack-ng. Данный набор утилит создан с целью взлома тестирования на проникновение сетей Wi-Fi, т.е.

написан хакерами для хакеров.

Я не знаю, почему воздушный дампер беспроводной сети решили использовать не в виде традиционного unix-way подхода по выкладыванию структурированного текста для последующей обработки, а для создания полноценного терминального интерфейса, на котором информация отображается практически в реальном времени (и с учетом настроек терминала) по обнаруженным сетям и устройствам, но именно это и сделали.

Да, я нашел для всего этого Python API неизвестной степени готовности, но, опять же, паук прототипирования, живший у меня в голове, категорически запрещал перетаскивать другой язык, переходить на другой (помним, серверная часть уже была частично готова и написано было далеко не на Python) или, не дай бог, реализовать airodump-ng самостоятельно на базе tcpdump. И, следовательно, нужно было искать обходные пути.

К счастью, беспроводные хакеры начали подозревать, что постоянно возиться с интерфейсом — это непростая задача, поэтому они реализовали периодическую загрузку всего найденного и агрегированного в виде CSV-файлов.

С указанным интервалом.

С этим уже можно жить.

Разумеется, с наивным вариантом — запустить утилиту и перечитать файл по таймеру — сразу разобрались.

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

Решением этой проблемы стал механизм inotify в ядре, уведомляющий о файловых операциях — как только мой код видел изменения в файле данных, он инициировал его чтение с небольшой задержкой (скорее, имея чисто психологическое значение, чтобы успокоить свой автор).

Эксперименты показали, что в этом случае не происходит сбоев чтения или потери данных.

Ну и отлично, парсим CSV, раскладываем по внутренним структурам и передаем на сервер.

Сохраняем на сервере в PostgreSQL (спасибо за jsonb) и после этого можно делать запросы, создавать закачки и т.д. Давайте добавим простейшую авторизацию по симметричному ключу, чтобы нас там мусором не забивали и мы могли привязываем данные к точке, где установлено устройство, и вроде бы все нормально, можно идти в бой.

Да, сейчас, конечно.

Тестовая сборка этой цепочки (а написание кода и отладка фактически заняли пару вечеров) выявила забавный факт — количество ловимых за день адресов в нашем офисе, довольно далеком от общественных мест, колебалось в районе пары тысяч.

Да, конечно, рядом была небольшая гостиница (это было в докарантинное и изоляционное время, не удивляйтесь), но все равно ее было много.

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

Список сократился на порядок и уже выглядел похоже на правду.

Все было готово к полевым испытаниям.

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

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

Вероятно, это отражено в законах Мерфи, но, увы, автору этих строк лень проверить, в каком именно, поэтому остановимся на термине «закон подлости».

Первая установка сразу выявила кучу недостатков.

Во-первых, большинство китайских макетных плат оснащены долговременной памятью MicroSD, а не флэш-чипами NAND/NOR. Исключение сделано лишь для мощных SoC, которые для данной задачи явно избыточны.

Увы, MicroSD - это прямая головная боль оператора - окисление контактных площадок, выход из строя SD-карт, зависимость контактов от температуры внутри корпуса (а она немалая, китайские чипы не очень энергоэффективны, а платы зачастую рассчитываются сразу исходя из пикового энергопотребления, так что без дополнительного радиатора никак).

Так вот получилось, что при отключении питания устройства система стала неработоспособной - были повреждены файлы с байт-кодом ERTS, а после перезагрузки приложение отказалось работать.

Второй неприятный момент — в месте установки интернет обеспечивался LTE-роутером и был, мягко говоря, посредственного качества, в отличие от офисных кабелей.

Сеть постоянно глючила, приложение часто переподключалось, а то и вовсе умирало от накопившихся в очередях отправки сообщений сообщений.

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

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

Соответственно, следующим шагом стал отказ от серверной части и локализация хранилища данных непосредственно на устройстве.

Кроме того, чтобы избежать долгих и очень утомительных экспериментов с SD-картами, в следующей итерации было решено использовать макетные платы с флеш-чипами.

В этот момент я вспомнил, что у меня в коллекции есть замечательная доска.

Карамбола 2 от литовских товарищей 8Устройств .

А если зайти на их сайт, то можно найти еще более компактное устройство на том же чипе под названием Сороконожка .

Прошлые эксперименты с этим классом устройств показали, что Erlang хорошо вписывается в отведенные 16 МБ флэш-памяти (и еще немного остается для приложения).

Единственный минус (что, скорее, даже плюс) — маломощность MIPS и необходимость кросс-компиляции, что делает сборку Erlang-приложения немного более нетривиальной.

Но это был уже известный маршрут, поэтому я заказал пару Сороконожек, а сам портировал на Карамболь имеющуюся версию, работающую с сервером.



Хождение по граблям в чистом поле или как собрать MAC-адреса ближайших Wi-Fi-устройств

Когда приехали комплектующие, начался новый этап.

Чип AR9331 успешно поддержался aircrack-ng из коробки, данные можно брать с интерфейса Ethernet, последние версии OpenWRT и ERTS скомпилированы и успешно протестированы.

Приложение было переписано — часть кода была перенесена в код устройства, данные накапливались в отдельном процессе и периодически сбрасывались в файл в виде сериализованного Эрланга-терма.

Для этого был нарисован простой веб-интерфейс, получающий данные через вебсокет. Порты для уведомлять И эрлексек успешно собран с использованием OpenWRT. Смущало только одно: для данных оставалось 300 килобайт. Дело не в том, что недостаточно хранить только MAC-адреса клиентских устройств, но airodump-ng дает гораздо больше интересной информации, включая адреса точек доступа, их ESSID и т. д., которые тоже неплохо было бы запомнить.

На всякий случай.

Ладно, будем действовать по обстоятельствам.

Собираем и проверяем.

Проблема обнаруживается сразу.

OpenWRT Как мы все знаем, это минималистичная сборка Linux, разработанная специально для устройств с ограниченной памятью.

В результате то, что можно было выкинуть безболезненно, было выброшено, а то, что можно было упростить, было упрощено, в том числе и многопользовательский режим.

Те.

Обычно код запускается от имени пользователя root и работает с максимальными привилегиями, что, конечно, упрощает вопросы, связанные с группами, пользователями и контролем их действий.

Да-да, буква S в аббревиатуре IoT означает безопасность.

Проблема в том, что эрлексек , который я использовал для запуска и управления airodump-ng, не может выполнять операции от имени root — для этого ему нужен дополнительный пользователь, от имени которого он будет порождать назначенные ему процессы.

А когда вы создаете дополнительного пользователя с другим уровнем привилегий.

правильно, это предотвращает попадание airodump на сетевое устройство.

Откручивание этого ограничения из библиотеки показалось медленным процессом, поэтому erlexec заменили на порты — встроенный механизм запуска сторонних процессов в Эрланге.

Это мелочь, но неприятная.

Итак, аппараты получены, перепрошиты и даже работают в тепличных условиях.

Подключаем аккумулятор, бросаем коробку в рюкзак и отправляемся в торговый центр.

На следующий день смотрим результат - фиаско, файл данных нулевой длины - то ли места не хватило, то ли блок питания не сработал в очень удачный момент. Редактируем код так, чтобы сохранение происходило в два этапа — сначала создается временный файл, затем он заменяет текущий.

Однако проверить работоспособность этой опции мы так и не дошли - на глаза попалась еще одна игрушка - Лук Омега2+ на Медиатек 7688. Как и их собратья, дизайнер LinkIt Smart 7688 , там было Много всего , но самое главное — в два раза больше флеш-памяти, а значит, вам больше не придется беспокоиться о нехватке места для хранения данных.

ХОРОШО.

Заказываем и ждем.

Месяц.

Два.

Терпение на исходе — пишем американцам о «где товар, Зин».

Тишина.

Откройте спор на PayPal. Американцы просыпаются.

Они говорят: «Ой, у нас система приема заказов дала сбой, сейчас все отправим».

Присылают, ждем три недели.

Уф, аппарат на руках и даже работает.

Хождение по граблям в чистом поле или как собрать MAC-адреса ближайших Wi-Fi-устройств

Здесь нужно сделать небольшое отступление - несмотря на то, что у меня в шаговой доступности было несколько плат LinkIt Smart, я не рассматривал их как платформу, поскольку в самом начале эпопеи попытка использовать их в качестве устройств захвата не удалась .

На тот момент драйвера для чипа поставлялись в виде собранных модулей для конкретных версий ядра и, видимо, это и было причиной неработоспособности.

Последние версии OpenWRT имеют как встроенную поддержку 7688, так и открытый драйвер, так что это повод пересмотреть подход к этим устройствам.

Однако наличие WiFi непосредственно на чипе было принято использовать по прямому назначению — ведь устройству нужен хоть какой-то интерфейс управления, да и в полевых условиях тоже, хотя бы для того, чтобы понять, работает ли оно.

или нет. Также было бы полезно посмотреть на полученные данные.

Соответственно, мы объединяем предыдущие подходы — используем единственный на MiniDoc USB-интерфейс для WiFi-свистка для сканирования пространства, а встроенный WiFi для управления устройством как маломощную точку доступа.

Собираем, проверяем, все работает. Но аппетит приходит во время еды.

Начнём с того, что файл данных в виде Эрланг-сериализации — удел настоящих маньяков, а чуть более широкому кругу специально обученных специалистов нужно что-то попроще.

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

Встраиваем USB хаб между WiFi свистком и устройством.

Настройки (а они зависят от положения устройства на шине в случае OpenWRT) идут хорошо, но это мелочи.

Редактируем.

Вытаскиваем из-под завалов USB-GPS приемник, благо он уже проверен временем и с написанным код парсинг NMEA-0183 (код, конечно, еще пришлось подправить).

Проверяем — устройство не успешно определяется системой, явно не хватает драйверов.

Собираем драйвера USB Serial и заливаем их в устройство - тоже тишина.

Тогда мы помним, что в больших системах GPS-свисток определялся не как ttyUSBx, а как ttyACMx, т.е.

USB GSM-модем.

Что ж, отлично, вторая попытка добавления драйверов, успех.

Берем код и интегрируем его в приложение.

Добавьте sqlite3 в приложение в качестве хранилища.

Теперь не будет необходимости проверять наличие записи в состоянии, и в целом работа с данными упрощена до небольшого количества строк.

Собираем все воедино, учим снимать показания GPS при добавлении данных, редактируем JS код на лице для отображения в случае неполного набора данных (это может произойти, когда GPS еще не поймал спутники, но эфир данные сканирования уже выполняются).

Проверяем работу - вроде работает. Можно объявить промежуточную победу.



Хождение по граблям в чистом поле или как собрать MAC-адреса ближайших Wi-Fi-устройств

За пару недель бесперебойной работы очень много данных как по станциям в эфире, так и по клиентам.

Сейчас борюсь с искушением предложить это устройство информбезопасникам для контроля эфира на вверенных территориях и государству для контроля перемещения телефонов граждан.

Шучу, конечно, они и так все знают. Итак, все вышеописанные мытарства — это всего лишь любимый проект с очень низкой сложностью (почти сразу было понятно, что и как делать), отсутствием аппаратной разработки (привет, физика) и выпуском более-менее полноценного продукта.

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

Теги: #Беспроводные технологии #iot #Разработка для Интернета вещей #Сделай сам или сделай сам #erlang #Erlang/OTP #OpenWRT #wi-fi #Airodump-ng

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.