
Originally a Honeypot for CVE-2026-20131
Um honeypot de baixa interação que imita a superfície web de um Cisco Secure Firewall Management Center (FMC) e captura tráfego de ataque não autenticado do tipo serialização Java (sondagens de desserialização insegura estilo CVE).
\xac\xed\x00\x05 (e Base64 rO0AB…) e extrai strings de shell ou URL usando expressões regulares e heurísticas.requests em um volume de downloads não executável.Logs JSON de linha única (compatíveis com Splunk e ELK), alertas opcionais via Telegram, artefatos de segundo estágio com hash e um usuário de contêiner não root. O projeto é destinado a pesquisadores que precisam de uma armadilha focada no FMC sem código adicional de integração.
git clone https://github.com/Hassan-Pouladi/Cisco-FMC-honeypot
cd FMC-Trap
cp .env.example .env
Edite .env conforme necessário (veja Variáveis de ambiente). Para implantações atrás do Caddy incluído, defina TRUST_X_FORWARDED_FOR=1 para que os endereços IP dos clientes nos logs reflitam o cliente original.
Edite Caddyfile: substitua os hostnames de exemplo por seu domínio (e www, se aplicável):
example.com, www.example.com {
reverse_proxy fmc-trap:5000
}
Opcionalmente, descomente o bloco global email [email protected] no Caddyfile para notificações de expiração do Let's Encrypt.
seudominio.com para o IP público do seu servidor, e www se usado.ufw allow 80,443/tcp).A aplicação é executada como UID 10001 dentro do contêiner. O diretório montado por bind ./data deve ser gravável:
mkdir -p data/logs data/downloads
sudo chown -R 10001:10001 data/logs data/downloads
Sem a propriedade correta, requisições POST de exploração podem retornar 500 (Permissão negada ao gravar logs ou blobs brutos).
docker compose up -d --build
docker compose ps
curl -sI https://seudominio.com/
Espere HTTP/2 200 (ou 301 ou 302) e Via: Caddy. No navegador, https://seudominio.com/ deve exibir a página de login simulada do FMC.
Para saber onde ler eventos, payloads e saída do Docker, veja Encontrar logs, downloads e saída do serviço e Operações comuns.
Tudo abaixo é relativo ao diretório do seu projeto (a pasta que contém docker-compose.yml, geralmente FMC-Trap após clonar). Os caminhos são no host; o Docker os monta por bind no contêiner.
Quando algo aparece no arquivo de log: fmc-trap.json recebe um objeto JSON por linha quando uma requisição corresponde ao comportamento de sonda de desserialização (bytes mágicos em um POST). Requisições GET comuns para a página de login falsa não são gravadas neste arquivo por padrão.
Quando a pasta de downloads tem arquivos: as entradas aparecem apenas se o pipeline extrair uma URL de uma sonda e o harvester conseguir buscar conteúdo remoto permitido dentro de MAX_DOWNLOAD_MB. Se o diretório permanecer vazio, pode não haver URLs qualificadas ainda, ou as buscas podem estar bloqueadas por política na aplicação.
Pretty-printing JSON (opcional): para uma única linha, canalize via python -m json.tool ou use jq se instalado.
Internet :443/:80 → Caddy (TLS, Let's Encrypt) → fmc-trap:5000 (Gunicorn/Flask)
↓
./data/logs, ./data/downloads (bind mounts)
expose: "5000" no Compose).O Compose passa essas variáveis para o serviço fmc-trap; consulte docker-compose.yml para detalhes.
Cada linha em data/logs/fmc-trap.json é um objeto JSON. Chaves comuns incluem timestamp, event_type, src_ip, headers, raw_payload_hash, extracted_commands e downloaded_file_hash quando um arquivo foi armazenado. Blobs salvos em data/downloads/ usam modo 0400 (somente leitura para o proprietário).
Para alcançar o Gunicorn diretamente sem o Caddy, adicione o seguinte sob fmc-trap no docker-compose.yml:
ports:
- "127.0.0.1:5000:5000"
Não vincule a aplicação a 0.0.0.0 em produção quando o Caddy encerrar o TLS.
.env do host (nunca commite o .env).Implante apenas em sistemas que você possui ou nos quais você está explicitamente autorizado a implantar instrumentação. Honeypots podem coletar tráfego de ataque e malware; cumpra a legislação aplicável e a política organizacional. Este software é destinado a pesquisa em segurança.
| Item | Observações |
|---|
| Docker e Docker Compose v2 | Instalar Docker |
| VPS ou host | Recomenda-se um segmento de rede dedicado ou isolado |
| Domínio (opcional) | Para HTTPS: configure DNS e permita conexões de entrada TCP 80 e TCP 443 no host |
| O quê | Caminho no host | Como abrir ou acompanhar |
|---|
| Log de eventos (linhas JSON) | data/logs/fmc-trap.json | tail -f data/logs/fmc-trap.json (fluxo ao vivo), ou abra em um editor, ou ingira no Splunk ou ELK |
| Payloads de segundo estágio baixados | data/downloads/ | Os arquivos aparecem apenas quando o harvester salva uma resposta remota; cada arquivo é nomeado com seu hash SHA256 (64 caracteres hexadecimais), sem extensão. Liste com ls -la data/downloads (Linux ou macOS) ou Get-ChildItem data\downloads (Windows PowerShell) |
| Saída do processo da aplicação | Não é um arquivo; Docker | docker compose logs -f fmc-trap |
| Caddy (TLS, proxy, ACME) | Não é um arquivo; Docker | docker compose logs -f caddy |
| Alertas Telegram (opcional) | Não armazenado em data/ | Defina TELEGRAM_BOT_TOKEN e TELEGRAM_CHAT_ID no .env; alertas são disparados quando eventos são registrados |
| Objetivo | Comando ou ação |
|---|
| Ver se os contêineres estão em execução | docker compose ps |
Reiniciar após editar .env ou Caddyfile | docker compose up -d --build (ou docker compose up -d --force-recreate se apenas o env mudou) |
| Parar a stack | docker compose down |
| Acompanhar novos eventos JSON continuamente | tail -f data/logs/fmc-trap.json |
| Inspecionar os últimos eventos | tail -n 50 data/logs/fmc-trap.json |
| Contar artefatos baixados | Abra data/downloads no gerenciador de arquivos, ou use uma contagem de arquivos no shell nesse diretório (os arquivos são nomeados pelo SHA256) |
| Confirmar que a página do honeypot carrega | Abra https://seudominio.com/ no navegador ou use curl -sI como no passo de verificação |
| Variável | Propósito | Padrão / observação |
|---|
TRUST_X_FORWARDED_FOR | Usar o primeiro hop de X-Forwarded-For como src_ip | 1 é recomendado com Caddy |
DECEPTION_STATUS | 200 retorna um corpo HTML; 302 retorna um redirecionamento | 200 |
DECEPTION_REDIRECT_URL | Caminho de destino quando o status é 302 | / |
MAX_DOWNLOAD_MB | Limite do harvester por URL | 16 |
TELEGRAM_BOT_TOKEN / TELEGRAM_CHAT_ID | Alertas opcionais | Vazio desativa alertas |
FMC_SERVER_HEADER | Cabeçalho de resposta Server | nginx |
VT_API_KEY | Reservado | Opcional |
| Sintoma | Resolução |
|---|
Permissão negada ao escrever em data/ | Execute sudo chown -R 10001:10001 data/logs data/downloads |
Bind for 0.0.0.0:80 failed: port is already allocated | Outro serviço ou contêiner está vinculado à porta 80. Pare esse serviço ou libere a porta 80; apenas um processo pode escutar na porta 80 por host. |
| Erros do Let's Encrypt ou ACME nos logs do Caddy | Confirme que o DNS resolve para este servidor e que as portas 80 e 443 estão acessíveis pela internet. O Compose configura DNS 1.1.1.1 e 8.8.8.8 para o Caddy quando o resolvedor do host falha dentro do Docker. |
curl para HTTPS retorna saída vazia ou falha na primeira tentativa | Aguarde até que certificate obtained successfully apareça em docker compose logs caddy. |
IP do cliente nos logs é 172.x.x.x | Defina TRUST_X_FORWARDED_FOR=1 ao usar Caddy, depois recrie os contêineres: docker compose up -d --force-recreate. |