Отслеживание устройств через пассивное прослушивание WiFi

http://edwardkeeble.com/2014/02/passive-wifi-tracking/
  • Перевод
За последний год мне попадалось много историй использования пассивного отслеживания WiFi. В основном все сосредотачиваются на вопросах безопасности и приватности, но мало кто рассказывает, как это работает. Я сделал целый проект Casual Encounters и могу поделиться информацией о работе системы, о том, как избежать слежки, и как её построить (в исследовательских целях, разумеется). Не пробуйте повторить это дома.

Пробные запросы


Когда WiFi клиент пробует связаться с известной сетью, у него есть два варианта. Первый используют ноутбуки и прочие устройства, не являющиеся смартфонами. Он включает поиск сигнальных пакетов (Beacon Frames). Эти пакеты рассылают роутеры, чтобы объявить о своём присутствии. Клиент находит уже известную ему сеть и соединяется с ней. Второй вариант, который обычно используется смартфонами, включает периодическую рассылку пробных запросов (Probe Requests), содержащих уникальный мак-адрес клиента и иногда имя сети, которое ему известно. Преимущество второго подхода в том, что он срабатывает быстрее. А кроме этого, его гораздо легче использовать в своих целях.

Режим прослушивания (Monitor Mode)


Устройства WiFi умеют работать в шести режимах. Чтобы прослушивать трафик, устройству надо переключиться в режим прослушивания. После этого оно не афиширует себя, поэтому наличие таких устройств очень сложно установить.

Защита


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

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

В случае iOS ваш выбор ограничен. Если не использовать jailbroken, защищённый режим работы яблофона не пустит приложения к рубильнику WiFi. В iOS 7 появился разве что более удобный доступ к меню WiFi, но это всё равно надо делать вручную.

Строим трекер


Можно, конечно, просто использовать ноутбук – даже MacBook. Устанавливаете Wireshark и настраиваете фильтр для пробных запросов. Но это не так интересно, к тому же, если вы захотите построить целую сеть трекеров, использовать для этого ноутбуки будет довольно накладно.

Для таких ненакладных целей хватит и Raspberry Pi с беспроводным адаптером, или (что мне больше нравится), роутера TP-LINK MR-3020 со специальной прошивкой. Эти варианты небольшие и их можно запитать от 5-вольтовой батарейки.

Настройка Pi будет совсем простой, т.к. там уже есть рабочая файловая система, но я предпочитаю роутер MR-3020. Это недорогое и автономное решение. Поэтому я буду описывать настройку роутера, а если вам захочется использовать Pi, то:

— можно пропустить шаги до Настройки режима прослушивания
— у этих двух устройств разные версии Linux, поэтому какие-то файлы с настройками могут находиться в разных местах и у них могут быть разные менеджеры пакетов
— более мощные радио типа AWUS036H могут потребовать USB-хаб с внешним питанием

Настройка роутера


Вам понадобятся:

— TP-LINK MR-3020 router ($34.99 на Amazon). Должны работать и аналоги, типа TP-LINK TL-WR703N
— USB флэшка (2-4 Гб)
— Ethernet-кабель

Первая часть инструкций взята от проекта PirateBox, поскольку первичная настройка устройств идентична.

1. Скачайте копию OpenWrt для MR3020 (модификация от Matthias Strubel включает все необходимые модули ядра).
Дополнительная информация: forum.daviddarts.com/read.php?2,3974,4009#msg-4009
Обсуждение прошивки: forum.openwrt.org/viewtopic.php?pid=207769#p207769
Прошивка для WR703N: downloads.openwrt.org/attitude_adjustment/12.09-beta2/ar71xx/generic

2. Переключите переключатель рядом с портом LAN/WAN в положение WISP

3. Отключите WiFi ноутбука

4. Подключите роутер через ethernet к компьютеру и откройте в браузере 192.168.0.254 (MR3020) или 192.168.1.1 (WR703N)

5. Введите логин/пароль (admin / admin)

6. Перейдите к System Tools > Firmware Upgrade, выберите прошивку OpenWRT

Текст прошивки WR703N китайский. Для прошивки через веб-интерфейс выберите последнее меню слева, затем третий пункт подменю. Подробнее.

7. После апгрейда система перезапустится

8. Зайдите туда через telnet

 telnet 192.168.1.1


9. Командой passwd задайте пароль. Это даст доступ к SSH

passwd


10. При помощи vi отредактируйте настройки сети. Предположим, что ваш основной шлюз имеет адрес 192.168.2.1. Адрес OpenWrt не должен совпадать с ним, но должен быть в той же подсети.

    vi /etc/config/network


Поменяйте файл до такого состояния:

    config interface 'loopback'                                                               
            option ifname 'lo'                                                                
            option proto 'static'                                                             
            option ipaddr '127.0.0.1'                                                         
            option netmask '255.0.0.0'                                                        

    config interface 'lan'                                                                    
            option ifname 'eth0'                                                              
            option type 'bridge'                                                              
            option proto 'static'                                                             
            option ipaddr '192.168.2.111'                                                       
            option netmask '255.255.255.0'                                                    
            option gateway '192.168.2.1'                                                     
            list dns '192.168.2.1'                                                           
            list dns '8.8.8.8'


11. Отключите роутер от сети

12. Включите WiFi на ноутбуке

13. Подключите MR3020 (или WR703N) к роутеру-шлюзу через Ethernet и включите настроенный роутер в сет. Подождите минуту. С компьютера, подключённого к локалке, попробуйте зайти на роутер

    ssh root@192.168.2.111


14. Пинганите google для проверки настроек

    ping google.com


15. Добавьте поддержку USB в OpenWrt (если вы не использовали уже настроенную прошивку из шага 1):

    opkg update
    opkg install kmod-usb-uhci
    insmod usbcore ## may return: file exists
    insmod uhci
    opkg install kmod-usb-ohci ## may return: up to date.
    insmod usb-ohci


Настройка USB

Отформатируйте флэшку на две партиции – основная Ext4 и swap. swap должна быть между 256 и 512 Мб.
Зайдите по ssh на роутер.
Установите пакеты для поддержки Ext4:

    root@OpenWrt:~# opkg update
    root@OpenWrt:~# opkg install block-mount kmod-fs-ext4 


Вставьте флэшку в роутер. Проверьте, что она определилась.

    root@OpenWrt:~# ls /dev | grep sda
    sda
    sda1
    sda2


Настройка файловой системы

Теперь мы сделаем sda1 основой корневой файловой системы
(как описано тут wiki.openwrt.org/doc/howto/extroot#openwrt)

root@OpenWrt:~# mkdir /mnt/sda1
root@OpenWrt:~# mount /dev/sda1 /mnt/sda1


Проверим, что всё замаунтилось (должно вернуть /dev/sda1 на /mnt/sda1 type ext4):

root@OpenWrt:~# mount | grep sda1


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

root@OpenWrt:~# tar -C /overlay -cvf - . | tar -C /mnt/sda1 -xf -


Добавьте в /etc/config/fstab автоматическое подключение /dev/sda1.

root@OpenWrt:~# vi /etc/config/fstab


Используйте следующие настройки:

config global automount
    option from_fstab 1
    option anon_mount 1

config global autoswap
    option from_fstab 1
    option anon_swap 0

config mount
    option target   /overlay
    option device   /dev/sda1
    option fstype   ext4
    option options  rw,sync
    option enabled  1
    option enabled_fsck 0

config swap
    option device   /dev/sda2
    option enabled  0


Перезагрузите роутер

root@OpenWrt:~# reboot


Когда все огоньки вновь загорятся, зайдите по ssh и проверьте, что флэшка правильно подцепилась.

root@OpenWrt:~# mount | grep sda1
/dev/sda1 on /overlay type ext4 (rw,sync,relatime,user_xattr,barrier=1,data=ordered)


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

Настраиваем swap


У роутера немного памяти, долгие процессы могут занять её всю. Для проверки памяти введите

root@OpenWrt:~# free


Для решения проблем с памятью можно использовать партицию swap. Сначала проверим, что она работает:

root@OpenWrt:~# mkswap /dev/sda2


Теперь подключим её к свопу:

root@OpenWrt:~# swapon /dev/sda2


Снова запустим free для проверки того, что она подключилась.

root@OpenWrt:~# free
             total         used         free       shared      buffers
Mem:         29212        19160        10052            0         1972
-/+ buffers:              17188        12024
Swap:       475644            0       475644    


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

Скрипт для подключения Swap при старте


Начнём с создания скрипта:

root@OpenWrt:~# vi /etc/init.d/swapon


Введите в файл следующее:

#!/bin/ash /etc/rc.common

START=109
STOP=151

start() {
    echo "start swap"
    swapon /dev/sda2
}

stop(){
    echo "stop"
}


Сделайте его исполняемым:

root@OpenWrt:~# chmod +x /etc/init.d/swapon


Теперь нужно сделать symlink с /etc/rc.d на него:

root@OpenWrt:~# ln -s /etc/init.d/swapon /etc/rc.d/S109swapon


S109 сообщает системе приоритет скрипта. Все файлы в /etc/rc.d начинаются с S##. S109 должен разместить его в самом конце, после того, как запустятся все остальные.

Перезагрузимся, зайдём через ssh и проверим подключение свопа:

root@OpenWrt:~# free

             total         used         free       shared      buffers
Mem:         29212        19276         9936            0         2152
-/+ buffers:              17124        12088
Swap:       475644            0       475644


Настраиваем режим прослушивания


Почти всё готово. Нам надо отредактировать настройки беспроводного подключения:

root@OpenWrt:~# vi /etc/config/wireless


Закомментируйте строчку запрета wifi:

#option disabled 1


Используйте следующие настройки:

config wifi-iface
    option device   radio0
    option network  lan
    option mode     monitor
    option hidden 1


Перезапустите wifi interface:

root@OpenWrt:~# wifi down; wifi up


Сообщения об ошибках типа тех, что представлены ниже, не должны повлиять на работу wifi:

ifconfig: SIOCSIFHWADDR: Invalid argument
command failed: Device or resource busy (-16)


Проверьте, что wifi работает и находится в режиме monitor:

root@OpenWrt:~# iwconfig
lo        no wireless extensions.

wlan0     IEEE 802.11bgn  Mode:Monitor  Frequency:2.412 GHz  Tx-Power=15 dBm
          RTS thr:off   Fragment thr:off
          Power Management:on

eth0      no wireless extensions.

br-lan    no wireless extensions.


Установка пакетов


Теперь мы установим все необходимые для сканера пакеты:

root@OpenWrt:~# opkg update
root@OpenWrt:~# opkg upgrade tar wget
root@OpenWrt:~# opkg install python tcpdump unzip
root@OpenWrt:~# wget http://www.secdev.org/projects/scapy/files/scapy-latest.tar.gz
root@OpenWrt:~# tar -xvf scapy-latest.tar.gz
root@OpenWrt:~# cd scapy*
root@OpenWrt:~# python setup.py install
root@OpenWrt:~# cd ..; rm -rf scapy*


Проверка скрипта сканирования


Скопируем скрипты с git (или их можно скачать в виде zip)

root@OpenWrt:~# mkdir /overlay/scripts; cd /overlay/scripts
root@OpenWrt:/overlay/scripts# wget http://bitbucket.org/edkeeble/wifi-scan/get/e2a08627f05d.zip --no-check-certificate -O wifiscan.zip
root@OpenWrt:/overlay/scripts# unzip wifiscan.zip
root@OpenWrt:/overlay/scripts# mv edkeeble-wifi-scan-e2a08627f05d wifi-scan  


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

root@OpenWrt:/overlay/scripts# cd wifi-scan
root@OpenWrt:/overlay/scripts/wifi-scan# vi wifiscan.py

WHITELIST = [‘00:00:00:00:00:00’,] # замените на мак-адрес телефона


Проверим скрипт:

root@OpenWrt:/overlay/scripts/wifi-scan# python wifiscan.py wlan0


Достаньте телефон, отсоединитесь от текущей сети, но не выключайте wifi. В терминале вы должны начать видеть запросы, отправляемые им. Можно заметить, что не у всех запросов будет указан SSID. Запросы без SSID – широковещательные, они предназначены для всех точек доступа, находящихся в пределах досягаемости.

Ctrl-C остановит работу скрипта

Итоги


Ну и всё. Теперь у вас есть роутер, который отслеживает проходящие мимо него смартфоны. Конечно, наш скрипт не особо полезен в таком виде. Его, например, можно подредактировать так, чтобы он собирал больше данных, писал их в лог, отслеживал перемещение смартфонов между разными вашими устройствами, и т.д.
  • +9
  • 74,3k
  • 7
Поделиться публикацией

Похожие публикации

Комментарии 7
    +2
    Ага, один момент — в ProbeRequest не то что бы сильно обязательно использовать свой настоящий мак — чем и воспользовалась Apple. Они потихоньку внедряют код, который будет использовать случайные мак адреса в пробах.

    Однако даже в этом случае можно бобороться используя служебную информацию из других пакетов. Но это совсем другая история.
      +2
      Тоесть он не отслеживает положение с точностью до координат? А просто говорит нам было устройство в радиусе действие или типа кто мимо проходил?
        +2
        Можно и через kismet получать подобную статистику. Телодвижений меньше.
          0
          Да, согласен. Но можно и airodump-ng. А для Android есть, например, Wi-Fi Tracker.
            0
            Насколько понимаю, для этих целей достаточно vocore/black swift или других более бюджетных решений, которые имеют wifi интерфейс.
            А можно раскрыть тему, а какие именно данные можно извлечь из запросов отправляемых телефоно/планшетом/ноутбуком, который попал в зону прослушивания такого устройства?
              0
              S109 сообщает системе приоритет скрипта. Все файлы в /etc/rc.d начинаются с S##. S109 должен разместить его в самом конце, после того, как запустятся все остальные.

              Насколько я понимаю, они сортируются в лексикографическом порядке и этот скрипт будет запущен в самом начале.

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

              Самое читаемое