Привет, Хабр!

В прошлой статье я рассказывал, что с недавнего времени я развлекаюсь в мире 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 так, чтобы он был параноиком.

Мой сервер принимает на себя такие удары почти ежедневно. Для меня это отличный бесплатный полигон: я держу оборону, бережно складирую логи и вживую препарирую логику этих автоматизированных ребят. И хотя по своей сути фаззинг-атаки во многом похожи, дьявол всегда кроется в деталях — в векторах, в мутациях словарей и в попытках изящно обойти рейт-лимиты. У меня в логах скапливается немало интересных паттернов активности подобных автоматизированных "гостей". Если Хабру зайдет такой формат ковыряния во взломах — маякните, и если найду время постараюсь выкатить разборы и по другим типам атак.

А пока — какие самые экзотические или смешные пути вы находили в логах от ботнетов на ваши серверы? Делитесь в комментариях.