Как запутать сканеры уязвимостей с помощью Krawl

16 авг 2026
740
74
5
3 недели

Если открыть логи любого публичного веб-сервера, там почти наверняка будет сплошной поток мусора: бесконечные поиски /wp-login.php, /.env, /.git/HEAD или старых версий phpMyAdmin. Сканеры и парсеры ищут легкую добычу сутками напролет. Обычно мы просто закрываем к ним доступ через NGINX или режем их правилами WAF. Но есть другой подход: не отбиваться, а накормить автоматику противника отборной дезинформацией, попутно потратив ресурсы атакующего.

Недавно наткнулся на проект Krawl. Это специализированный deception-сервер, который притворяется уязвимым веб-приложением, подсовывает ботам бесконечные страницы-ловушки и даже умеет на лету собирать правдоподобный HTML через языковые модели.

Krawl logo

Что умеет эта ловушка

Основная задача Krawl простая: выглядеть привлекательно для автоматических сканеров, регистрировать их поведение и затягивать в тупик.

Вот что он использует внутри:

Реклама
  • Бесконечные ссылки-паутины (Spider Traps). Проект генерирует страницы со случайными ссылками друг на друга, заставляя парсеры ходить по кругу и тратить трафик.
  • Фейковые админки и файлы конфигураций. Krawl отвечает на запросы к популярным путям вроде WordPress, phpMyAdmin или панелей авторизации, собирая вводимые пароли.
  • Генерация страниц через нейросети. Если сканер стучится по неизвестному адресу, Krawl может запросить OpenRouter или OpenAI, чтобы быстро нарисовать контекстный HTML с уязвимостью.
  • Ловушки в robots.txt. Сервер объявляет запрещенные пути, которые боты сразу же начинают проверять первыми, выдавая свои намерения.

Deception page

Помимо этого, сервер умеет подмешивать canary-токены от CanaryTokens. Если атакующий попытается применить найденный фейковый API-ключ во внешней системе, вы тут же получите уведомление.

Как Krawl считает репутацию адресов

Ловить ботов мало, нужно понимать, кто именно стучится в дверь. Krawl в фоновом режиме анализирует активность каждого входящего IP-адреса по нескольким критериям.

IP reputation scoring

Система оценивает частоту рискованных 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) и паролем.

GeoIP Dashboard

Внутри видно географию атак, раскладку по типам пейлоадов и подробное досье на каждый подозрительный адрес с историей запросов и таймлайном.

Attack types

IP Insight

Два режима работы

Разработчики сделали две конфигурации:

  1. Standalone. Работает в один контейнер, данные держит в SQLite в режиме WAL, кэш хранит прямо в памяти Python-процесса. Хороший вариант для пет-проектов и небольших VPS, где поток трафика не превышает несколько сотен тысяч запросов.
  2. Scalable. Тут уже подключаются PostgreSQL и Redis. Этот режим нужен, когда вы хотите горизонтально масштабировать инстансы Krawl за балансировщиком или деплоите проект в Kubernetes через официальный Helm-чарт.

Use case architecture

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

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.