Главная / Блог / Gobuster: перебор директорий и поиск скрытых файлов в веб-задачах CTF

14 мин.00

Gobuster: перебор директорий и поиск скрытых файлов в веб-задачах CTF

Gobuster: перебор директорий и поиск скрытых файлов в веб-задачах CTF

Gobuster: перебор директорий и поиск скрытых файлов в веб-задачах CTF

Тренировочная машина на HackTheBox. Веб-сервер отдаёт пустую страницу — голый Apache на порту 80. Nmap подтвердил единственный открытый HTTP-порт и замолчал. Тупик? Одна команда gobuster dir со словарём common.txt нашла /robots.txt за 35 секунд. Внутри — путь к /admin-login-page.php. В исходном коде страницы — забытые тестовые учётные данные. Четыре минуты от первого запуска до флага, три с половиной из которых — перебор директорий. Без dirbusting эту машину можно было ковырять вручную часами и ничего не найти. По данным Verizon DBIR 2025, на атаки на веб-приложения приходится около 26% подтверждённых breaches — и немалая часть начинается с обнаружения эндпоинтов, которые разработчики не планировали показывать миру.

Место dirbusting в цепочке атаки

Перебор директорий и файлов на веб-сервере — фаза активной разведки. В терминологии MITRE ATT&CK Gobuster реализует технику Wordlist Scanning (T1595.003, Reconnaissance): берёт словарь с типовыми именами путей, подставляет каждое слово в URL целевого сервера и смотрит на HTTP-ответ. Подробнее — в нашем материале про пентест веб-приложений.

В полной цепочке атаки на веб-приложение dirbusting занимает конкретное место между сетевой разведкой и эксплуатацией.

До перебора директорий идёт сетевое сканирование (nmap, masscan). На этом этапе вы знаете, что порт 80 или 443 открыт — и больше ничего. Тип приложения, его структура, скрытые разделы — всё это пока тёмный лес.

Сам dirbusting — File and Directory Discovery (T1083, Discovery). Gobuster методично проверяет тысячи потенциальных путей и возвращает список реально существующих: админ-панели, конфигурационные файлы, бэкапы, API-эндпоинты, тестовые страницы.

После перебора директорий начинается эксплуатация найденного. Типичные находки в веб-задачах CTF и на реальных пентестах:

  • Файлы с учётными данными — Credentials In Files (T1552.001): .env, config.php.bak, db_backup.sql, credentials.txt
  • Забытые веб-шеллы — Web Shell (T1505.003): cmd.php, shell.aspx, c99.php
  • Панели управления с дефолтными аккаунтами — Default Accounts (T1078.001): phpMyAdmin без пароля, Tomcat Manager со стандартными tomcat:tomcat, WordPress с admin:admin
  • Скрытые файлы и директории — Hidden Files and Directories (T1564.001): .git/, .svn/, .DS_Store, которые раскрывают структуру проекта и иногда содержат исходный код
  • Уязвимые эндпоинты — Exploit Public-Facing Application (T1190): забытые тестовые API, необновлённые CMS, debug-интерфейсы

Без dirbusting вся остальная цепочка не запускается. Нельзя эксплуатировать то, чего не обнаружил. Поиск скрытых директорий — первый навык для любой веб-задачи CTF.

[Применимо: внешний пентест, CTF web-задачи, bug bounty. Сканирование директорий сайта — стандартный первый шаг во всех этих сценариях. Во внутреннем пентесте dirbusting применяется реже — обычно есть доступ к документации и знание структуры приложения]

Требования к окружению и установка Gobuster

Требования к окружению:

  • ОС: Kali Linux 2022.1+ (Gobuster предустановлен), Debian 11+, Ubuntu 20.04+, или любая Linux-система с Go
  • RAM: 512 МБ минимум (Gobuster написан на Go, потребляет мизер памяти — основная нагрузка ложится на сеть, не на CPU/RAM)
  • Зависимости: для сборки из исходников — Go 1.21+ (точная версия указана в go.mod репозитория)
  • Сеть: прямой доступ до целевого веб-сервера или настроенный прокси
  • Словари: пакет seclists (в Kali: sudo apt install seclists) или ручная загрузка с github.com/danielmiessler/SecLists

Статус инструмента: Gobuster — проект с открытым исходным кодом, репозиторий github.com/OJ/gobuster, актуальная версия 3.8.2. Написан на Go, лицензия Apache-2.0. Проект активно поддерживается автором OJ Reeves.

Установка в Kali Linux — самый быстрый путь. Вводите gobuster в терминале: если утилита не стоит, система предложит установить пакет. Или явно: sudo apt install gobuster. Словари SecLists ставятся отдельно: sudo apt install seclists, после чего они лежат в /usr/share/seclists/.

Установка через Go — для Debian, Ubuntu и других дистрибутивов без предустановленного Gobuster. Сначала ставите Go (скачиваете с go.dev/dl/, распаковываете в /usr/local/go, добавляете /usr/local/go/bin и ~/go/bin в PATH через .bashrc). Затем: go install github.com/OJ/gobuster/v3@latest. Совет из практики: сразу пропишите export PATH=$PATH:$HOME/go/bin в конец .bashrc — иначе после перелогина команда gobuster пропадёт, и вы будете минут пять гадать, куда она делась.

Установка через Docker — если не хочется возиться с Go-окружением: клонируете репозиторий и собираете образ: git clone https://github.com/OJ/gobuster && cd gobuster && docker build -t gobuster ..

Работает? Переходим к делу.

Для самостоятельной практики перебора директорий можно поднять OWASP Juice Shop в Docker: docker pull bkimminich/juice-shop && docker run -p 3000:3000 bkimminich/juice-shop. Уязвимое веб-приложение с десятками скрытых эндпоинтов — нормальный полигон для первых экспериментов с Gobuster.

Режим dir — перебор директорий и файлов

Режим dir — основной рабочий режим Gobuster и причина, по которой инструмент используется в подавляющем большинстве веб-задач CTF. Остальные режимы (dns для поиска поддоменов, vhost для виртуальных хостов, fuzz для fuzzing, s3 и gcs для облачных бакетов, tftp для TFTP-серверов) решают другие задачи. В CTF-контексте 90% работы — это dir.

Базовая команда и ключевые флаги

Минимальная рабочая команда для перебора директорий — два обязательных параметра: URL цели и путь к словарю.

gobuster dir -u http://10.10.10.5/ \
  -w /usr/share/seclists/Discovery/Web-Content/common.txt \
  -t 20 -x php,txt,bak

/.htpasswd            (Status: 403) [Size: 278]
/.htaccess            (Status: 403) [Size: 278]
/admin                (Status: 301) [Size: 315]
/index.html           (Status: 200) [Size: 1245]
/robots.txt           (Status: 200) [Size: 47]
/uploads              (Status: 301) [Size: 317]

Разберём каждый элемент. Команда dir задаёт режим перебора директорий. Флаг -u — целевой URL, обязательно со схемой (http:// или https://). Флаг -w — путь к словарю, без него Gobuster не запустится. Флаг -t 20 — 20 параллельных потоков (по умолчанию 10): для локальных CTF-стендов спокойно ставьте 20-50, для удалённых серверов лучше оставить 10 или снизить, чтобы не положить цель. Флаг -x php,txt,bak добавляет расширения: Gobuster проверит не только /admin, но и /admin.php, /admin.txt, /admin.bak.

Важный момент: каждое расширение в -x умножает количество запросов. Словарь на 4 500 слов с четырьмя расширениями — уже 22 500 запросов. На быстром стенде это секунды, на удалённом сервере с ограничением в 100 запросов в секунду — минуты.

Полезные флаги, которые стоит знать:

  • -o results.txt — запись результатов в файл, чтобы не потерять вывод
  • -q — тихий режим: убирает баннер и прогресс-бар, оставляет только результаты
  • -k — отключение проверки TLS-сертификата (для HTTPS с самоподписанными сертификатами, а в CTF это стандарт)
  • -r — следовать за редиректами
  • --useragent "Mozilla/5.0" — замена User-Agent (по умолчанию Gobuster подставляет свой, что легко детектится)
  • --delay 200ms — задержка между запросами (для реального пентеста, не CTF)

Полный список опций: gobuster dir --help.

Словари: от чего зависит результат перебора

Gobuster — транспорт. Результат перебора директорий на 80% зависит от словаря. Если нужного пути нет в wordlist, инструмент его не найдёт, сколько бы потоков вы ни выставили.

Стандартная коллекция — SecLists (github.com/danielmiessler/SecLists). В папке Discovery/Web-Content/ лежат словари под разные задачи.

Маленькие словари (~4 500 записей)common.txt или /usr/share/dirb/wordlists/common.txt. Самые типовые пути: admin, login, backup, config, robots.txt, sitemap.xml. Отрабатывают за секунды. Начинайте с них — в большинстве CTF-задач уровня Easy этого хватает за глаза.

Средние словари (~220 000 записей)directory-list-2.3-medium.txt. Покрывают нестандартные имена: кастомные API-эндпоинты, тестовые окружения, забытые staging-среды. Время работы: от 3 до 15 минут. Берите, если маленький словарь не дал результата.

Большие словари (~550 000 записей)raft-large-directories.txt. Крайняя мера для CTF: долго работают, генерируют массу HTTP-запросов, оставляют след в логах. На реальном сервере с WAF такой перебор будет заблокирован в первые минуты.

Стратегия для веб CTF задач: начинайте с common.txt. Не нашли ничего — переключайтесь на directory-list-2.3-medium.txt и добавляйте расширения -x php,html,txt,bak. Если задача намекает на конкретную технологию (WordPress, Django, Node.js, Tomcat), ищите специализированные wordlist для dirbusting в SecLists: папка Discovery/Web-Content/CMS/ или Discovery/Web-Content/CGIs/.

Фильтрация результатов и интерпретация HTTP-кодов

Gobuster по умолчанию считает «успешными» ответы с кодами 200, 204, 301, 302, 307. Набор разумный для старта, но без понимания того, что стоит за каждым кодом, половина полезной информации пройдёт мимо.

Почему код 403 интереснее, чем 404

Код 404 (Not Found) — путь не существует. Gobuster фильтрует его автоматически, это шум. Код 200 (OK) — путь существует и доступен. Очевидная находка. Самое интересное — между ними:

  • 301/302 (Redirect) — путь существует, но перенаправляет. Чаще всего сервер добавляет trailing slash к директории (/admin/admin/) или кидает на страницу логина. В обоих случаях — валидная находка.
  • 403 (Forbidden) — путь существует, доступ запрещён. Самый ценный код для пентестера: сервер подтверждает, что ресурс реален. Можно попробовать обойти: сменить HTTP-метод (POST вместо GET), добавить заголовки (X-Forwarded-For: 127.0.0.1), проверить регистр (/Admin вместо /admin), или поискать альтернативные точки входа.
  • 500 (Internal Server Error) — путь существует и вызывает ошибку на сервере. Потенциально уязвимый эндпоинт: ошибка может раскрыть стек вызовов, пути файловой системы, имена таблиц в базе.

Чтобы добавить 403 в вывод, используйте -b 404 (blacklist только 404, остальные коды отображаются) или явно укажите интересующие коды через --status-codes 200,204,301,302,307,403,500.

Исключение ложных срабатываний

Классическая боль при переборе эндпоинтов: веб-приложение отдаёт одинаковую страницу с кодом 200 для любого несуществующего пути. Типично для SPA (React, Angular, Vue), которые маршрутизируют на клиенте.

Gobuster при запуске сам это проверяет: шлёт запрос на заведомо несуществующий URL. Если получает 200 — выводит предупреждение и подсказывает размер ответа, который стоит исключить.

gobuster dir -u http://10.10.10.5:3000/ \
  -w /usr/share/seclists/Discovery/Web-Content/common.txt \
  --exclude-length 3748 -t 20

Параметр --exclude-length 3748 убирает из выдачи все ответы с телом размером 3748 байт — столько весит кастомная страница ошибки на этом сервере. После фильтрации в результатах остаются только реальные находки с отличающимся размером ответа.

Ещё полезные фильтры:

  • --exclude-length 0 — исключить пустые ответы (полезно в режиме vhost)
  • -b 404,503 — чёрный список кодов ответа
  • --no-error — скрыть ошибки соединения, таймауты и отказы
  • --random-agent — случайный User-Agent для каждого запроса, чтобы снизить вероятность блокировки по паттерну

Пошаговый разбор веб-задачи в CTF

Типичный сценарий веб-задачи уровня Easy на CTF-платформе — от старта до флага. Каждый шаг — одно действие с ожидаемым результатом.

Шаг 1: сетевая разведка. Запускаем nmap -sV <IP-адрес>. В выводе — порт 80 (HTTP) или 443 (HTTPS) открыт, за ним Apache или Nginx. Открываем IP в браузере: стандартная страница, форма логина, или вообще пустота — зависит от задачи.

Шаг 2: поиск словаря. В Kali словари лежат в /usr/share/seclists/Discovery/Web-Content/ (если стоит пакет seclists) или /usr/share/dirb/wordlists/. Не уверены в точном пути: find / -type f -name "common.txt" 2>/dev/null.

Шаг 3: перебор директорий. Запускаем gobuster dir -u http://<IP>/ -w /usr/share/seclists/Discovery/Web-Content/common.txt -t 30 -x php,txt,bak. Ждём завершения — обычно менее минуты для common.txt. В выводе ищем строки с кодом 200 и 301.

Шаг 4: анализ находок. Допустим, Gobuster нашёл /robots.txt (200), /admin (301), /backup (301), /.htaccess (403). Код 403 у .htaccess — ожидаемое поведение Apache. А вот /robots.txt, /admin и /backup — кандидаты для проверки.

Шаг 5: изучение robots.txt. curl http://<IP>/robots.txt. Файл содержит список путей, которые веб-мастер хочет скрыть от поисковых роботов. В CTF-задачах в нём часто лежит путь к скрытой странице: /admin-login-page.php, /secret-panel/, /flag.txt.

Шаг 6: проверка найденного пути. Открываем URL в браузере. Форма логина? Смотрим исходный код (Ctrl+U). Разработчики CTF-задач регулярно оставляют комментарии в HTML: <!-- TODO: remove test credentials admin:password123 -->. Вводим — получаем флаг.

Шаг 7: рекурсивный перебор. Gobuster не сканирует вложенные директории автоматически. Нашли /backup? Запускайте отдельную команду: gobuster dir -u http://<IP>/backup/ -w <словарь> -x sql,zip,tar.gz. Часто именно во вложенных путях валяются дампы баз данных и архивы с исходным кодом — скрытые файлы веб-сервера, которые и решают задачу.

Gobuster, ffuf или dirsearch — сравнение инструментов

Gobuster — не единственный инструмент для сканирования директорий сайта. Два основных конкурента — ffuf и dirsearch. Все три решают задачу content discovery, но архитектурно устроены по-разному.

Критерий Gobuster ffuf dirsearch
Язык Go Go Python
Скорость Высокая Высокая Средняя
Рекурсия Нет Да (через -recursion) Да (встроенная)
Область fuzzing Путь в URL Любая часть запроса (URL, заголовки, тело, cookies) Путь в URL
Фильтрация По коду, размеру По коду, размеру, словам, строкам, regex По коду, размеру
Дополнительные режимы dns, vhost, s3, gcs, tftp, fuzz Нет (универсальный fuzzer) Нет
Порог входа Низкий Средний Низкий

Когда Gobuster достаточен: быстрый первый проход по директориям, DNS-энумерация поддоменов, поиск виртуальных хостов. Для 80% веб-задач CTF хватает gobuster dir -u <url> -w <wordlist> без дополнительных плясок.

Когда нужен ffuf: требуется перебор GET/POST-параметров, fuzzing заголовков, рекурсивное сканирование, или тонкая фильтрация по количеству слов/строк в ответе (флаги -fw и -fl). ffuf перебор директорий — лишь одна из его возможностей. Маркер FUZZ подставляется в любую часть HTTP-запроса, что делает ffuf универсальным фаззером.

Когда выбрать dirsearch: нужна рекурсия из коробки без ручного перезапуска. Dirsearch сам заходит внутрь найденных директорий и продолжает сканирование. Минус — Python медленнее Go, особенно на больших словарях. Dirsearch — полноценная альтернатива dirbuster для тех, кто привык к Python.

На практике в CTF работает связка: Gobuster для быстрого первого прохода, ffuf — когда нужен тонкий fuzzing или рекурсия с гибкой фильтрацией.

Ограничения Gobuster и когда инструмент не поможет

Знание ограничений — признак того, что вы инструментом реально пользуетесь, а не просто прочитали README. Вот конкретные ситуации, где Gobuster буксует.

Отсутствие рекурсии. Gobuster проверяет только один уровень глубины. Каждую найденную директорию нужно сканировать отдельным запуском. В CTF это терпимо (обычно 2-3 уровня), но на реальном пентесте с десятками вложенных путей — утомительно.

Динамические wildcard-ответы. Если сервер возвращает кастомную страницу ошибки и вставляет в тело запрошенный путь, размер ответа будет разным для каждого запроса. Фильтрация через --exclude-length не поможет. Тут ffuf с фильтрацией по количеству слов (-fw) или строк (-fl) справляется лучше.

WAF и rate limiting. На реальных серверах (не CTF-стендах) Web Application Firewall обнаружит массовый перебор эндпоинтов и заблокирует IP. Gobuster поддерживает --delay и --proxy, но против WAF уровня Cloudflare или Akamai этих мер мало. В CTF-задачах WAF обычно отключён, но при переходе к bug bounty или пентесту это ограничение становится критическим.

SPA-фреймворки. React, Angular, Vue.js — все они возвращают один и тот же HTML-документ для любого маршрута, а навигация крутится на стороне клиента через JavaScript. Gobuster увидит код 200 для каждого пути из словаря. Фильтрация по размеру помогает, но требует предварительного анализа.

Пути за пределами словаря. Фундаментальное ограничение любого инструмента для перебора: если разработчик назвал админку /xK9mP2q/, ни один словарь её не найдёт. Тут помогают другие техники: анализ JavaScript-файлов приложения, извлечение путей из .git/ или .env, spider/crawler и Google dorking.

Только HTTP(S). Режим dir работает исключительно с HTTP-протоколом. WebSocket-эндпоинты, GraphQL-интроспекция, gRPC-сервисы — всё это требует других инструментов.

Gobuster — это перебор директорий, ни больше ни меньше. Но в этой задаче он работает быстро, надёжно и без лишних зависимостей.

Привычка, которая формируется после нескольких десятков решённых CTF-машин: dirbusting — не одноразовое действие. Нашли новую директорию — запустили сканирование внутри. Поняли, что приложение на PHP — добавили -x php,phps,php.bak. Увидели нестандартный порт — проверили и его. Поиск скрытых директорий — итеративный процесс, а не одна команда.

Главная ошибка новичков: запустить Gobuster один раз с дефолтным словарём, не получить результат и решить, что инструмент сломан. Проблема почти всегда в выборе wordlist для dirbusting и расширений. Смена словаря с common.txt на directory-list-2.3-medium.txt в половине случаев обнаруживает то, что первый пропустил. Добавление расширений -x bak,old,conf,sql,zip находит забытые бэкапы и дампы, которые разработчики оставили рядом с рабочими файлами. Gobuster CTF — это про методологию подбора словарей и итеративный подход, а не про скорость или количество потоков.

И ещё момент, который редко обсуждают: скорость перебора — не всегда плюс. На локальном CTF-стенде 50 потоков (-t 50) ускорят работу в разы. Но на тренировочной машине с ограниченными ресурсами или при переходе к реальному пентесту агрессивное сканирование создаёт нагрузку, которую заметит любой WAF или IDS. В реальном внешнем пентесте -t 5 --delay 200ms — разумнее, чем -t 100. Dirbusting веб-приложений в боевых условиях — баланс между полнотой покрытия и скрытностью. В CTF такой баланс искать не нужно: ставьте максимум потоков и большой словарь. На IB Basics (codeby.school) эту цепочку — от первых команд в Kali до осмысленного перебора с правильными словарями — проходят с куратором за несколько модулей.

🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».

Поделиться

0 комментариев

Пожалуйста, войдите, чтобы оставить комментарий.

Загрузка комментариев...