
Originally a Honeypot for CVE-2026-20131
Низкоинтерактивный honeypot, который имитирует веб-интерфейс Cisco Secure Firewall Management Center (FMC) и перехватывает неаутентифицированный атакующий трафик в стиле Java-сериализации (зонды небезопасной десериализации в стиле CVE).
\xac\xed\x00\x05 (а также Base64 rO0AB…) и извлекает строки shell-команд или URL с помощью регулярных выражений и эвристик.requests в неисполняемый том загрузок.Однострочные JSON-логи (совместимые с Splunk и ELK), опциональные уведомления в Telegram, хешированные артефакты второй стадии и не-root пользователь контейнера. Проект предназначен для исследователей, которым нужна узкоспециализированная ловушка в стиле FMC без дополнительного интеграционного кода.
git clone https://github.com/Hassan-Pouladi/Cisco-FMC-honeypot
cd FMC-Trap
cp .env.example .env
Отредактируйте .env по мере необходимости (см. Переменные окружения). Для развёртываний за Caddy, входящим в комплект, установите TRUST_X_FORWARDED_FOR=1, чтобы IP-адреса клиентов в логах отражали исходного клиента.
Отредактируйте Caddyfile: замените домены-заглушки на ваш домен (и www, если применимо):
example.com, www.example.com {
reverse_proxy fmc-trap:5000
}
Опционально раскомментируйте глобальный блок email [email protected] в Caddyfile, чтобы получать уведомления об истечении сертификатов Let’s Encrypt.
yourdomain.com → публичный IP вашего сервера, а также www, если используется.ufw allow 80,443/tcp).Приложение работает внутри контейнера с UID 10001. Каталог ./data, смонтированный через bind, должен быть доступен для записи:
mkdir -p data/logs data/downloads
sudo chown -R 10001:10001 data/logs data/downloads
Без корректного владельца POST-запросы эксплойтов могут возвращать 500 (Permission denied при записи логов или сырых blob-данных).
docker compose up -d --build
docker compose ps
curl -sI https://yourdomain.com/
Ожидайте HTTP/2 200 (или 301 или 302) и заголовок Via: Caddy. В браузере по адресу https://yourdomain.com/ должна отображаться имитированная страница входа FMC.
О том, где читать события, полезные нагрузки и вывод Docker, см. Поиск логов, загрузок и вывода сервисов и Типовые операции.
Всё указанное ниже отсчитывается от каталога вашего проекта (папки, содержащей docker-compose.yml, обычно FMC-Trap после клонирования). Пути указаны на хосте; Docker монтирует их в контейнер через bind.
Когда что-то появляется в файле журнала: fmc-trap.json получает по одному JSON-объекту на строку, когда запрос соответствует поведению зонда десериализации (магические байты в POST). Обычные GET-запросы к поддельной странице входа по умолчанию не записываются в этот файл.
Когда в папке загрузок есть файлы: записи появляются только если конвейер извлекает URL из зонда и harvester успешно загружает разрешённый удалённый контент в пределах MAX_DOWNLOAD_MB. Если каталог остаётся пустым, возможно, подходящих URL пока нет либо загрузки блокируются политикой приложения.
Красивое форматирование JSON (опционально): для отдельной строки пропустите её через python -m json.tool или используйте jq, если он установлен.
Internet :443/:80 → Caddy (TLS, Let’s Encrypt) → fmc-trap:5000 (Gunicorn/Flask)
↓
./data/logs, ./data/downloads (bind mounts)
expose: "5000" в Compose).Compose передаёт эти переменные в сервис fmc-trap; подробности см. в docker-compose.yml.
Каждая строка в data/logs/fmc-trap.json — это один JSON-объект. Часто встречающиеся ключи: timestamp, event_type, src_ip, headers, raw_payload_hash, extracted_commands, а также downloaded_file_hash, если файл был сохранён. Сохранённые blob-данные в data/downloads/ имеют режим 0400 (только чтение для владельца).
Чтобы обращаться к Gunicorn напрямую без Caddy, добавьте следующее в секцию fmc-trap в docker-compose.yml:
ports:
- "127.0.0.1:5000:5000"
Не привязывайте приложение к 0.0.0.0 в production, когда TLS завершается на Caddy.
.env на хосте (никогда не коммитьте .env).Разворачивайте только на системах, которыми вы владеете или на которых вам явно разрешено устанавливать инструментарий. Honeypot-системы могут собирать атакующий трафик и вредоносное ПО; соблюдайте применимое законодательство и политику организации. Это программное обеспечение предназначено для исследований в области безопасности.
| Элемент | Примечания |
|---|
| Docker и Docker Compose v2 | Установить Docker |
| VPS или хост | Рекомендуется выделенный или изолированный сегмент сети |
| Домен (опционально) | Для HTTPS: настройте DNS и разрешите входящие TCP 80 и TCP 443 на хост |
| Что | Путь на хосте | Как открыть или отслеживать |
|---|
| Журнал событий (JSON-строки) | data/logs/fmc-trap.json | tail -f data/logs/fmc-trap.json (поток в реальном времени), либо откройте в редакторе, либо передавайте в Splunk или ELK |
| Загруженные полезные нагрузки второй стадии | data/downloads/ | Файлы появляются только когда harvester сохраняет удалённый ответ; каждый файл назван по его SHA256-хешу (64 шестнадцатеричных символа), без расширения. Список: ls -la data/downloads (Linux или macOS) или Get-ChildItem data\downloads (Windows PowerShell) |
| Вывод процесса приложения | Не файл; Docker | docker compose logs -f fmc-trap |
| Caddy (TLS, прокси, ACME) | Не файл; Docker | docker compose logs -f caddy |
| Уведомления Telegram (опционально) | Не хранятся в data/ | Укажите TELEGRAM_BOT_TOKEN и TELEGRAM_CHAT_ID в .env; уведомления отправляются при записи событий |
| Задача | Команда или действие |
|---|
| Проверить, запущены ли контейнеры | docker compose ps |
Перезапустить после редактирования .env или Caddyfile | docker compose up -d --build (или docker compose up -d --force-recreate, если изменилось только окружение) |
| Остановить стек | docker compose down |
| Непрерывно отслеживать новые JSON-события | tail -f data/logs/fmc-trap.json |
| Просмотреть последние несколько событий | tail -n 50 data/logs/fmc-trap.json |
| Подсчитать загруженные артефакты | Откройте data/downloads в файловом менеджере или подсчитайте количество файлов в этом каталоге через оболочку (файлы названы по SHA256) |
| Убедиться, что страница honeypot загружается | Откройте https://yourdomain.com/ в браузере или используйте curl -sI, как на шаге проверки |
| Переменная | Назначение | Значение по умолчанию / примечание |
|---|
TRUST_X_FORWARDED_FOR | Использовать первый хоп X-Forwarded-For в качестве src_ip | С Caddy рекомендуется 1 |
DECEPTION_STATUS | 200 возвращает HTML-тело; 302 возвращает редирект | 200 |
DECEPTION_REDIRECT_URL | Целевой путь при статусе 302 | / |
MAX_DOWNLOAD_MB | Лимит harvester на один URL | 16 |
TELEGRAM_BOT_TOKEN / TELEGRAM_CHAT_ID | Опциональные уведомления | Пусто — уведомления отключены |
FMC_SERVER_HEADER | Заголовок ответа Server | nginx |
VT_API_KEY | Зарезервировано | Опционально |
| Симптом | Решение |
|---|
Permission denied при записи в data/ | Выполните sudo chown -R 10001:10001 data/logs data/downloads |
Bind for 0.0.0.0:80 failed: port is already allocated | Другой сервис или контейнер занимает порт 80. Остановите этот сервис или освободите 80; на одном хосте только один процесс может прослушивать порт 80. |
| Ошибки Let’s Encrypt или ACME в логах Caddy | Убедитесь, что DNS резолвится на этот сервер и что 80 и 443 доступны из интернета. Compose настраивает DNS 1.1.1.1 и 8.8.8.8 для Caddy, когда хостовый резолвер не работает внутри Docker. |
curl к HTTPS возвращает пустой вывод или не срабатывает с первой попытки | Дождитесь появления certificate obtained successfully в docker compose logs caddy. |
IP клиента в логах — 172.x.x.x | Установите TRUST_X_FORWARDED_FOR=1 при использовании Caddy, затем пересоздайте контейнеры: docker compose up -d --force-recreate. |