Как запутать сканеры уязвимостей с помощью Krawl
Если открыть логи любого публичного веб-сервера, там почти наверняка будет сплошной поток мусора: бесконечные поиски /wp-login.php, /.env, /.git/HEAD или старых версий phpMyAdmin. Сканеры и парсеры ищут легкую добычу сутками напролет. Обычно мы просто закрываем к ним доступ через NGINX или режем их правилами WAF. Но есть другой подход: не отбиваться, а накормить автоматику противника отборной дезинформацией, попутно потратив ресурсы атакующего.
Недавно наткнулся на проект Krawl. Это специализированный deception-сервер, который притворяется уязвимым веб-приложением, подсовывает ботам бесконечные страницы-ловушки и даже умеет на лету собирать правдоподобный HTML через языковые модели.
Что умеет эта ловушка
Основная задача Krawl простая: выглядеть привлекательно для автоматических сканеров, регистрировать их поведение и затягивать в тупик.
Вот что он использует внутри:
- Бесконечные ссылки-паутины (Spider Traps). Проект генерирует страницы со случайными ссылками друг на друга, заставляя парсеры ходить по кругу и тратить трафик.
- Фейковые админки и файлы конфигураций. Krawl отвечает на запросы к популярным путям вроде WordPress, phpMyAdmin или панелей авторизации, собирая вводимые пароли.
- Генерация страниц через нейросети. Если сканер стучится по неизвестному адресу, Krawl может запросить OpenRouter или OpenAI, чтобы быстро нарисовать контекстный HTML с уязвимостью.
- Ловушки в
robots.txt. Сервер объявляет запрещенные пути, которые боты сразу же начинают проверять первыми, выдавая свои намерения.
Помимо этого, сервер умеет подмешивать canary-токены от CanaryTokens. Если атакующий попытается применить найденный фейковый API-ключ во внешней системе, вы тут же получите уведомление.
Как Krawl считает репутацию адресов
Ловить ботов мало, нужно понимать, кто именно стучится в дверь. Krawl в фоновом режиме анализирует активность каждого входящего IP-адреса по нескольким критериям.
Система оценивает частоту рискованных HTTP-методов, заходы по путям из robots.txt, тайминги запросов и совпадения с сигнатурами SQLi или XSS. На выходе адрес получает метку: атакующий, плохой краулер, белый поисковик или обычный пользователь.
Если включен экспорт, данные можно забирать напрямую через API для ваших сетевых фильтров:
curl "https://krawl.local/<SECRET_PATH>/api/export-ips?categories=attacker&fwtype=iptables"
Эндпоинт отдает готовые правила для iptables, nftables, RouterOS или списков блокировки OPNsense и pfSense.
Панель мониторинга
Для наблюдения за происходящим есть веб-интерфейс. Чтобы боты случайно не нашли админку самого ханипота, она прячется за динамическим секретным путем (KRAWL_DASHBOARD_SECRET_PATH) и паролем.
Внутри видно географию атак, раскладку по типам пейлоадов и подробное досье на каждый подозрительный адрес с историей запросов и таймлайном.
Два режима работы
Разработчики сделали две конфигурации:
- Standalone. Работает в один контейнер, данные держит в SQLite в режиме WAL, кэш хранит прямо в памяти Python-процесса. Хороший вариант для пет-проектов и небольших VPS, где поток трафика не превышает несколько сотен тысяч запросов.
- Scalable. Тут уже подключаются PostgreSQL и Redis. Этот режим нужен, когда вы хотите горизонтально масштабировать инстансы Krawl за балансировщиком или деплоите проект в Kubernetes через официальный Helm-чарт.
Схема использования обычно сводится к размещению Krawl рядом с основным приложением за NGINX или Traefik. Весь подозрительный трафик или запросы к несуществующим системным путям проксируются на ханипот.
Быстрый запуск
Самый простой способ пощупать проект локально — запустить Docker-контейнер в Standalone-режиме:
docker run -d \
-p 5000:5000 \
-e KRAWL_DASHBOARD_SECRET_PATH="/my-secret-dashboard" \
-e KRAWL_DASHBOARD_PASSWORD="admin-secret-password" \
-v krawl-data:/app/data \
--name krawl \
ghcr.io/blessedrebus/krawl:latest
Если планируете настроить генерацию страниц через AI, достаточно добавить переменные окружения в docker-compose.yaml:
services:
krawl:
image: ghcr.io/blessedrebus/krawl:latest
container_name: krawl-server
ports:
- "5000:5000"
environment:
- KRAWL_MODE=standalone
- KRAWL_DASHBOARD_SECRET_PATH=/secret-dashboard
- KRAWL_DASHBOARD_PASSWORD=super-safe-password
- KRAWL_AI_ENABLED=true
- KRAWL_AI_PROVIDER=openrouter
- KRAWL_AI_API_KEY=your_openrouter_key
- KRAWL_AI_MODEL=nvidia/nemotron-3-super-120b-a12b:free
volumes:
- krawl-data:/app/data
restart: unless-stopped
volumes:
krawl-data:
Для чего это пригодится
Krawl вряд ли заменит полноценный WAF на высоконагруженном проекте, но у него другая ниша. Это отличный инструмент для синих команд (Blue Team), хоумлабов и тех, кто хочет изучать реальные паттерны атак на свои сервисы.
Вместо того чтобы вслепую отбрасывать запросы кодом 404, вы превращаете сканирование в ловушку, собираете базу вредоносных IP и скармливаете ее своим файрволам. Начать эксперименты можно с обычного Docker-контейнера на отдельном поддомене или тестовом сервере.
