Пентест веба с нуля: разведка, которую ты делаешь неправильно
«Большинство пентестеров начинают с Nmap. Большинство пентестеров пропускают половину поверхности атаки.» 💀
Разведка — это не nmap -sV target.com и бежать дальше. Это 40–60% всего энгейджмента. Если ты делаешь её плохо — ты просто красиво пропускаешь баги мимо рта.
🗺️ Этап 1: Пассивная разведка (не трогай цель руками)
Прежде чем слать хоть один пакет — собери всё, что лежит в открытом доступе. WAF не видит, логи молчат, ты в плюсе.
Домены и субдомены:
# Passive subdomain enum
subfinder -d target.com -silent -o subs.txt
amass enum -passive -d target.com -o amass_subs.txt
cat subs.txt amass_subs.txt | sort -u > all_subs.txt
Исторические данные и забытые эндпоинты:
# Wayback Machine — кладбище старых endpoint'ов
waybackurls target.com | tee wayback.txt
gau target.com --threads 5 | tee gau.txt
cat wayback.txt gau.txt | sort -u | grep -E "\.(php|asp|aspx|jsp|json|xml|bak|old|zip)"
💡 Лайфхак: Ищи .bak, .old, .zip — разработчики обожают оставлять бэкапы прямо на проде. Это не баг, это традиция.
Google Dorks — твой лучший друг:
site:target.com ext:php inurl:admin
site:target.com inurl:api/v1
site:target.com filetype:env
site:target.com "index of /"
inurl:target.com intext:"sql syntax"
🔍 Этап 2: Активная разведка (теперь можно шуметь)
DNS — там всегда что-то интересное:
# Zone transfer (да, в 2026 это ещё работает на некоторых серверах)
dig axfr @ns1.target.com target.com
# Брутфорс субдоменов
ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt \
-u "https://FUZZ.target.com" -mc 200,301,302,403
# Проверяем живые хосты
cat all_subs.txt | httpx -silent -status-code -title -tech-detect
Fingerprinting — знай, с чем работаешь:
whatweb -a 3 https://target.com
wappalyzer-cli https://target.com
🔥 Эй, ты забыл про заголовки! curl -I https://target.com — смотри на Server, X-Powered-By, X-AspNet-Version. Это бесплатная инфа о стеке.
💻 Этап 3: Chrome DevTools — то, что сканер не найдёт никогда
Вот где большинство пентестеров реально косячат. Открыл Burp, запустил Spider — думаешь, всё собрал? Нет, бро. 😎
Алгоритм работы в DevTools:
- Открой
F12 → Network → Fetch/XHR - Поставь фильтр Fetch — это все API-вызовы приложения
- Кликай по всем функциям приложения: логин, профиль, поиск, оплата
- Смотри на запросы — там живут эндпоинты, которые не задокументированы
Что искать в DevTools:
→ Параметры с ID пользователя (IDOR waiting room)
→ Токены в URL-параметрах (не в заголовках — плохой знак)
→ Внутренние API: /api/internal/, /v2/admin/
→ GraphQL endpoint: /graphql, /gql, /api/graphql
→ WebSocket соединения (вкладка WS)
JS-файлы — золотая жила:
# Собираем все JS с сайта
cat wayback.txt | grep "\.js$" | sort -u > js_files.txt
# Ищем захардкоженные секреты
cat js_files.txt | xargs -I{} curl -s {} | \
grep -E "(api_key|apikey|secret|token|password|aws_|firebase)" -i
# Автоматом — SecretFinder
python3 SecretFinder.py -i https://target.com -e
💣 Факт: ~30% реальных Bug Bounty находок — это секреты в JS-файлах. Разработчики пушат токены в frontend и думают, что их никто не читает.
🕵️ Этап 4: Инфраструктурная разведка
Находим реальный IP за CDN/Cloudflare:
# DNS History
curl "https://securitytrails.com/domain/target.com/history/a"
# Shodan — ищем по SSL cert
shodan search "ssl.cert.subject.cn:target.com" --fields ip_str,port,org
# Censys
censys search "parsed.names: target.com"
Почему это важно? Если найдёшь origin IP — обходишь WAF полностью. Cloudflare стоит перед, а ты идёшь напрямую. WAF — это не стена, это приглашение искать обход. 😈
Открытые порты и сервисы:
# Быстрый скан живых хостов
naabu -l all_subs.txt -top-ports 1000 -silent -o ports.txt
# Детальный скан найденных портов
nmap -sV -sC -p $(cat ports.txt | cut -d: -f2 | tr '\n' ',') target.com
🗂️ Этап 5: Content Discovery — ищем то, что скрыто
# Директории и файлы
ffuf -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt \
-u https://target.com/FUZZ \
-mc 200,201,301,302,401,403 \
-t 50 \
-o ffuf_dirs.txt
# API endpoints — отдельный словарь!
ffuf -w /usr/share/seclists/Discovery/Web-Content/api/objects.txt \
-u https://target.com/api/v1/FUZZ \
-mc 200,201,401,403
# Backup files на найденных страницах
for url in $(cat live_urls.txt); do
ffuf -w backups.txt -u "$url/FUZZ" -mc 200
done
🧠 Нубская ошибка №1: Брутить только / корень. Брути каждый найденный endpoint. /admin нашёл? Брути /admin/FUZZ. Рекурсия — твой друг.
📊 Собираем всё вместе: минимальный чеклист разведки
| Шаг | Инструмент | Что ищем |
|---|---|---|
| Passive subdomain enum | subfinder, amass | Все субдомены |
| Historical URLs | waybackurls, gau | Старые/забытые endpoints |
| JS analysis | SecretFinder, grep | Токены, API keys, внутренние URL |
| Fingerprinting | httpx, whatweb | Стек, версии, заголовки |
| Origin IP | Shodan, Censys | Обход WAF/CDN |
| Content discovery | ffuf + правильные wordlists | Скрытые директории, API |
| DevTools manual | Chrome/Firefox | Undocumented API calls |
⚡ Автоматизация: один скрипт — полная разведка
#!/bin/bash
TARGET=$1
echo "[*] Starting recon for $TARGET"
# Субдомены
subfinder -d $TARGET -silent | httpx -silent -o live_subs.txt
echo "[+] Live subs: $(wc -l live_subs.txt)"
# Исторические URL
waybackurls $TARGET | sort -u > wayback.txt
gau $TARGET >> wayback.txt
echo "[+] Historical URLs: $(wc -l wayback.txt)"
# JS секреты
cat wayback.txt | grep "\.js$" > js_files.txt
python3 SecretFinder.py -i js_files.txt -o secrets.txt
echo "[+] Check secrets.txt"
# Директории
ffuf -w ~/wordlists/raft-medium.txt -u "https://$TARGET/FUZZ" \
-mc 200,301,401,403 -o dirs.txt -of json -t 40
echo "[*] Recon done. Check results."
🚨 Топ-5 ошибок разведки (которые ты точно делаешь)
- Запускаешь Nmap первым — шумишь, палишься, пропускаешь пассивную фазу
- Используешь дефолтные wordlists —
common.txtна 5000 строк это мусор, используй SecLists - Забываешь про мобильное API —
/api/mobile/v1/живёт отдельно и часто без аутентификации - Не смотришь JS-файлы — там половина твоих находок
- Останавливаешься на 403 —
403 ≠ нет доступа, это403 = попробуй по-другому🔑
Итог: Разведка — это не инструмент, это мышление. Burp Suite без понимания что искать — просто дорогой прокси. Думай как разраб, который торопился в пятницу и забыл удалить /test/admin_old/. Он всегда где-то есть. 💀
Похожие статьи

GraphQL: интроспекция включена, безопасность — нет

BOLA/IDOR в REST API: итерируй всё подряд и молчи
