
На прошлом CTF наша команда убила четыре часа на веб-таск, который решался за двадцать минут. Четыре часа. На порту 8443 висел дев-сервер с дефолтными кредами и открытым debug-эндпоинтом — а мы ковыряли hardened production на 443, как упоротые. Флаг лежал рядом, на порту, который никто не догадался просканировать. Вот вам и вся «сложность» задания. Качество разведки веб-приложения перед атакой определяет, потратите вы на таск двадцать минут или четыре часа впустую. Без вариантов.
Разведка веб-приложения делится на два принципиально разных подхода, и оба нужны. Подробнее — в нашем материале про пентест веб-приложений.
Пассивная разведка — сбор информации без прямого взаимодействия с целью. DNS-записи, WHOIS, Google Dorks, Certificate Transparency Logs, кэш поисковиков, веб-архивы. По MITRE ATT&CK это Search Victim-Owned Websites (T1594) и Search Open Technical Databases (T1596). Пассивная фаза не оставляет следов в логах цели — IDS/IPS не сработает, потому что вы вообще не отправляете запросы к серверу.
Активная разведка — прямое взаимодействие: сканирование портов, перебор директорий, fingerprinting сервисов. По MITRE ATT&CK — Active Scanning (T1595) и подтехники: Scanning IP Blocks (T1595.001), Vulnerability Scanning (T1595.002), Wordlist Scanning (T1595.003). Активная разведка оставляет следы: access-логи, WAF, SIEM. На CTF это некритично, на реальном пентесте — имеет значение.
Зачем это злоумышленнику (или пентестеру): задача — собрать карту атакуемой поверхности до эксплуатации. Без неё вы стреляете вслепую. Пропущенный поддомен, забытая тестовая страница, устаревший компонент с известным CVE — любой из этих элементов может оказаться единственной точкой входа. По OWASP, Security Misconfiguration (A05:2021) и Vulnerable and Outdated Components (A06:2021) входят в десятку критичных рисков — и оба обнаруживаются именно на этапе разведки.
Разбираем три инструмента, которые покрывают ядро активной разведки: Nmap (порты и сервисы), Gobuster (директории и поддомены), Wappalyzer (стек технологий). Каждый — с конкретными командами, интерпретацией вывода и разбором ограничений.
Перед тем как запускать что-либо — убедитесь, что окружение готово.
Минимальные требования:
- ОС: Kali Linux 2024.x+ или Parrot OS (Nmap, Gobuster предустановлены). На Ubuntu/Debian — ставить через apt
- RAM: 4 ГБ минимум, 8 ГБ рекомендуется (Gobuster с большим словарём на 4 ГБ ощутимо подтормаживает)
- Сеть: стабильное подключение к целевой сети (VPN для HTB/THM, локалка для лабораторного стенда)
- Дисковое пространство: ~500 МБ для wordlist-файлов SecLists
Установка инструментов (если не предустановлены):
- Nmap: sudo apt install nmap — версия из репозитория (проверьте nmap --version; для актуальной — сборка с nmap.org)
- Gobuster: sudo apt install gobuster или бинарь с GitHub (версия 3.6+)
- Wappalyzer: браузерное расширение для Chrome/Firefox (публичный CLI через npm больше не поддерживается — проект ушёл в коммерческий SaaS). Для CLI берите WhatWeb или httpx
- Словари: sudo apt install seclists — обязательная зависимость для Gobuster
Легальность: все описанные техники применяются только на собственных стендах, CTF-площадках (HackTheBox, TryHackMe) или в рамках согласованного пентеста с письменным разрешением. Сканирование чужих ресурсов без авторизации — уголовное преступление.
Nmap — отправная точка любой разведки веб-приложения. Задача: определить открытые порты, идентифицировать сервисы и их версии, получить первичный fingerprint ОС. По MITRE ATT&CK это Scanning IP Blocks (T1595.001) — базовый элемент энумерации. Первое, что запускаешь на новом таске. Даже до того, как открыл браузер.
[Применимо: внешний и внутренний пентест, любая инфраструктура]
Работает если: цель доступна по сети, между вами нет stateful firewall, блокирующего SYN-пакеты. Не работает если: цель за CDN (Cloudflare, Akamai) — увидите IP CDN-провайдера, не origin-сервера; порты фильтруются IPS с rate-limiting.
Стартовая команда для веб-таска: nmap -sC -sV -p- -T4 <target_ip>. Разберём флаги: -sC запускает дефолтные NSE-скрипты (категория default), -sV определяет версии сервисов, -p- сканирует все 65535 портов (критично — без этого флага Nmap проверяет только топ-1000), -T4 задаёт агрессивный тайминг (для CTF нормально, на реальном пентесте берите -T3 или -T2).
$ nmap -sC -sV -p- -T4 10.10.10.245
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.2
80/tcp open http Apache httpd 2.4.41
|_http-title: Site doesn't have a title
|_http-server-header: Apache/2.4.41 (Ubuntu)
443/tcp open ssl/http Apache httpd 2.4.41
| ssl-cert: Subject: commonName=target.htb
8080/tcp open http Werkzeug httpd 2.0.1 (Python 3.8.10)
|_http-title: Flask Debug
Что видим и как читать каждую строку:
Порт 22 (SSH): OpenSSH 8.2p1 на Ubuntu — версия определяет возможные CVE. Конкретно эта версия без критичных RCE, но информация об ОС (Ubuntu) уже полезна для дальнейших этапов.
Порт 80 и 443 (HTTP/HTTPS): Apache 2.4.41 — фиксируем версию. По OWASP A06:2021 (Vulnerable and Outdated Components) может содержать известные уязвимости. Заголовок http-server-header подтверждает версию.
Порт 8080: а вот это — золото. Werkzeug 2.0.1 с Flask Debug. Werkzeug debugger при debug=True без ограничения доступа может дать RCE — PIN-защита консоли иногда предсказуема или вообще отсутствует. На CTF это почти всегда путь к флагу. Без -p- этот порт остался бы невидимым. Именно так мы потеряли четыре часа на том соревновании.
SSL-сертификат на 443: commonName=target.htb — доменное имя. Добавьте его в /etc/hosts (echo "10.10.10.245 target.htb" | sudo tee -a /etc/hosts), иначе виртуальные хосты не отработают.
Для быстрого первичного скана (когда время на CTF поджимает) — двухэтапный подход: сначала nmap -p- --min-rate 5000 <ip> для обнаружения открытых портов, затем nmap -sC -sV -p 22,80,443,8080 <ip> для детальной энумерации только по найденным. Экономит минуты, а на CTF минуты решают.
[Применимо: внешний и внутренний пентест, legacy и modern инфраструктура]
NSE (Nmap Scripting Engine) — серьёзное расширение для веб-разведки. По MITRE ATT&CK это уже Vulnerability Scanning (T1595.002): скрипты не просто сканируют порты, а выполняют активную энумерацию.
Ключевые NSE-скрипты для веб-разведки (запускаются через --script):
http-enum — перебор стандартных директорий и файлов (robots.txt, .git, admin-панели). Команда: nmap --script http-enum -p 80 <ip>. Встроенный словарь менее полный, чем SecLists, но для первого прохода — за глаза.http-headers — вывод HTTP-заголовков ответа. Часто раскрывает серверное ПО, X-Powered-By (версия PHP, ASP.NET), нестандартные заголовки.http-methods — проверяет разрешённые HTTP-методы (PUT, DELETE, TRACE). Метод PUT на загрузку файлов = потенциальный RCE.ssl-enum-ciphers — перечисляет поддерживаемые SSL/TLS шифры. Слабые шифры — находка для отчёта, но редко дают прямую эксплуатацию на CTF.http-title — заголовок HTML-страницы. Мелочь, но на CTF часто содержит подсказку.vulners — проверяет найденные версии сервисов по базе Vulners. Команда: nmap -sV --script vulners -p 80,443 <ip>.Комбинированный запуск: nmap --script "http-enum,http-headers,http-methods" -p 80,443,8080 <ip>.
-T4, -T5) блокируется. На CTF — редкость, на реальном пентесте — норма. Решение: снижайте скорость (-T2, --max-rate 100).filtered, без информации о сервисе. Nmap не может отличить закрытый порт от отфильтрованного, если firewall молча дропает пакеты.-6.После Nmap вы знаете, какие порты открыты и какие веб-серверы работают. Следующий шаг — поиск скрытых директорий и файлов, которые не отображаются в навигации сайта. По MITRE ATT&CK это Wordlist Scanning (T1595.003).
[Применимо: внешний и внутренний пентест, любая инфраструктура с HTTP/HTTPS]
Работает если: веб-сервер отвечает разными HTTP-кодами для существующих и несуществующих путей (200 vs 404). Не работает если: сервер возвращает 200 на все запросы (custom 404-страница с кодом 200); WAF блокирует по rate или паттерну User-Agent.
Gobuster сканирование директорий — ключевой этап энумерации веб-приложений. Базовая команда: gobuster dir -u http://target.htb -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt -t 50.
Разбор флагов: dir — режим перебора директорий, -u — URL цели, -w — путь к словарю, -t 50 — количество потоков (50 — агрессивно для CTF, на пентесте снижайте до 10-20).
$ gobuster dir -u http://target.htb -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt -t 50 -x php,txt,bak
/admin (Status: 301) [Size: 312]
/uploads (Status: 301) [Size: 314]
/config.php.bak (Status: 200) [Size: 1247]
/api (Status: 301) [Size: 310]
/.git (Status: 301) [Size: 311]
/robots.txt (Status: 200) [Size: 87]
/server-status (Status: 403) [Size: 277]
Интерпретация результатов:
/admin (301 redirect) — административная панель. Переходим, смотрим форму входа, пробуем дефолтные креды./config.php.bak (200) — бэкап конфигурационного файла. Почти наверняка содержит credentials к БД. На CTF это часто флаг или путь к нему. Флаг -x php,txt,bak тут критичен — без указания расширений Gobuster ищет только директории, и этот файл остался бы невидимым./.git (301) — открытый Git-репозиторий. Качайте через git-dumper (pip install git-dumper), потом git log для просмотра истории коммитов с возможными секретами. Я на HackTheBox так находил захардкоженные пароли в удалённых коммитах — разработчики думают, что git rm стирает историю. Нет./api (301) — API-эндпоинт. Дальше — энумерация методов через Burp Suite или ffuf.Выбор словаря — момент, на котором многие спотыкаются. SecLists содержит десятки словарей разного размера. Рабочая стратегия:
raft-small-directories.txt (~20k записей, ~30 секунд)raft-medium-directories.txt (~30k записей, ~1-2 минуты)directory-list-2.3-big.txt (~220k записей, ~10 минут)На CTF обычно хватает raft-medium. Для bug bounty — берите big или создавайте кастомный словарь под конкретную CMS.
Дополнительные полезные флаги: -b 404,403 исключает определённые коды из вывода, --no-error подавляет ошибки соединения, -k игнорирует ошибки SSL-сертификата (самоподписанные сертификаты на CTF — норма).
[Применимо: внешний пентест, CTF с настроенным DNS]
По MITRE ATT&CK перебор поддоменов — DNS (T1590.002). Gobuster поддерживает режим dns: gobuster dns -d target.htb -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -t 50.
Альтернативный подход для CTF, где DNS не настроен: режим vhost для перебора виртуальных хостов: gobuster vhost -u http://target.htb -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt --append-domain. Этот режим отправляет HTTP-запросы с разными значениями заголовка Host и сравнивает ответы. Найденные vhost-ы добавляйте в /etc/hosts.
Смежный инструмент — ffuf. Он быстрее Gobuster на больших словарях и гибче в фильтрации. Команда: ffuf -u http://FUZZ.target.htb -w subdomains.txt -fs 0 (флаг -fs 0 фильтрует пустые ответы). Для пассивного перебора поддоменов полезны subfinder и amass — они работают через API различных источников (Certificate Transparency, DNS-агрегаторы), не взаимодействуя с целью напрямую.
-t 5), добавляйте задержку, меняйте User-Agent через --useragent.--fs), по количеству слов (--fw) или по строке (--exclude-length). В ffuf фильтрация гибче — и на SPA-приложениях я обычно сразу переключаюсь на него.-k.Определение технологий сайта — то, что связывает результаты сканирования портов с выбором вектора атаки. По MITRE ATT&CK это Software (T1592.002): сбор информации о программном обеспечении цели.
[Применимо: внешний и внутренний пентест, любой веб-стек]
Работает если: целевой сайт загружается в браузере и содержит характерные маркеры технологий (мета-теги, cookies, заголовки, паттерны в HTML/JS). Не работает если: приложение полностью кастомное без популярных фреймворков; SPA с обфусцированным JS; сервер за reverse proxy, скрывающим все заголовки.
Wappalyzer определение технологий сайта работает по набору сигнатур: анализирует HTTP-заголовки, HTML-разметку, JavaScript-переменные, cookies, мета-теги. На выходе — карта стека: CMS, фреймворк, язык, веб-сервер, CDN, аналитика, JS-библиотеки.
Открываете целевой сайт в браузере с расширением Wappalyzer — видите: WordPress 6.2, PHP 8.1, MySQL, Nginx 1.18, jQuery 3.6.0, Yoast SEO. Что это даёт:
wpscan --url http://target.htb -e vp,vt,u — энумерация уязвимых плагинов (vp), тем (vt) и пользователей (u). Плагины — самое вкусное, в них дыры находят регулярно.CLI-альтернатива: WhatWeb — консольный аналог для работы без GUI. Команда: whatweb -a 3 http://target.htb (уровень агрессивности 3 — активные проверки). WhatWeb показывает аналогичную информацию: серверное ПО, CMS, фреймворки, email-адреса, IP-адреса.
Связка с Nmap: данные Wappalyzer дополняют то, что показал Nmap через -sV. Nmap определяет версию веб-сервера по баннеру; Wappalyzer видит прикладной уровень — CMS, фреймворки, frontend-библиотеки. Вместе они дают полную картину стека.
source maps (если доступны), package.json (если .git открыт — а он открыт чаще, чем хотелось бы).curl -I и NSE-скрипты Nmap.Три инструмента работают последовательно, и каждый этап определяет параметры следующего. Вот workflow, который я использую на каждом веб-таске:
Шаг 1 — Nmap (5-10 минут). Полное сканирование портов: nmap -sC -sV -p- -T4 <ip>. Фиксируем: открытые порты, версии сервисов, доменные имена из SSL-сертификатов. Домены — сразу в /etc/hosts.
Шаг 2 — Wappalyzer/WhatWeb (2-3 минуты). Открываем каждый обнаруженный HTTP-сервис в браузере с Wappalyzer. Параллельно whatweb -a 3 по каждому URL. Фиксируем: CMS, фреймворки, версии, JS-библиотеки.
Шаг 3 — Gobuster (5-15 минут). На основе определённого стека выбираем словарь и расширения. WordPress? Добавляем -x php. Java/Tomcat? -x jsp,xml. Python/Flask? -x py,json. Запускаем по каждому найденному веб-порту.
Шаг 4 — Углублённая энумерация. Найденные эндпоинты (admin-панели, API, .git, backup-файлы) передаём в Burp Suite для ручного анализа. Здесь разведка заканчивается и начинается эксплуатация.
На CTF шаги 1-3 запускаются параллельно. Пока Nmap сканирует все порты — вы уже работаете с портом 80 через Gobuster. Экономия времени — решающий фактор в соревнованиях. Не сидите и не смотрите на прогресс-бар Nmap — он справится без вас.
Сводный чеклист по сбору информации о веб-приложении. Каждый пункт — конкретное действие с конкретным инструментом.
Пассивная разведка (OSINT перед атакой на веб-сайт):
1. WHOIS и DNS-записи: whois target.com, dig target.com ANY
2. Google Dorks: site:target.com filetype:pdf, site:target.com inurl:admin
3. Certificate Transparency: crt.sh — поиск поддоменов через сертификаты
4. Веб-архив: web.archive.org — старые версии страниц, удалённые эндпоинты
5. Shodan/Censys: поиск IP по домену, открытые порты и баннеры
Активная разведка — сканирование портов (Nmap):
6. Полное сканирование TCP: nmap -sC -sV -p- -T4 <ip>
7. UDP-порты (топ-100): nmap -sU --top-ports 100 <ip>
8. NSE-скрипты: nmap --script http-enum,http-headers,http-methods -p 80,443 <ip>
9. Добавление доменных имён из SSL в /etc/hosts
Активная разведка — определение стека (Wappalyzer):
10. Браузерное расширение по каждому HTTP-порту
11. CLI-верификация: whatweb -a 3 <url>
12. Фиксация CMS, фреймворков, версий серверного ПО
Активная разведка — поиск скрытых директорий и файлов (Gobuster):
13. Перебор директорий с расширениями: gobuster dir -u <url> -w <wordlist> -x php,txt,bak,old,zip -t 50
14. Проверка виртуальных хостов: gobuster vhost -u <url> -w <subdomains_wordlist> --append-domain
15. Поиск backup-файлов: gobuster dir -u <url> -w <wordlist> -x bak,old,zip,tar.gz,sql
Финализация: 16. Составление карты приложения: все найденные порты, сервисы, директории, эндпоинты, технологии 17. Приоритизация целей: debug-эндпоинты, backup-файлы, .git-директории, устаревшие компоненты — в первую очередь 18. Передача данных в Burp Suite для ручного тестирования
| Критерий | Nmap | Gobuster | ffuf | Wappalyzer | WhatWeb |
|---|---|---|---|---|---|
| Основная задача | Порты и сервисы | Директории/поддомены | Директории/параметры/поддомены | Стек технологий (GUI) | Стек технологий (CLI) |
| Скорость на CTF | Средняя (полный скан ~3-5 мин) | Высокая (~1-2 мин) | Очень высокая | Мгновенно | Быстро |
| Гибкость фильтрации | Через NSE-скрипты | Базовая (по коду, размеру) | Продвинутая (код, размер, слова, regex) | Нет | Частичная |
| Работа через CDN | Нет (видит CDN-узел) | Да (HTTP-уровень) | Да (HTTP-уровень) | Да | Да |
| Обход WAF rate-limiting | Через настройку тайминга | Через снижение потоков | Через -rate |
Не применимо | Через -w (wait) |
| Лучший сценарий | Первый шаг — карта портов | Поиск скрытых путей при известном стеке | Фаззинг параметров и сложная фильтрация | Быстрая идентификация CMS | Автоматизация в скриптах |
| Когда НЕ использовать | CDN без обхода, stealth-пентест с T4 | Custom 404 с кодом 200 | Простые задачи (overkill) | Кастомные приложения | Когда нужна глубина Wappalyzer |
За время участия в CTF и работы на площадках HackTheBox и TryHackMe — пять ошибок, которые стабильно стоят командам часов времени. Каждую из них я совершал сам, так что без морализаторства.
Ошибка 1: сканирование только топ-1000 портов. Дефолтный nmap <ip> без -p- проверяет 1000 самых распространённых портов. Веб-сервисы на нестандартных портах (3000, 5000, 8000, 8080, 8443, 9090) — классика CTF-тасков. Всегда -p-. Без исключений.
Ошибка 2: игнорирование расширений в Gobuster. Запуск gobuster dir без -x ищет только директории. Файлы config.php.bak, database.sql, flag.txt — не найдёте. Определите стек через Wappalyzer, добавьте соответствующие расширения.
Ошибка 3: один словарь на все случаи. common.txt из DirBuster — устаревший и маленький. Используйте SecLists: raft-medium-directories.txt для директорий, raft-medium-files.txt для файлов. Для специфичных CMS — специализированные словари (SecLists/Discovery/Web-Content/CMS/).
Ошибка 4: пропуск виртуальных хостов. На одном IP может висеть несколько виртуальных хостов. Если Nmap показал домен в SSL-сертификате — проверьте vhost-ы через gobuster vhost. На CTF часто прячут отдельное приложение на поддомене (dev.target.htb, staging.target.htb). Один раз я нашёл staging с отключённой аутентификацией — таск решился за пять минут.
Ошибка 5: разведка без записи результатов. Через час вы не вспомните, какие директории были на порту 8080. Сохраняйте вывод каждой команды: nmap ... -oN nmap_full.txt, gobuster ... | tee gobuster_80.txt. Или используйте CherryTree/Obsidian для структурирования заметок.
Формула на бумаге понятна, но по-настоящему эти ошибки осознаются только когда сам тратишь время впустую на таске. Готовый стенд для отработки web-разведки есть на HackerLab.pro — российская CTF-платформа экосистемы Codeby с категориями web, recon, OSINT и другими. Нужна регистрация, после неё доступны задачи всех уровней.
Разведка веб-приложения перед атакой — этап, который определяет всё остальное. За последний год я разбирал десятки writeup-ов с CTF, и в подавляющем большинстве случаев корневая причина провала — не отсутствие знания эксплойта, а пропущенный элемент на этапе разведки. Непросканированный порт, незамеченный backup-файл, проигнорированный поддомен. Инструменты — Nmap, Gobuster, Wappalyzer — это не rocket science. Команды простые, вывод читаемый. Проблема в дисциплине: люди видят порт 80, открывают браузер и сразу начинают тыкать SQLi в форму логина, пропуская всё остальное.
Мой подход: не трогать ни одну форму, пока полный скан портов не завершён, стек не определён, и директории не перебраны хотя бы средним словарём. На CTF это контринтуитивно — время давит, хочется сразу ковырять. Но именно эта дисциплина даёт стабильный результат. Через год вы будете решать таски не быстрее, а стабильнее, и это важнее. Если идёте к OSCP и нужна подготовка по веб-части — WAPT покрывает это в первой трети курса, с лабами на каждый этап разведки.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...