
На последнем университетском CTF наша команда потеряла 40 минут на web-таске уровня Easy. Флаг лежал в ответе сервера на GET-запрос с параметром user_id=1 — достаточно было заменить значение на 0 и отправить повторно. Три человека ковыряли HTML в DevTools, четвёртый догадался открыть Burp Suite — один запрос в Repeater, и флаг на экране. Вот она, разница между «вижу страницу в браузере» и «вижу каждый байт между браузером и сервером». Первое — тыканье наугад, второе — системный подход к поиску уязвимостей. Эта статья — тот самый воркшоп, который я провожу перед каждым CTF для новичков: от настройки прокси Burp Suite и установки сертификата до перехвата первого запроса и нахождения реальной уязвимости в web-таске.
Burp Suite — перехватывающий прокси и набор инструментов для анализа веб-трафика, заточенный под поиск уязвимостей веб-приложений. Для CTF-игрока на web-категории это главный рабочий инструмент. Без него половина тасков просто нерешаема из браузера. Подробнее — в нашем обзоре пентест веб-приложений.
Из всего арсенала новичку на CTF нужны четыре модуля. Остальные подождут.
Proxy — HTTP прокси-сервер, который встаёт между браузером и целевым сервером. Перехватывает каждый запрос и ответ, позволяет их читать, менять на лету и пересылать дальше. Именно тут видно то, что браузер прячет: скрытые параметры форм, cookie с закодированными данными, заголовки авторизации, нестандартные HTTP-методы.
Repeater — ручная отправка модифицированных запросов. Перехватил запрос в Proxy, кинул в Repeater, поменял параметр, нажал Send, сравнил ответ. Это основной цикл при решении web-тасков. Можно открыть несколько вкладок и сравнивать реакцию сервера на разные модификации — удобно.
Intruder — автоматизация перебора. Нужно проверить 100 значений параметра (ID пользователей, PIN-коды, словарь паролей) — Intruder делает это за секунды. В Community-версии скорость режется троттлингом, но для CTF-задач обычно хватает.
Decoder — кодирование и декодирование данных. Base64, URL-encoding, hex — то, что постоянно встречается в CTF. Скопировал подозрительную cookie, вставил в Decoder, декодировал из Base64 — увидел JSON с {"role":"user"}. Поменял на admin, закодировал обратно, вставил в запрос. Половина Easy-тасков решается именно так.
Scanner доступен только в платной Professional-версии (актуальную цену см. на portswigger.net/burp/pro), но для CTF ручной анализ через Repeater эффективнее автоматического сканирования — задачи специально построены так, чтобы сканеры не справлялись. Community-версию качайте с официального сайта — она бесплатна, и все четыре модуля выше работают (Intruder — с троттлингом).
Перед перехватом первого запроса нужно настроить связку из двух компонентов: Burp как HTTP прокси-сервер и браузер, который будет ходить через него. Типичная ошибка новичков — настроить одно и удивляться, что ничего не работает.
Качайте Burp Suite Community с portswigger.net/burp/communitydownload. Установщик включает Java, отдельно ставить не нужно. Минимум: 4 ГБ RAM (лучше 8), Windows 10+ / macOS 10.14+ / Linux. При первом запуске выбирайте Temporary project и Use Burp defaults — для CTF этого за глаза. Persistent-проект нужен при многодневном пентесте, не на соревнованиях.
После запуска Burp автоматически поднимает прокси на 127.0.0.1:8080. Проверьте во вкладке Proxy → Proxy settings: в списке Proxy Listeners должна быть запись 127.0.0.1:8080 с галочкой Running. Если порт 8080 занят — меняйте на 8081 или любой свободный.
Теперь нужно направить браузер через этот прокси. Рекомендую Firefox — у него собственное хранилище сертификатов, независимое от системного, что упрощает жизнь.
Можно вручную менять прокси-настройки в Firefox каждый раз, но на CTF время — это флаги. FoxyProxy позволяет переключаться между прямым подключением и Burp одним кликом.
Пошаговая настройка FoxyProxy для Burp Suite:
about:addons), найдите FoxyProxy Standard и установитеBurp, Proxy Type — HTTP, Proxy IP — 127.0.0.1, Port — 8080BurpКритический момент: если FoxyProxy активен, а Burp Suite не запущен — браузер не загрузит ни одну страницу. Это первый вопрос, с которым приходят новички: «У меня интернет сломался». Не сломался — Burp не запущен. Порядок всегда такой: сначала запустили Burp → потом включили FoxyProxy → только тогда идёте на таск.
Как настроить браузер для Burp Suite без расширений: в Firefox — Settings → General → Network Settings → Manual proxy configuration → HTTP Proxy: 127.0.0.1, Port: 8080, отметить «Also use this proxy for HTTPS». В исключения добавить localhost, 127.0.0.1. Работает, но переключать вручную каждый раз — потеря двух минут, которых на CTF может не хватить.
Без установки CA-сертификата Burp браузер покажет ошибку безопасности на каждом HTTPS-сайте. Burp генерирует собственный сертификат для расшифровки HTTPS-трафика — по сути легитимный man-in-the-middle, применённый к собственному трафику. Технически это похоже на Adversary-in-the-Middle (T1557 по MITRE ATT&CK, тактики credential-access/collection), но T1557 описывает перехват трафика третьих лиц злоумышленником. Мы же расшифровываем собственный TLS-трафик через доверенный CA — это диагностика, а не атака.
Установка SSL сертификата Burp в Firefox:
http://burp (именно HTTP, не HTTPS)cacert.derЕсли после установки сертификата браузер всё равно ругается — перезапустите Firefox полностью. Не помогло — удалите старый сертификат PortSwigger из хранилища (вкладка Authorities, найдите PortSwigger) и импортируйте заново. На это уходит 30 секунд, но без рабочего сертификата перехват HTTPS-трафика невозможен.
Настройка прокси завершена. Переходим к перехвату. Откройте вкладку Proxy → Intercept и убедитесь, что кнопка показывает Intercept is on.
Теперь каждый запрос из браузера останавливается в Burp. В окне Intercept виден сырой HTTP-запрос: метод (GET/POST), URL, заголовки (Host, User-Agent, Cookie) и тело. То же самое, что DevTools показывают в «красивом» виде, но тут — без фильтров и с возможностью редактирования прямо перед отправкой.
Три кнопки управления перехватом: - Forward — отправить запрос дальше на сервер, получить ответ в браузер - Drop — удалить запрос: он не дойдёт до сервера, действие отменено - Intercept is on/off — глобальный переключатель перехвата
Типичный рабочий цикл анализа веб-трафика на CTF: включили Intercept → выполнили действие в браузере (нажали кнопку, отправили форму) → увидели запрос в Burp → изучили параметры → отправили Forward или перекинули в Repeater через Ctrl+R.
Теперь нюанс, на котором спотыкаются все: не держите Intercept включённым постоянно. Когда он активен, каждый запрос — CSS, JS, картинки, favicon, аналитика — останавливается в Burp. Вместо анализа интересного POST-запроса вы будете бесконечно нажимать Forward на мусорные GET к CDN. Включайте Intercept только перед конкретным действием, которое хотите перехватить. Нажали кнопку — перехватили — выключили.
Вся история запросов сохраняется во вкладке Proxy → HTTP history, даже когда Intercept выключен. Burp пишет трафик в фоне. Можно спокойно просматривать таск с выключенным Intercept, а потом найти нужный запрос в истории и отправить его в Repeater. Поиск по истории — Ctrl+F в нижней панели или фильтр по URL в строке Filter.
На CTF у вас одна цель — адрес таска, например http://challenge.ctf.local:5000. Всё остальное — шум. Target Scope ограничивает перехват и запись только целевым доменом.
Настройка Scope для web CTF:
http://challenge.ctf.local:5000Без настройки Scope за полчаса CTF в HTTP history накапливаются сотни запросов к Google Fonts, CDN jQuery и рекламным трекерам. Нужный POST к /api/login теряется на пятой странице. Scope — это экономия десятков минут за соревнование. Настраивайте первым делом.
Repeater — основной инструмент при решении web-тасков. Логика простая: взять запрос, поменять параметр, отправить, посмотреть ответ. Без автоматизации, без сканирования — чистая ручная работа, которая на CTF решает большинство задач.
Отправка запроса в Repeater: найдите его в HTTP history или перехватите через Intercept, кликните правой кнопкой → Send to Repeater (горячая клавиша Ctrl+R). Во вкладке Repeater слева — редактируемый запрос, справа — ответ сервера. Меняете что нужно, нажимаете Send, смотрите Response. Можно открыть несколько вкладок и сравнивать ответы на разные модификации одного запроса — это удобнее, чем кажется.
Типичный пример — проверка на IDOR (Insecure Direct Object Reference). По OWASP Top 10 это категория A01:2021 Broken Access Control — самая распространённая уязвимость: 94% протестированных приложений содержат какую-либо форму нарушения контроля доступа. На CTF задача может выглядеть так: страница профиля загружает данные через GET /api/profile?id=42. Меняем id=1 — сервер возвращает данные другого пользователя без проверки прав. Классический IDOR.
GET /api/profile?id=42 HTTP/1.1
Host: challenge.ctf.local:5000
Cookie: session=eyJhbGciOiJIUzI1NiJ9...
-- Меняем id=42 на id=1, нажимаем Send --
-- Ответ: {"username":"admin","flag":"CTF{broken_access}"}
Флаг получен одним изменённым параметром. В реальном пентесте такая уязвимость позволяет злоумышленнику стянуть данные любого пользователя системы. В MITRE ATT&CK эксплуатация публичных веб-приложений описывается как Exploit Public-Facing Application (T1190, тактика Initial Access), хотя T1190 подразумевает получение первоначального доступа в инфраструктуру. IDOR внутри уже аутентифицированной сессии — это скорее нарушение контроля доступа (OWASP A01), а не initial access в терминах ATT&CK.
Ещё один частый сценарий CTF — SQL-инъекция (A03:2021 Injection по OWASP). Если параметр попадает в SQL-запрос без фильтрации, через Repeater можно отправить классический тест:
GET /search?q=test' OR '1'='1 HTTP/1.1
Host: challenge.ctf.local:5000
Если ответ изменился — вернулись все записи вместо одной — инъекция подтверждена. Дальше: UNION SELECT для определения числа колонок, извлечение названий таблиц, получение флага. Весь цикл — в Repeater, запрос за запросом.
Когда одного запроса мало, подключается Intruder. На CTF это перебор ID пользователей (массовый IDOR), брутфорс PIN-кодов, фаззинг скрытых эндпоинтов.
Отправка запроса: правый клик → Send to Intruder (или Ctrl+I).
Во вкладке Intruder → Positions выделите параметр для перебора. Burp оборачивает его маркерами §. Нажмите Clear § (убрать все автоматические маркеры), затем выделите только нужное значение и нажмите Add §. В GET /api/profile?id=§42§ маркеры стоят вокруг значения 42 — именно оно будет перебираться.
Настройка перебора ID от 0 до 100:
idВ таблице результатов смотрите на колонки Status (код HTTP-ответа) и Length (размер ответа в байтах). Если 98 запросов вернули Status 403 и Length 240, а два запроса — Status 200 и Length 580 — вот они, интересные ID. Кликните на запрос с нестандартным ответом, посмотрите Response — с высокой вероятностью там флаг или данные для следующего шага.
В Community-версии Intruder работает с троттлингом — задержка между запросами замедляет перебор. Для CTF это редко критично: 100–200 значений прогоняются за пару минут. Для больших словарей (rockyou.txt на 14 миллионов записей) Community-версия уже неудобна, но такие задачи на CTF встречаются нечасто.
Четыре режима атаки в Burp Intruder:
| Тип атаки | Когда использовать | Пример на CTF |
|---|---|---|
| Sniper | Один параметр, один список | Перебор id от 0 до 100 |
| Battering Ram | Один список во все позиции | Одно значение подставляется и в логин, и в пароль |
| Pitchfork | Параллельные списки (1-й + 1-й, 2-й + 2-й) | Логин-пароль из одного файла попарно |
| Cluster Bomb | Все комбинации всех списков | Полный брутфорс логин + пароль |
Для 90% CTF-тасков хватает Sniper. Cluster Bomb нужен для брутфорса форм логина, когда есть список логинов и список паролей — Intruder переберёт все комбинации.
Соберём весь арсенал в один алгоритм. Допустим, на CTF дали URL: http://challenge.local:8080 — приложение с формой логина и дашбордом.
Шаг 1: разведка через Proxy. Включите FoxyProxy на профиль Burp. Intercept выключен. Пройдитесь по всем страницам приложения, заполните формы тестовыми данными, нажмите все кнопки. В HTTP history накопится набор запросов — это карта эндпоинтов: /login, /dashboard, /api/user, /static/app.js. Уже тут ищите подозрительные параметры и необычные заголовки.
Шаг 2: анализ запросов и cookie. В HTTP history найдите POST на /login. Посмотрите тело: username=guest&password=guest. Теперь ответ — заголовок Set-Cookie. Часто значение cookie — base64-строка. Скопируйте её, откройте Decoder, вставьте, выберите Decode as Base64. Увидели {"user":"guest","role":"user"}? Вот и потенциальная дыра: если сервер доверяет данным из cookie без серверной валидации — роль можно подменить.
Шаг 3: модификация через Repeater. Отправьте запрос к /dashboard (тот, что в HTTP history, с cookie) в Repeater через Ctrl+R. Возьмите JSON {"user":"admin","role":"admin"}, закодируйте в Base64 через Decoder. Вставьте результат в заголовок Cookie вместо оригинального значения. Send. Если сервер вернул страницу админа с флагом — задача решена. Типичная уязвимость: доверие клиентским данным без проверки на сервере, категория A01 по OWASP.
Шаг 4: если cookie-манипуляция не сработала — копаем глубже. Попробуйте SQL-инъекцию в поле логина: отправьте admin' -- в параметре username через Repeater. Проверьте HTML-ответ на hidden-поля — <input type="hidden" name="isAdmin" value="false">. Перехватите POST через Intercept, измените isAdmin=true, нажмите Forward. Ищите комментарии разработчиков в Response: <!-- TODO: remove debug endpoint /api/debug --> — такое встречается чаще, чем кажется.
Шаг 5: массовый перебор через Intruder. Если на дашборде есть эндпоинт /api/user?id=YOUR_ID — отправьте запрос в Intruder, переберите ID от 0 до 50 в режиме Sniper. Ищите ответ с нестандартным Length или Status-кодом — там будут данные привилегированного пользователя или сам флаг.
Алгоритм Proxy → анализ → Repeater → Intruder покрывает подавляющее большинство web-тасков уровня Easy и Medium на CTF. Сам инструмент несложный — ценность в системном подходе и внимательности к деталям запросов.
За два года подготовки университетской CTF-команды я собрал список ошибок, которые совершают все новички. Каждая — потерянные минуты или целые таски.
Забыли включить Intercept перед действием. Нажали Submit на странице, ничего в Burp не появилось. Проверили — Intercept is off. Запрос ушёл, действие выполнено, перехватывать нечего. Перед каждым критическим действием визуально проверяйте надпись на кнопке Intercept.
Не настроили Scope. HTTP history забита запросами к fonts.googleapis.com, cdn.jsdelivr.net и google-analytics. Нужный POST к /api/flag потерялся на пятой странице. Первое действие после открытия таска — добавить его URL в Target Scope и включить фильтр в HTTP history.
Не установили SSL-сертификат Burp. HTTPS-таск показывает ошибку SSL в браузере. Студент отключает Burp и пытается решить задачу без перехвата — вручную, через DevTools. Итог: 20 минут на задаче, которая решается за три. Установка сертификата — часть подготовки к CTF, а не «разберусь потом».
Игнорируют cookie и заголовки. Смотрят только на параметры в URL и теле POST. А флаг зашит в base64-cookie, которую нужно декодировать через Decoder. Или сервер проверяет заголовок X-Forwarded-For и отдаёт админку только для 127.0.0.1. На каждом таске проверяйте Set-Cookie в ответах и все нестандартные заголовки.
Не используют Repeater. Меняют параметры прямо в Intercept и нажимают Forward — если не сработало, нужно заново выполнять действие в браузере. В Repeater можно отправлять один и тот же запрос с десятками модификаций подряд. Ctrl+R должен стать рефлексом.
Не читают Response целиком. Смотрят только рендер страницы в браузере. А в сыром Response — закомментированный HTML с подсказкой, скрытый JSON-эндпоинт или debug-информация с путями к файлам на сервере. В Repeater или HTTP history всегда проверяйте вкладку Response → Raw через Ctrl+F.
Мини-чеклист перед CTF (у нас висит на стене):
127.0.0.1:8080Горячие клавиши, которые стоит запомнить: Ctrl+R — отправить в Repeater, Ctrl+I — отправить в Intruder, Ctrl+F — поиск в запросе или ответе.
Большинство руководств по Burp Suite для начинающих фокусируются на перечислении модулей — Proxy делает одно, Intruder другое, Scanner третье. Получается справочник по интерфейсу, а не навык. Я вижу это регулярно: человек прочитал документацию, знает расположение каждой кнопки — и зависает на первом web-таске, потому что не понимает, что именно искать в перехваченном запросе.
Навык пентестера — не знание интерфейса. Это привычка на каждый запрос смотреть глазами атакующего: какой параметр контролирует пользователь? Что произойдёт, если подставить чужой ID? Что спрятано внутри base64-cookie? Куда уходит значение из hidden-поля? Burp Suite для пентеста — усилитель внимательности, не замена мышления.
Через полгода регулярных CTF перестаёшь думать «где тут кнопка Intruder» и начинаешь думать «этот параметр не валидируется на стороне сервера, тут A01 Broken Access Control, нужно проверить смежные эндпоинты». Вот тогда Burp становится продолжением рук. Если хочешь не просто writeup, а пройти всю атаку самому — на WAPT есть лаба на каждый такой кейс.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «web».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...