Перейти к содержимому

Брутфорс веб-формы на пентесте: прохожу HTB Easy и разбираю каждый шаг

Брутфорс веб-формы на пентесте: прохожу HTB Easy и разбираю каждый шаг
Время чтения: 12 мин.

На прошлой неделе разбирал с учеником его первую HTB-машину easy-уровня — всё упёрлось в форму логина. За полтора часа прошли путь от пустого терминала до reverse shell, и шесть из семи шагов точно ложились на конкретный модуль курса пентеста. Ниже — полный разбор: от сканирования портов до подобранного пароля, с командами, типичными ловушками и маппингом на учебную программу. Каждый блок — одновременно walkthrough и навигация по тому, что стоит изучить системно.

Зачем пентестеру брутфорс веб-формы и где он в классификации атак

Брутфорс веб-формы — не «хакерская романтика», а рабочий инструмент для ситуаций, когда серверное ПО обновлено, известных CVE (Common Vulnerabilities and Exposures — публично зарегистрированных уязвимостей) нет, а единственный вектор входа — слабый пароль на панели администратора. По классификации OWASP Top 10 (рейтинг десяти наиболее критичных рисков веб-приложений) слабая аутентификация входит в категорию A07:2021 — Identification and Authentication Failures. Сюда попадают слабые пароли, отсутствие защиты от перебора, credential stuffing (подстановка учётных данных из утёкших баз).

В терминологии MITRE ATT&CK (открытая база тактик и техник атак; каждая техника имеет T-код — уникальный идентификатор) подбор учётных данных описан как T1110 — Brute Force, тактика Credential Access. У техники три подвида, которые встречаются чаще всего: Password Guessing (T1110.001) — перебор паролей к конкретному аккаунту, Password Cracking (T1110.002) — офлайн-взлом хешей, Password Spraying (T1110.003) — один пароль ко множеству аккаунтов. Брутфорс формы логина на HTB — почти всегда T1110.001.

HTB-машины easy-уровня специально проектируются так, чтобы подбор пароля был рабочим вектором. Это не «слишком просто». Это навык, без которого дальше первого экрана не пройдёшь.

Модуль курса: «Основы веб-атак» / Web Application Attacks — объясняет, почему аутентификация ломается и какие ошибки разработчиков к этому приводят.

Разведка перед атакой на форму авторизации

Без разведки брутфорс — стрельба вслепую. Прежде чем запускать инструмент подбора, нужно ответить на четыре вопроса: какие порты открыты, есть ли на сервере страница логина, как форма отправляет данные (GET или POST), какие дополнительные поля передаются вместе с логином и паролем.

Первые два вопроса закрывает сканирование. Предусловие: вы работаете в Kali Linux (или другом дистрибутиве с предустановленным nmap).

nmap -sC -sV -p- 10.10.10.X

Флаг -sC запускает стандартные NSE-скрипты (определение версий, баннеров, базовых уязвимостей), -sV — определение версий сервисов, -p- — сканирование всех 65535 портов. Ожидаемый результат: открытый порт 80 или 443 (HTTP/HTTPS). Если видите нестандартный порт (8080, 3000, 5000) — заходите браузером и туда. На таких портах часто прячутся веб-приложения, которые разработчик «спрятал» от случайных глаз.

После обнаружения веб-сервера — поиск директорий через ffuf, gobuster или dirsearch. Ищем эндпоинты вроде /login, /admin, /wp-login.php, /user/login. Выбор словаря: для начала хватит common.txt из SecLists, позже можно переключиться на directory-list-2.3-medium.txt.

Модуль курса: «Перечисление и сбор информации» / Enumeration & Information Gathering — учит систематически собирать данные о цели до начала атаки.

Как устроена веб-форма: разбираем HTTP-запрос для брутфорса

Нашли форму логина — не спешите запускать Hydra. Сначала нужно понять, как форма работает на уровне HTTP. Откройте DevTools в браузере (F12), перейдите на вкладку Network, введите любой логин и пароль, нажмите «Войти» и изучите перехваченный запрос.

Что именно смотреть в запросе

Метод. POST — данные в теле запроса, не видны в URL. GET — данные в параметрах адресной строки. Подавляющее большинство форм логина используют POST.

Имена полей. Форма может называть поля username и password, а может — user, pass, log, pwd, email, login_field. Имена берутся из атрибута name в HTML-коде или из перехваченного запроса. Частая ошибка новичков — угадывать имена полей вместо того, чтобы просто посмотреть.

Скрытые поля. Многие формы содержат невидимые пользователю поля: CSRF-токен (случайная строка, привязанная к сессии; защищает от межсайтовых подделок запросов), anti-bot маркеры, идентификатор формы. Если при брутфорсе не передать эти поля — сервер отклонит запрос даже с правильным паролем. Я видел, как люди тратили часы на «сломанную Hydra», хотя проблема была в пропущенном CSRF-токене.

Ответ сервера при неудачном входе. Введите заведомо неверные данные и проверьте: что возвращает сервер? Строку «Invalid credentials»? HTTP-статус 302 (редирект)? Изменение длины ответа? Эта информация — ключ к правильной настройке инструмента подбора.

Если используете Burp Suite (инструмент для перехвата и модификации HTTP-трафика; Community Edition бесплатна), перехватите запрос через Burp Proxy. Там сразу видны все заголовки, cookies и тело запроса. Один перехваченный запрос экономит час мучений с Hydra.

Модуль курса: «Работа с веб-запросами» / Web Requests — учит читать HTTP-запросы и ответы, разбираться в заголовках, cookies и методах.

Словари для подбора учётных данных: какой выбрать и почему

Словарная атака (dictionary attack) — перебор не всех возможных комбинаций символов, а списка наиболее вероятных паролей. Почему это работает: по данным Have I Been Pwned, в одном только комбо-листе Exploit.In (2016) оказались 593 миллиона уникальных email-адресов с паролями. Из таких утечек и собираются словари — реальные пароли реальных людей.

Стандартные словари для старта:

  • rockyou.txt — классика, около 14 миллионов паролей из утечки RockYou (2009). Путь в Kali: /usr/share/wordlists/rockyou.txt. Для easy-уровня HTB обычно хватает первых 10–50 тысяч строк
  • SecLists — коллекция словарей от Daniel Miessler. Для веб-форм часто берут Passwords/Common-Credentials/10k-most-common.txt
  • Списки имён пользователей: SecLists/Usernames/Names/names.txt

Критически важная деталь, которую новички пропускают: сначала определите логин, потом подбирайте пароль. Некоторые формы по-разному реагируют на несуществующий логин и неверный пароль к существующему: «User not found» в одном случае, «Wrong password» — в другом. Это позволяет сначала перечислить (enumerate) валидные логины, а потом брутфорсить пароль только к ним. Разница во времени — в сотни раз.

На HTB easy-уровне логины часто находятся при обычной разведке: в комментариях HTML-кода, на страницах «О нас», в метаданных файлов. Иногда логин очевиден — admin, root, administrator.

Модуль курса: «Атаки на пароли и словари» / Password Attacks — покрывает создание, оптимизацию словарей и инструменты генерации вроде CUPP (Common User Passwords Profiler — утилита, которая создаёт персонализированный словарь на основе информации о конкретном пользователе).

Hydra для брутфорса веб-формы: пошаговый разбор с объяснением

Hydra — инструмент для автоматизированного подбора учётных данных, поддерживает десятки протоколов: SSH, FTP, HTTP-GET, HTTP-POST-FORM и другие. Предустановлена в Kali Linux. Защитники про неё знают: в репозитории SigmaHQ для Hydra есть правило детектирования (proc_creation_win_hktl_hydra.yml).

Допустим, на разведке мы выяснили: форма отправляет POST-запрос на /login.php, поля называются username и password, при неудачном входе в ответе содержится строка «Invalid credentials».

hydra -l admin -P /usr/share/wordlists/rockyou.txt 10.10.10.X http-post-form "/login.php:username=^USER^&password=^PASS^:Invalid credentials" -t 16

Разбор каждого элемента:

  • -l admin — фиксированный логин. Если логин неизвестен, используйте -L users.txt со списком
  • -P rockyou.txt — путь к файлу словаря паролей
  • 10.10.10.X — IP-адрес цели
  • http-post-form — модуль Hydra для POST-форм (для GET — http-get-form)
  • Строка в кавычках содержит три части через двоеточие: путь к форме, тело запроса с маркерами ^USER^ и ^PASS^ (Hydra подставит туда значения), строка неудачного входа (failure string)
  • -t 16 — количество параллельных потоков. На HTB можно ставить 16–32, на реальных целях — 4 и ниже, чтобы не вызвать блокировку

Ожидаемый вывод при успехе:

[80][http-post-form] host: 10.10.10.X   login: admin   password: monkey123

Hydra покажет найденную пару логин/пароль. Если за 5–10 минут ничего не нашлось на словаре из 10 тысяч записей — проблема почти наверняка в настройке, а не в пароле.

Частые ошибки при работе с Hydra

Ошибка Симптом Решение
Неверная failure-строка Hydra «находит» каждый пароль Скопируйте строку из реального ответа через DevTools
Пропущены cookies Сервер отклоняет все запросы Добавьте заголовок: H=Cookie:PHPSESSID=abc123
Пропущен CSRF-токен Все попытки отвечают ошибкой 403 Переходите к Burp Intruder
Неверное имя поля 0 валидных результатов Проверьте атрибут name= в HTML-коде
Слишком много потоков IP заблокирован, таймауты Снизьте до -t 4
Не указан путь /login.php Hydra бьёт в корень сайта Скопируйте путь из перехваченного запроса

По данным сравнительного тестирования 26 веб-приложений (pentest-tools.com, 2024), Hydra показала 27% точности в лабораторном сценарии и 15% в условиях с CSRF-токенами и динамическими формами. На простых формах без защиты (а на HTB easy именно такие) она работает быстро и надёжно. Но если форма сложнее — нужен другой подход.

Модуль курса: «Брутфорс логинов» / Login Brute Forcing — покрывает синтаксис Hydra и Medusa для HTTP, SSH, FTP с практическими лабами. По данным HTB Academy, модуль классифицирован как Easy и предполагает базовое знание командной строки Linux.

Burp Suite Intruder для брутфорса: когда Hydra не справляется

Если форма использует CSRF-токен, динамические скрытые поля или клиентский JavaScript для хеширования пароля — Hydra без дополнительных скриптов не справится. Burp Suite Intruder решает эту проблему: он работает на уровне HTTP-запросов с полным контролем над каждым параметром.

Пошаговый план (предусловие — установленный Burp Suite, настроен браузерный прокси на 127.0.0.1:8080):

Шаг 1: перехватите запрос. Включите Intercept в Burp Proxy, отправьте форму с любыми данными. Burp покажет полный HTTP-запрос со всеми заголовками, cookies и телом. Как понять, что получилось: во вкладке Proxy → Intercept появится перехваченный POST-запрос.

Шаг 2: отправьте в Intruder. Правый клик на запросе → Send to Intruder. Во вкладке Intruder → Positions выделите значение пароля как payload-позицию — Burp обрамит его символами §.

Шаг 3: настройте payload. Вкладка Payloads → Payload type: Simple list → загрузите словарь. Тип атаки — Sniper (один параметр перебирается, остальные фиксированы).

Шаг 4: если есть CSRF-токен. Создайте макрос (macro) в Project Options → Sessions → Session Handling Rules. Макрос будет автоматически запрашивать страницу формы, извлекать свежий токен и подставлять его в каждый следующий запрос. Без этого шага все попытки вернут ошибку. Настройка макроса — минут 10 работы, но без неё вы не сдвинетесь.

Шаг 5: запуск и фильтрация. После завершения отсортируйте результаты по столбцу Length (длина ответа). Успешный вход обычно возвращает ответ, длина которого заметно отличается от остальных — например, 8900 байт вместо стандартных 4500.

Для справки: тип атаки Cluster Bomb перебирает все комбинации из двух списков (логины × пароли) — подходит, когда оба неизвестны. Pitchfork берёт строки попарно (первый логин + первый пароль, второй + второй) — это для credential stuffing, когда пары уже известны из утечки.

Модуль курса: «Инструменты веб-пентеста» / Web Penetration Testing Tools — детальная работа с Burp Suite: Intruder, Repeater, Session Handling.

Фильтрация результатов: как отличить успешный вход от ложных срабатываний

Самая коварная ловушка при прохождении HTB-машины — принять ложное срабатывание за реальный результат. Hydra или Burp могут отметить пароль как «найденный», хотя сервер вернул ту же страницу ошибки в чуть другой обёртке.

Три надёжных индикатора:

Длина ответа. Если 999 из 1000 ответов имеют длину 4521 байт, а один — 8903 байта, этот выброс — кандидат на успешный вход. В Burp Intruder сортировка по колонке Length покажет его сразу.

HTTP-статус. Неудачный вход часто возвращает 200 (страница с сообщением об ошибке). Успешный — 302 (редирект в личный кабинет). Фильтр по статусу в Burp или Hydra отсечёт основной массив.

Заголовок Set-Cookie. При успешной аутентификации сервер обычно устанавливает сессионную cookie. Появление нового Set-Cookie в ответе — сильный сигнал.

Всегда проверяйте найденный пароль вручную — откройте браузер, введите пару логин/пароль и убедитесь, что попали за форму. Десять секунд работы спасают от ложных путей.

Ошибки новичков при прохождении HTB через брутфорс

За время менторства я собрал список ошибок, которые встречаю раз за разом:

Запуск огромного словаря сразу. Полный rockyou.txt — 14 миллионов записей. Для HTB easy хватает первых 10–50 тысяч строк. Команда head -n 10000 rockyou.txt > small.txt создаст укороченную версию. Не помогло — увеличивайте.

Игнорирование rate-limiting. На HTB это редкость, но на реальном пентесте — норма. Перед массовым перебором отправьте 5–10 запросов вручную через Burp Repeater и проверьте, не начинает ли сервер отвечать иначе. Появление задержки, CAPTCHA или HTTP 429 означает: снижайте скорость.

Проблемы с кодировкой. Если форма отправляет данные с URL-кодированием (пробел → %20, символ @ → %40), а инструмент передаёт символы как есть — сервер не распознает запрос. Burp кодирует автоматически, Hydra — не всегда.

Забытые cookies. Многие приложения присваивают cookie с сессией каждому, кто открыл веб-форму, а при получении данных проверяют, есть ли такая сессия. Без передачи cookie все попытки будут отклонены — даже с верным паролем.

Копирование команд из чужих writeup без адаптации. Каждая форма уникальна: имена полей, пути, failure-строки. Команда, сработавшая на одной машине, не сработает на другой без корректировки. Я на это смотрю так: writeup — это подсказка, а не рецепт.

После подбора пароля: маппинг пути HTB Easy на модули курса пентеста

Подобрали пароль — вошли в панель. На HTB-машинах easy-уровня после аутентификации обычно открывается один из сценариев: админ-панель с возможностью загрузки файлов (upload reverse shell), интерфейс с command injection (внедрение команд ОС через поле ввода) или доступ к конфигурации с паролями других пользователей и SSH-ключами.

Маппинг полного пути на модули учебной программы:

Шаг на HTB-машине Модуль курса Ключевой навык
Сканирование портов, поиск веб-сервиса Enumeration & Information Gathering nmap, ffuf, сбор баннеров
Анализ HTTP-запроса формы Web Requests DevTools, Burp Proxy, чтение заголовков
Подбор словаря, перечисление пользователей Password Attacks SecLists, CUPP, enumeration
Запуск Hydra / Medusa Login Brute Forcing Синтаксис, failure string, потоки
Работа с Burp Intruder, CSRF-токены Web Penetration Testing Tools Intruder, макросы, фильтрация
Загрузка shell, reverse connection Shells & Payloads Reverse shell, bind shell, listeners
Повышение привилегий Privilege Escalation SUID, sudo, kernel exploits

Каждый модуль — не абстрактная лекция, а набор лаб, где вы делаете ровно то же самое, но в контролируемой среде с проверкой результата. Прохождение одной HTB-машины easy-уровня задействует минимум четыре модуля. Десять машин — и вы закрыли практическую часть половины курса.

Я вижу устойчивый паттерн у людей, которые приходят в пентест из смежных IT-профессий: они пытаются учить инструменты, не понимая протокол. Запускают Hydra с копированной командой из чужого writeup, получают ноль результатов и решают, что «брутфорс не работает». Проблема не в инструменте. Проблема в том, что они не открыли DevTools. Не проверили, есть ли CSRF-токен. Не прочитали ответ сервера на заведомо неверный пароль.

Брутфорс веб-формы на пентесте — это не про скорость перебора. Это про понимание HTTP на уровне «могу собрать запрос руками в curl». Без этого фундамента Hydra, Burp, ffuf — бесполезные буквы в терминале. На HTB easy-уровне этот навык прокачивается идеально: машины простые, но каждая форма требует внимания к деталям. Если проходить их осмысленно, а не по готовым writeup, за 10–15 машин появляется уверенность, которая на реальном пентесте стоит дороже любого сертификата. Базовый трек IB Basics на codeby.school — это то, что я бы прошёл вместо того, чтобы тыкаться в YouTube.

Эту тему и смежные навыки разбирают на практике в курсе «Специалист по тестированию на проникновение» Codeby Academy.