Как перестать пользоваться публичными WiFi сетями

Как перестать пользоваться публичными WiFi сетями

@jkulvich (Kulagin Yuri)

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

Перед чтением данной заметки настоятельно рекомендую ознакомиться с главой 28 УК РФ и статьями 272, 273, 274, 274.1


Любите кофе по утрам?

Представьте, на улице весьма чудесный денёк. Осень. С деревьев всё ещё продолжает опадать листва, слегка прохладный ветерок обдувает лицо. Сыровато. На часах что-то около восьми утра… восход.

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

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

Вы пролистываете пару новостей и упираетесь вниз страницы. Делаете волшебный, резкий свайп сверху вниз — страница начинает обновляться. Обычно ваш оператор предоставляет более шустрое соединение, в этот раз ожидание затянулось парой секунд дольше…

Ошибка соединения. Перезапуск приложения. Повторный вход в аккаунт. Не верный пароль. Восстановление по номеру. Прошло 10 минут, сообщение так и не дошло. Восстановление через почту. Нет возможности, почта не привязана.

Ну… может какие-то проблемы с серверами… быть может, получится войти чуть позже, а? Неа, вряд-ли.

Вряд-ли ваша страница привязана к вашему паспорту. Не факт, что ваша социальная сеть хранит прошлый номер телефона… а может у вас «левая» симка? В общем, вы что-то потеряли и восстанавливать это что-то может быть проблематично.

А что же произошло?

Вы попались на атаку класса MITM типа Rouge AP

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

Что же в этом такого? Проблема в глобальной, с одной стороны, уязвимости беспроводных точек доступа. Конкретно в способе увеличения зоны покрытия сети. Вероятно, вы замечали, когда находитесь в большом торговом центре, там везде один и тот же публичный WiFi. Но, как вы понимаете, одна точка доступа такую площадь не покроет, их устанавливают несколько. А ваш смартфон видит их всех как одну единую точку только лишь потому, что… у них одинаковые имена! (SSID — имя точки доступа).

Если ваше устройство способно выступать в роли мобильной точки доступа, вы сами можете провести такой эксперимент. Просто зайдите в настройки своего HotSpot и установите ему то же имя, что и у публичной сети рядом с вами. Вот такого результата вы можете добиться:

30 человек ошибочно подключились к моей точке доступа имеющей то же название, что и публичная

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

Тут можно сделать минимально возможную пакость — отключить мобильную передачу данных. В результате у всех этих людей просто пропадёт интернет и вряд-ли большинство догадается почему.

Конкретно с этого момента все данные проходят через ваш смартфон. Моё устройство поддерживает технологию MIMO 2x2 с использованием двух антенн, это позволяет одновременно быть подключённым к точке доступа и раздавать её. Такое устройство может работать в режиме «репитера», увеличивая площадь покрытия и служит своего рода «мостом» между подключившимся и оригинальной точкой (нет нужды тратить мобильный трафик).

И как это можно использовать?

Например, перенаправлять весь не шифрованный трафик проходящий через вас.

В каком-то смысле, это нормальное явление. Точки доступа в публичных местах обычно требуют регистрации (по номеру телефона или через почту) и пока вы не будете зарегистрированы, система будет перенаправлять вас на страницу регистрации. Это технология «captive portal», по сути являющаяся MITM атакой (Man In The Middle), использующаяся абсолютно легально.

Пример портала регистрации через публичную точку доступа

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

В обычном режиме точки доступа смартфон разрешают любые соединения через себя. Однако, есть возможность изменить это поведение. Нам потребуется рутованое устройство на базе Android способное «раздавать» WiFi. Кроме этого, необходимо установить локальный сервер, терминал и BusyBox. А теперь, давайте по порядку :)

1) Проверить наличие рута можно при помощи утилиты «Root Checker», доступной на Google Play. Для дальнейших действий рут обязателен. В случае его отсутствия — 4pda и гугл вам в помощь.

2) Установите любой сервер. Я использую «Server for PHP» с поддержкой PHP 7.2 и route скриптов

3) Установите любой терминал. Лично я использую «Termux»

4) Установите «BusyBox» — набор утилит командной строки Linux

Отлично, весь необходимый софт имеется. Теперь немного теории. В ОС Linux присутствует межсетевой экран netfilter функционирующий на уровне ядра. Это что-то вроде Firewall в Windows. Любые запросы проходящие через операционную систему (абсолютно все, в том числе и локальные) проходят проверку и корректировку в соответствии с установленными в межсетевом экране правилами. Для управления netfilter есть утилита iptables. При помощи правил можно блокировать или перенаправлять запросы. Вообще, много чего можно, подробнее можно прочитать здесь. Нас интересует перенаправление всех запросов поступающих на интерфейс мобильной точки доступа на адрес внутреннего локального сервера.

Настройте и запустите локальную точку доступа.

А теперь давайте создадим простую страничку для тестирования. Для этого зайдите в управление вашим локальным сервером и задайте корневую директорию для сайта. После чего откройте её в проводнике и добавьте туда файл router.php со следующим кодом:

<?php echo $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

Вернитесь к управлению сервером и установите этот скрипт в качестве router скрипта. Далее установите IP интерфейса на котором будет запущен сервер (обычно softap0, при отсутствии выберите wlan0) и установите удобный порт. У меня это 8080. После чего запустите сервер.

Конфигурация локального сервера

Проверьте, что всё работает корректно. Для этого запустите браузер и перейдите на адрес вашего сервера. На странице должен отобразиться текст соответствующий тексту в адресной строке.

Проверка работоспособности локального сервера

Замечательно, самое время сделать последний штрих. Запустите терминал и введите «su» для входа в режим суперпользователя. Далее выполните следующую команду для добавления нового правила в netfilter:

iptables -t nat -A PREROUTING -p tcp -m iprange --src-range 0.0.0.0-255.255.255.255 -m multiport --dports 0:65535 -j DNAT --to $IP:$PORT

Где $IP:$PORT — ip и порт на котором был запущен сервер.

Этим действием мы добавили новое правило для таблицы nat в цепочку PREROUTING которое будет все TCP соединения ко всем адресам на любой порт перенаправлять на наш локальный сервер.

Немного поясню, почему правило именно такое. Таблица NAT (Network Address Translation) занимается преобразованием адресов транзитных пакетов (когда устройство работает в режиме точки доступа). Это необходимый функционал для прокси-серверов, который позволяет функционировать в сети большему количеству устройств чем позволяет IPv4.

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

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

Все такие пакеты перенаправляем в цепочку DNAT, где устанавливаем иной адрес получателя пакета — локальный сервер.

Добавление нового правила для netfilter

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

Проверка корректности редиректа на локальный сервер

Для того чтобы удалить правило netfilter и вернуть ваш HotSpot в нормальный режим работы, выведите список всех правил nat prerouting:

iptables -t nat -L PREROUTING --line-number

И удалите наше правило указав его номер:

iptables -t nat -D PREROUTING $NUMBER

По сути, мы настроили свой собственный captive portal для локального сервера на Android.

Немного улучшив скрипт роутера можно добиться, чтобы при подключении к нашей сети устройства выводили окно с необходимостью регистрации. Для этого нужно возвращать 302 Moved Temporarily при запросе на такие адреса как: */generate_204 или 204.* Общим вариантом будет возвращать 302 для любой страницы не найденной на вашем локальном сервере (вместо 404).


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

Ссылки по теме:

Настройка NAT в DebianРабота с iptablesРабота с iptables #2Коды ответов HTTPCaptive portalHTTPSАнализаторы сетевого трафикаVPNProxy ServerПринцип работы HTTP Proxy