Получение имён пользователей сайта методом перебора

Одним из важных этапов подготовки к брут-форсу входа на сайт является сбор имён пользователей. Важность этого можно показать математически. Например, для брут-форса аутентификации веб-приложения подготовлен словарь на 10,000 имён пользователей и 40,000 паролей. Легко посчитать, что количество комбинаций имя-пароль составит 10,000*40,000=400,000,000, т.е. очень много.

Если удалось собрать имена пользователей, допустим, список получился из десяти имён, то для перебора пар имя-пароль с тем же словарём паролей получится 10*40,000=400,000, т.е. разница драматическая – на три порядка.

Метод сбора имён пользователя зависит от конкретного приложения: некоторые содержат этот список в открытом виде и достаточно его спарсить, некоторые содержат профили пользователей и их можно перебрать по ID или адресу в URL. В этой заметке я покажу, как собрать имена пользователей через форму входа, которая сама говорит, существует пользователь или нет. Например, имеется форма входа:

При вводе данных реального пользователя, но с неправильным паролем, она выдаёт:

Password incorrect – неверный пароль.

А при вводе логина несуществующего пользователя мы видим:

Account does not exist – аккаунт не существует.

Это означает, что можно перебрать список пользователей (без перебора паролей). В дальнейшем этот список можно использовать для брут-форса паролей входа на сайт, для фишинговых атак и т.д.

Для осуществления перебора, в результате которого будет составлен список пользователей веб-сайта, я буду использовать Burp Suite и patator.

Запускаем и настраиваем Burp Suite для работы с веб-браузером.

Делаем тестовый вход с заведомо неправильным логином и получаем:

POST /mutillidae/index.php?page=login.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Referer: http://localhost/mutillidae/index.php?page=login.php
Cookie: showhints=0; PHPSESSID=r0tduju2e6cl0q0jmc2b8qgfq5
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 65

username=admin111&password=password&login-php-submit-button=Login

Эта информация дала нам следующие сведения:

  • Данные передаются методом POST
  • Они передаются хосту localhost на страницу /mutillidae/index.php?page=login.php
  • Передаётся строка username=admin111&password=password&login-php-submit-button=Login, в которой admin111 – это имя пользователя, а password – это пароль.

Для того, чтобы программа перебора знала, какие результаты положительные, а какие отрицательные, мы должны указать выявить строку, которая показывается только при положительных результатах или только при отрицательных.

Мы уже видели, что в случае отсутствия аккаунта появляется запись «Account does not exist». Т.е., вроде бы, если аккаунта нет, то в HTML коде должна быть строка «Account does not exist». Правильно?

Давайте проверим. Введём логин существующего пользователя, но с неправильным паролем. В Burp Suite мы переходим к новому пункту в HTTP history, выбираем вкладку Response и под-вкладку Raw. Теперь сделаем поиск по строке «Account does not exist»:

Как можно убедиться, строка «Account does not exist» присутствует, как и другие строки, которые выводятся при разных ошибках.

Это означает, что строка «Account does not exist» является частью кода, всегда содержится в странице, даже если мы её не видим. Т.е. эта строка не подходит для проверки был ли результат положительным или отрицательным.

Посмотрим на часть JavaScript кода:

         switch(lAuthenticationAttemptResultFlag){
                   case cACCOUNT_DOES_NOT_EXIST:
                             lMessage="Account does not exist"; lAuthenticationFailed = "TRUE";
                             break;
                   case cPASSWORD_INCORRECT:
                             lMessage="Password incorrect"; lAuthenticationFailed = "TRUE";
                             break;
                   case cNO_RESULTS_FOUND:
                             lMessage="No results found"; lAuthenticationFailed = "TRUE";
                             break;
                   case cAUTHENTICATION_EXCEPTION_OCCURED:
                             lMessage="Exception occurred"; lAuthenticationFailed = "TRUE";
                   break;
          };

switch говорит о том, в зависимости от значения lAuthenticationAttemptResultFlag выбирается одна из случаев.

Сделаем поиск переменной lAuthenticationAttemptResultFlag. При несуществующем аккаунте:

При неверном пароле:

Итак, если аккаунт не существует, значит в HTML коде будет содержаться строка:

var lAuthenticationAttemptResultFlag = 0;

Нам нужен словарь:

wget https://raw.githubusercontent.com/1N3/BruteX/master/wordlists/namelist.txt

Очистим его от дублей:

cat namelist.txt | sort | uniq > namelist_new.txt

Теперь у нас имеется вся необходимая информация для перебора имён пользователей на сайте.

Даже если вы пользуетесь Kali Linux, то рекомендуется проверить установленную версию patator и если она не является самой свежей, то загрузить свежую:

wget https://raw.githubusercontent.com/lanjelot/patator/master/patator.py
chmod +x patator.py
./patator.py

У меня получилась такая команда:

./patator.py http_fuzz url="localhost/mutillidae/index.php?page=login.php" method=POST body='username=FILE0&password=password&login-php-submit-button=Login' 0=namelist_new.txt accept_cookie=1 -x ignore:fgrep='var lAuthenticationAttemptResultFlag = 0;'

Если вам в ней что-то непонятно, то обратитесь к инструкции «Брут-форс веб-сайтов: инструкция по использованию patator, Hydra, Medusa». Там подробно описывается процесс составления команд для брут-форса веб-приложений. Строка &password=password означает, что переменной &password всегда присвоено одно и то же значение (в данном случае password, но можно было выбрать любое произвольное слово, поскольку для брут-форса имён пользователей это несущественно).

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

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

Как видим, не совсем удачная реализация аутентификации или предварительная разведка позволяют очень значительно (на несколько порядков) сократить время, необходимое на брут-форс учётных данных для входа.

Рекомендуемые статьи:

2 комментария на Получение имён пользователей сайта методом перебора

  1. Андрей:

    "…олько порядков) сократить временя…"

    Алексей, поправьте =)

Добавить комментарий

Ваш e-mail не будет опубликован.