
Высокоинтерактивный honeypot, имитирующий уязвимое приложение Laravel/Livewire. Перехватывает RCE-эксплойты и веб-шеллы, нацеленные на CVE-2024-47823, CVE-2025-54068 и CVE-2025-14894, а затем анализирует их в изолированных Docker-контейнерах для извлечения индикаторов компрометации (IOCs).
Высокоинтерактивная ловушка (honeypot), маскирующаяся под уязвимое приложение Laravel/Livewire. Она перехватывает попытки эксплуатации известных CVE в Livewire, сохраняет загруженные вредоносные файлы (веб-шеллы) и payload-ы для удалённого выполнения кода (RCE) с дедупликацией по SHA-256, а при желании выполняет их в изолированном Docker-контейнере для извлечения индикаторов компрометации (IOC) — URL, IP-адресов и доменов, с которыми вредонос пытается установить связь.
Система работает как два отдельных процесса в целях безопасности: веб-сервер, который перехватывает payload-ы (без доступа к Docker), и sandbox-воркер, анализирующий их в изолированных контейнерах.
Attacker → Nginx → FastAPI → SQLite ← Sandbox Worker (Docker)
(capture) (polls jobs, writes IOCs)
Фасад — Отдаёт реалистичные страницы входа/регистрации Laravel с Livewire-атрибутами wire:, XSRF-токенами и заголовками X-Powered-By: PHP/8.3.12. Автоматические сканеры видят то, что выглядит как реальное уязвимое приложение.
Перехват — Каждый HTTP-запрос прозрачно логируется в SQLite (IP, заголовки, хеш тела, метка времени) слоем ASGI-промежуточного ПО до того, как происходит какая-либо маршрутизация.
Ловушки — Livewire-эндпоинты принимают загрузку файлов и сообщения компонентов точно так же, как это делал бы настоящий фреймворк. Payload-ы классифицируются (PHP-код, сериализованные объекты, shell-команды) и сохраняются с дедупликацией по SHA-256. Каждый интересный payload создаёт постоянную задачу в очереди sandbox_jobs.
Песочница — Отдельный процесс-воркер опрашивает очередь ожидающих задач и выполняет каждый payload в эфемерном Docker-контейнере (read-only файловая система, без сети, cap_drop=ALL). Shim на основе LD_PRELOAD перехватывает сетевые вызовы libc для логирования попыток связи с C2 (command-and-control). Анализатор извлекает IOC и оценивает потенциальные C2-эндпоинты с помощью эвристик.
| CVE | CVSS | Краткое описание | Эндпоинт-ловушка |
|---|---|---|---|
| CVE-2024-47823 | 9.8 Critical | RCE при загрузке файлов в Livewire через обход MIME-типа. Расширения файлов определяются по MIME-типу, а не проверяются по имени файла, что позволяет загружать .php-файлы, замаскированные под изображения. Затрагивает Livewire < 2.12.7 и < 3.5.2. | POST /livewire/upload-file |
| CVE-2025-54068 | 9.2 Critical | RCE через гидратацию свойств в Livewire. Процесс гидратации не санитизирует типы объектов при обновлении свойств компонента, что позволяет выполнять внедрённые payload-ы на стороне сервера. Затрагивает Livewire 3.0.0-beta.1 — 3.6.3. | POST /livewire/message |
| CVE-2025-14894 | Critical | Неограниченная загрузка файлов с RCE в Filemanager Livewire. Отсутствие проверки типа файла и MIME-типа позволяет неаутентифицированную загрузку исполняемых PHP-файлов. | POST /livewire/upload-file |
Ловушка-перехватчик *.php также захватывает пост-эксплуатационное сканирование распространённых имён веб-шеллов (например, accesson.php, wp-login.php, admin.php).
Предварительные требования: Python 3.11+ и uv.
git clone https://github.com/HelgeSverre/livewire-honeypot.git
cd livewire-honeypot
# Установка зависимостей
uv sync
# Запуск веб-сервера (только перехват, Docker не нужен)
DATA_DIR=./data uv run uvicorn honeypot.main:app --reload --port 8000
# Во втором терминале — запуск sandbox-воркера (требуется Docker)
DATA_DIR=./data uv run python -m honeypot.worker
# Запуск тестов
uv run pytest tests/ -v
Веб-сервер работает автономно — он перехватывает и сохраняет всё даже без запущенного sandbox-воркера. Запускайте воркер, когда хотите автоматический анализ payload-ов.
Примечание: Каталог
src/находится в пути Python черезpyproject.toml(src-layout), поэтомуhoneypot.main:appуказывает наsrc/honeypot/main.py.
Вам понадобится:
Полное развёртывание — это одна команда после создания VPS. Скрипт выполняет все шаги от «пустого дроплета» до «работающего сервиса с TLS»: apt-пакеты, пользователи и группы, Python venv, sandbox-образ, nginx, certbot и правила файрвола.
# 1. Создайте дроплет за $6/мес (Ubuntu 24.04, 1 ГБ RAM достаточно).
# На DigitalOcean:
doctl compute droplet create veritron-honeypot \
--size s-1vcpu-1gb \
--image ubuntu-24-04-x64 \
--region fra1 \
--ssh-keys "$(doctl compute ssh-key list --format ID --no-header | head -1)" \
--wait
# 2. Укажите A-запись вашего домена на IP дроплета.
# Дождитесь разрешения DNS, прежде чем продолжать.
dig +short your-domain.example # должен вернуть IP дроплета
# 3. Скопируйте проект на дроплет.
rsync -az --exclude='.git' --exclude='.venv' --exclude='data' \
./ root@<droplet-ip>:/opt/honeypot/
# 4. Запустите bootstrap-скрипт. Передача домена включает TLS через certbot.
ssh root@<droplet-ip> 'cd /opt/honeypot && [email protected] \
bash deploy/setup.sh your-domain.example'
Всё. Ловушка теперь обслуживает поддельную страницу входа Laravel/Livewire по HTTPS, сохраняет каждый запрос в SQLite и готова анализировать payload-ы в Docker-песочнице.
deploy/setup.sh идемпотентен — повторный запуск безопасен. По порядку он:
honeypot (веб) и sandbox (воркер), а также общую группу honeypot-data.uv sync --python /usr/bin/python3.12. Мы намеренно используем Python, установленный через apt, а не встроенный интерпретатор uv — Python от uv живёт в /root/.local/share/uv/, куда непривилегированный сервисный пользователь не может пройти, и вы получите сбивающий с толку status=203/EXEC от systemd, если позволите uv выбрать интерпретатор./var/honeypot/ с setgid-битом и общим владением группой, чтобы оба сервиса могли читать записи друг друга.ExecStart воркера на использование системного Docker-демона (поставляемый unit предполагает rootless Docker, который сложнее настроить).docker build -t honeypot-sandbox sandbox/).limit_req_zone в /etc/nginx/conf.d/ (она должна быть в блоке http {}, а не в server {}).certbot --nginx, если был передан домен.Если вы хотите выполнить каждый шаг самостоятельно, а не запускать setup.sh, эквивалентная история shell-команд находится в deploy/setup.sh в виде закомментированных этапов.
| Сервис | Пользователь | Назначение | Доступ к Docker |
|---|---|---|---|
honeypot.service | honeypot | Веб-сервер — перехватывает запросы и payload-ы | Нет |
honeypot-worker.service | sandbox | Sandbox-воркер — анализирует payload-ы в Docker | Да |
Оба сервиса используют общий каталог /var/honeypot/ для базы SQLite и хранения payload-ов. Веб-процесс не имеет доступа к Docker-сокету, поэтому даже при компрометации через атакующий трафик он не сможет создавать контейнеры на хосте.
# Просмотр логов
journalctl -u honeypot -f
journalctl -u honeypot-worker -f
# Перезапуск сервисов
systemctl restart honeypot honeypot-worker
# Обновление
cd /opt/honeypot && git pull && uv sync
docker build -t honeypot-sandbox sandbox/
systemctl restart honeypot honeypot-worker
Все настройки управляются через переменные окружения (задаются в unit-файлах systemd или экспортируются перед запуском):
| Переменная | По умолчанию | Описание |
|---|---|---|
DATA_DIR | /var/honeypot | Базовый каталог для всех данных |
DB_PATH | $DATA_DIR/captures.db | Путь к базе SQLite |
SANDBOX_TIMEOUT | 60 | Максимальное число секунд на один запуск в песочнице |
SANDBOX_MEMORY | 128m | Лимит памяти контейнера |
SANDBOX_CPUS | 0.5 | Лимит CPU контейнера |
SANDBOX_MAX_CONCURRENT | 3 | Максимум одновременных sandbox-контейнеров |
SANDBOX_IMAGE | honeypot-sandbox | Docker-образ для песочницы |
WORKER_POLL_INTERVAL | 2.0 | Интервал опроса очереди задач в секундах |
Все данные хранятся в одной SQLite-базе (по умолчанию: /var/honeypot/captures.db).
# Последние запросы
sqlite3 /var/honeypot/captures.db \
"SELECT timestamp, source_ip, method, path, matched_trap
FROM requests ORDER BY id DESC LIMIT 20;"
# Уникальные payload-ы по частоте
sqlite3 /var/honeypot/captures.db \
"SELECT sha256, filename, payload_type, times_seen, sandbox_status
FROM payloads ORDER BY times_seen DESC;"
# Top IP-адреса атакующих
sqlite3 /var/honeypot/captures.db \
"SELECT ip, total_requests, first_seen, last_seen
FROM attackers ORDER BY total_requests DESC LIMIT 10;"
# Результаты песочницы с извлечёнными IOC (JSON)
sqlite3 /var/honeypot/captures.db \
"SELECT payload_id, exit_code, duration_seconds, c2_urls_found, iocs
FROM sandbox_runs ORDER BY id DESC LIMIT 5;"
# Ожидающие sandbox-задачи
sqlite3 /var/honeypot/captures.db \
"SELECT id, payload_sha256, status, created_at
FROM sandbox_jobs ORDER BY id DESC LIMIT 10;"
Данные IOC в sandbox_runs.iocs хранятся в формате JSON с ключами: domains, ips, emails, urls, hashes. Извлекайте их и передавайте в вашу платформу threat intel (MISP, OpenCTI и т.п.) по мере необходимости.
src/honeypot/
main.py # FastAPI веб-приложение (только перехват, без Docker)
worker.py # Автономный sandbox-воркер (опрашивает SQLite, нужен Docker)
config.py # Настройки из переменных окружения
capture/
database.py # Асинхронная SQLite — requests, payloads, очередь sandbox_jobs
logger.py # ASGI промежуточное ПО — логирует каждый запрос
payloads.py # Хранилище с дедупликацией по SHA-256 + классификация payload-ов
facade/
routes.py # Страницы с Laravel-отпечатками (login, register и т.д.)
templates/ # HTML на Jinja2 с Livewire-атрибутами wire:
static/ # Поддельный livewire.js (отпечаток v3.5.1)
traps/
livewire.py # POST /livewire/message, /upload-file, /preview-file
php_catchall.py # Перехват всех запросов к *.php
sandbox/
orchestrator.py # Жизненный цикл Docker-контейнера + укрепление
analyzer.py # Разбор артефактов + извлечение IOC + оценка C2
deploy/
nginx.conf # Обратный прокси с ограничением частоты запросов
honeypot.service # systemd unit (веб)
honeypot-worker.service # systemd unit (sandbox-воркер)
setup.sh # VPS bootstrap-скрипт
sandbox/
Dockerfile # Образ sandbox-контейнера (PHP 8.3 + инструменты атакующего)
entrypoint.sh # Точка входа контейнера с сетевым shim на LD_PRELOAD
Это исследовательский инструмент для сбора образцов вредоносного ПО и наблюдения за поведением атакующих на инфраструктуре, которой вы владеете. Это не производственный продукт безопасности. Развёртывайте только на системах, которыми вы управляете, и учитывайте, что перехват и выполнение payload-ов атакующих могут иметь правовые последствия в вашей юрисдикции. База SQLite и файлы payload-ов растут без ограничений — следите за использованием диска и внедряйте политики хранения по мере необходимости.
Приветствуются issues и pull request-ы.