Введение
В данном исследовании проанализирована схема работы беспроводной сети московского метрополитена с точки зрения обычного пользователя. В рамках тестирования использовался телефон на Android. Случаи, когда телефон не был ни разу авторизован в сети, рассматриваются в ограниченном формате.
Процесс подключения
При подключении к сети WI-FI происходит следующее:
Происходит первоначальная ассоциация устройства с WI-FI точкой. Затем устройство устанавливает TCP соединение c сервером Google.
Рисунок 1: установление TCP соединения
Далее телефон на Android проверяет необходимость авторизации в сети, путем отправки GET запроса на сервер Google. Если приходит ответ – авторизация не требуется, если не приходит – требуется авторизация, если происходит редирект на веб-страницу авторизации, телефон отображает ее.
Рисунок 2: проверка на необходимость авторизации
Шлюз, в свою очередь, на любой http-запрос отвечает, подменяя ответы запрашиваемого сервера на редирект к странице авторизации.
Рисунок 3: редирект на страницу авторизации
Далее мы жмем кнопку «войти в интернет». Вот сам пакет, видно, что он идет на адрес из private сегмента:
Рисунок 4: пакет с запросом на авторизацию wi-fi.ru
А сам запрос выглядит следующим образом:
GET / HTTP/1.1
Host: wi-fi.ru
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Linux; Android 5.1.1; HUAWEI MT7-L09 Build/HuaweiMT7-L09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.83 Mobile Safari/537.36
Referer: https://login.wi-fi.ru/am/UI/Login?org=mac&service=coa&client_mac=66-a0-f6-dd-d2-9e&ForceAuth=true
Accept-Encoding: gzip, deflate, sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: adfoxUserID=19:154848341; _ym_uid=1449217853212630314; _ym_isad=1; device_type=mobile; surf_prev_url=undefined; surf_curr_url=http://wi-fi.ru/; crtg_rta=; _mtp=0:ijk1njsr:69XJtN~ZNVIaYHb4OT3NHAOjPvLS50k4; _ga=GA1.2.1994719851.1449217854; amlbcookie=01; t=AQIC5wM2LY4SfcxCV1htnKzHF3mtmXJCDcvGniOTgqxvUMc.*AAJTSQACMDIAAlNLABQtNTkwNDE0MjY2MjYxNzMzMzgwOAACUzEAAjAx*
If-None-Match: W/"74f5335bcd0524bfcd031469fc9c52e5"
Анализ
Видно, что в качестве параметра в том числе передается MAC адрес нашего устройства. Это наводит на мысль, что мак адрес является идентификатором, и именно по нему сеть понимает, оплачен у нас интернет или нет. Нужно отметить, что адреса login.wi-fi.ru и wi-fi.ru доступны в том числе и из публичного интернета. Это позволяет нам проверить любой MAC адрес на его статус. Выглядит это следующим образом:
MAC адрес, который не бывал в метро:
Рисунок 5: MAC адрес, ни разу не бывавший в метро
MAC адрес, который не оплатил интернет:
Рисунок 6: MAC не оплатил интернет
MAC адрес, который оплатил интернет, попадает на страницу с ошибкой (так как мы не внутри сети), но потом успешно автоматически перенаправляется на wi-fi.ru:
Рисунок 7: ошибка при подключении
Рисунок 8: успешное подключение
Выяснилось, что при авторизации сервер отдает на страницу тип подключаемого MAC адреса:
Рисунок 9: группы, к которым принадлежит наш MAC
В том числе видно, что если у нас в группе прописан mosmetro_premium, значит мы счастливый обладатель оплаченного интернета.
Тест
Для автоматизации поиска различных типов MAC адресов был написан скрипт на Python: https://bitbucket.org/guardyteam/metro
C его помощью была найдена парочка «оплаченных» адресов:
Рисунок 10: «оплаченные» адреса
И в экспериментальных целях непосредственно в метро был подменен MAC тестового устройства на «оплаченный»:
sudo ifconfig en0 ether xx:xx:xx:xx:xx:xx
И все успешно завелось, без регистрации и смс.
Автор: hollow1