Привет, Хабр!
В прошлой статье я рассказывал, что с недавнего времени я развлекаюсь в мире highload тем что создаю для себя и своих близких мессенджер (Plumb). И несмотря на то, что клиент для него собран практически из цифровой изоленты, которую хорошенько искупали в бочонке с красками — он на удивление стабильно работает (и мессаджинг, и звонки) даже в текущих непростых реалиях.
В той статье я предложил Хабру попытаться сломать сервер моего мессенджера. Было потно, но мы выстояли. Спасибо всем, кто участвовал!
Но сегодня я хочу поговорить о другом. На примере одной реальной массированной автоматизированной атаки на мой сервер хочу показать как боты и специализированное ПО пытаются атаковать ваши веб-приложения и серверы в 2026 году. Эта реальная атака - идеальный, хрестоматийный пример того, как именно сегодня сканируют современную инфраструктуру. Никакой магии, только голые логи, разбор векторов и механика защиты. Поехали.
Профиль атакующего: кто и чем бил

Тип атаки: Атака была фаззинг (англ. fuzzing) типа, а именно автоматизированное сканирование на предмет уязвимостей. Атака развивалась по классической параболе: резкий старт с 100 запросов в секунду, упирание в лимиты, подключение второго IP-адреса из той же подсети и долгое затухание (перебор мусорных путей).
IP-адреса:
185.x.x.52и185.x.x.38.
IP-Адреса частично скрыты так как я уважаю приватность тех кто согласился поучаствовать в моем эксперименте.Инструмент: Судя по паттернам, это сканер Nuclei с огромной кастомной базой темплейтов, либо связка ffuf/gobuster с гигантским словарем (wordlist), собранным путем автоматического парсинга всего GitHub. User-Agent дефолтный —
curl/8.7.1.Объем: 20 000+ запросов сканирования за 5 минут. Бот сразу уперся в наши глобальные Nginx IP-лимиты. fail2ban я осознанно не включал, чтобы все-таки дать шанс ботам проверить на прочность мой сервер.
Динамика: Атакующие боты начали с базовых
.envиphpinfo, перешли к поиску тестовых фикстур из npm-пакетов, затем попытались пробить RCE и LFI, под конец от отчаяния начали флудить POST-запросами и искать файлы вида.env.bak.1.
Ниже — 12 реальных векторов из моих логов, которые показывают, что именно ищут атакующие боты в 2026 году.
Вектор 1: Классическая охота за окружением
Что ищут: Переменные окружения.
{"time_local":"16/Mar/2026:17:19:51 +0000","remote_addr":"185.x.x.52","request_method":"GET","request_uri":"/.env.staging","status":"404","body_bytes_sent":"53","http_user_agent":"curl/8.7.1"}
База любого сканирования. Ищут десятки вариаций: .env.local, .env.production, /api/.env, /k8s/.env. Цель — получить ключи от баз данных, AWS и JWT-секреты.
Вектор 2: Разведка через отладочные скрипты
Что ищут: Информацию о сервере (версии ПО, пути).
{"time_local":"16/Mar/2026:17:19:51 +0000","remote_addr":"185.x.x.52","request_method":"GET","request_uri":"/admin/admin_phpinfo.php4","status":"404","body_bytes_sent":"153","http_user_agent":"curl/8.7.1"}
Проверяются все мыслимые названия файлов отладки: phpinfo.php, pi.php, _profiler. Знание абсолютных путей сервера (DOCUMENT_ROOT) критически важно для дальнейших атак (LFI/RFI).
Вектор 3: Атака на конкретные отладочные панели (Yii2 / Laravel)
Что ищут: Оставленные в production панели дебага.
{"time_local":"16/Mar/2026:17:20:12 +0000","remote_addr":"185.x.x.52","request_method":"GET","request_uri":"/debug/default/view?panel=config","status":"404","body_bytes_sent":"19","http_user_agent":"curl/8.7.1"}
Это уже умный поиск. Запрос направлен в панель фреймворка Yii2 с попыткой сразу открыть вкладку конфигурации, которая выведет на экран все пароли в plain-text.
Вектор 4: «Археология GitHub» — Учебные туториалы
Что ищут: Ошибки джунов при деплое.
{"time_local":"16/Mar/2026:17:20:25 +0000","remote_addr":"185.x.x.52","request_method":"GET","request_uri":"/07-accessing-data/begin/vue-heroes/.env","status":"404","body_bytes_sent":"153","http_user_agent":"curl/8.7.1"}
Бот надеется, что разработчик скопировал себе на боевой сервер код из публичного обучающего курса (в данном случае по Vue.js) и оставил там ключи.
Вектор 5: «Археология GitHub» — Тестовые фикстуры библиотек
Что ищут: Чужие секреты в node_modules или vendor.
{"time_local":"16/Mar/2026:17:20:30 +0000","remote_addr":"185.x.x.52","request_method":"GET","request_uri":"/babel-plugin-dotenv/test/fixtures/dev-env/.env","status":"404","body_bytes_sent":"153","http_user_agent":"curl/8.7.1"}
Один из самых неочевидных паттернов. Бот берет пути из исходников популярных NPM-пакетов в надежде, что вы залили на сервер исходники вместе с папками тестов.
Вектор 6: Активная эксплуатация LFI (Local File Inclusion) в Grafana
Что ищут: Чтение локальных файлов сервера.
{"time_local":"16/Mar/2026:17:19:50 +0000","remote_addr":"185.x.x.52","request_method":"GET","request_uri":"/login?redirectTo=%2Fpms%3Fmodule%3Dlogging%26file_name%3D..%2F..%2F..%2F..%2F..%2F..%2F~%2F.aws%2Fcredentials","status":"429","body_bytes_sent":"169","http_user_agent":"curl/8.7.1"}
Здесь бот пытается использовать параметр redirectTo на странице логина моей Графаны. Он скармливает туда URL-encoded payload ../../../../../../~/.aws/credentials, пытаясь заставить Grafana прочитать ключи AWS.
Вектор 7: Попытка Remote Code Execution (RCE)
Что ищут: Выполнение произвольного кода.
{"time_local":"16/Mar/2026:17:19:50 +0000","remote_addr":"185.x.x.52","request_method":"GET","request_uri":"/admin/config?cmd=cat%20/root/.aws/credentials","status":"404","body_bytes_sent":"153","http_user_agent":"curl/8.7.1"}
Прощупывание типичной Command Injection. Бот надеется, что скрипт по этому пути принимает GET-параметр cmd и прокидывает его в системный eval() или system().
Вектор 8: Поиск ключей от инфраструктуры (SSH)
Что ищут: Полный контроль над сервером.
{"time_local":"16/Mar/2026:17:20:45 +0000","remote_addr":"185.x.x.52","request_method":"GET","request_uri":"/.ssh/id_rsa","status":"404","body_bytes_sent":"19","http_user_agent":"curl/8.7.1"}
Без комментариев. Если этот файл ssh-ключей доступен из веба — игра окончена.
Вектор 9: Атака на CI/CD и Cloud-сервисы
Что ищут: Токены деплоя и рассылок.
{"time_local":"16/Mar/2026:17:20:55 +0000","remote_addr":"185.x.x.52","request_method":"GET","request_uri":"/.gitlab-ci.yml","status":"404","body_bytes_sent":"153","http_user_agent":"curl/8.7.1"}
В логах были массовые попытки найти конфигурации GitLab CI, Travis, CircleCI, а также токены sendgrid.env и firebase.json.
Вектор 10: Охота за Frontend-артефактами (Source Maps)
Что ищут: Исходный код фронтенда и зашитые ключи API.
{"time_local":"16/Mar/2026:17:21:10 +0000","remote_addr":"185.x.x.52","request_method":"GET","request_uri":"/_next/static/chunks/app/error.js","status":"404","body_bytes_sent":"53","http_user_agent":"curl/8.7.1"}
Сканер пытается нащупать артефакты сборки Next.js, Vite или Nuxt. Наличие таких файлов позволяет слить source-maps и изучить логику API-вызовов клиента.
Вектор 11: Эскалация. Переход на POST-флуд
Что ищут: Уязвимости загрузки файлов (File Upload Bypass).
{"time_local":"16/Mar/2026:17:22:05 +0000","remote_addr":"185.x.x.38","request_method":"POST","request_uri":"/api/files/upload","status":"405","body_bytes_sent":"153","http_user_agent":"curl/8.7.1"}
Когда GET-запросы не дали результата, бот начал слать POST-запросы на эндпоинты типа /upload, /api/media, /webhook. Цель — залить PHP-шелл.
Вектор 12: Агония и мусорные пути
Что ищут: Хоть что-нибудь.
{"time_local":"16/Mar/2026:17:22:20 +0000","remote_addr":"185.x.x.38","request_method":"GET","request_uri":"/config.json.bak.1","status":"404","body_bytes_sent":"19","http_user_agent":"curl/8.7.1"}
Конец атаки. В ход идут максимально маловероятные комбинации, сгенерированные мутациями словаря.
Как защищаться: простые, но рабочие советы
Несмотря на 20 000+ запросов, мой сервер не лег, а злоумышленник не получил ни байта полезной информации. Почему? Из-за трех базовых настроек Nginx.
1. Rate Limiting — ваш лучший друг (статус 429)
Попытки LFI в Grafana разбились о простейшую директиву: limit_req zone=grafana_login_ip burst=5 nodelay; Бот получил 429 Too Many Requests. Это экономит процессорное время вашего Application-сервера и отбивает желание сканировать дальше. Навешивайте limit_req на все формы логина и тяжелые API.
2. Жесткий роутинг методов (статус 405)
Посмотрите на Вектор 11. На попытку сделать POST-запрос сервер вернул 405 Method Not Allowed. Если ваш эндпоинт не должен принимать POST, явно запретите это на уровне Nginx, чтобы запрос даже не доходил до Node.js/PHP.
3. Иллюзия успеха (Троллинг статусом 200 OK)
Это самая веселая часть. В логах я видел сотни вот таких "успехов" бота:
{"time_local":"16/Mar/2026:17:19:51 +0000","remote_addr":"185.x.x.52","request_method":"GET","request_uri":"/config.php","status":"200","body_bytes_sent":"40414","http_user_agent":"curl/8.7.1"}
О боже, он скачал конфигурацию? Нет. Обратите внимание на размер ответа — 40414 байт. У меня настроен Catch-All роутинг для SPA: try_files $uri $uri/ /index.html;. Вместо отдачи 404 ошибки на несуществующие файлы, Nginx отдавал главную страницу моего сайта с кодом 200. Бот пометил эти пути как «уязвимые» и сохранил себе на диск сотни копий моего HTML. Автоматические парсеры сходят с ума от такого мусора.
4. Ошибка 421 (Misdirected Request)
Многие сканеры используют HTTP/2 мультиплексирование для скорости: открывают одно соединение и шлют в него запросы с разными Host заголовками. Правильно настроенный Nginx с проверкой SNI будет сбрасывать такие запросы со статусом 421, замедляя сканер в десятки раз.
Итог
Защита современного сервера начинается не с WAF за тысячи долларов, а со строгой гигиены и дисциплины. Не деплойте папку .git, не оставляйте тестовые файлы, закрывайте лимитами авторизацию и настройте Nginx так, чтобы он был параноиком.
Мой сервер принимает на себя такие удары почти ежедневно. Для меня это отличный бесплатный полигон: я держу оборону, бережно складирую логи и вживую препарирую логику этих автоматизированных ребят. И хотя по своей сути фаззинг-атаки во многом похожи, дьявол всегда кроется в деталях — в векторах, в мутациях словарей и в попытках изящно обойти рейт-лимиты. У меня в логах скапливается немало интересных паттернов активности подобных автоматизированных "гостей". Если Хабру зайдет такой формат ковыряния во взломах — маякните, и если найду время постараюсь выкатить разборы и по другим типам атак.
А пока — какие самые экзотические или смешные пути вы находили в логах от ботнетов на ваши серверы? Делитесь в комментариях.
