
Originariamente un honeypot per CVE-2026-20131
Un honeypot a bassa interazione che simula la superficie web di un Cisco Secure Firewall Management Center (FMC) e cattura traffico di attacco non autenticato di tipo serializzazione Java (sonde di deserializzazione non sicura stile CVE).
\xac\xed\x00\x05 (e Base64 rO0AB…) ed estrae stringhe di shell o URL utilizzando espressioni regolari ed euristiche.requests in un volume di download non eseguibile.Log JSON su singola riga (compatibili con Splunk e ELK), avvisi Telegram opzionali, artefatti di secondo livello hashati e un utente container non root. Il progetto è pensato per ricercatori che necessitano di una trappola mirata stile FMC senza codice di integrazione aggiuntivo.
| Elemento | Note |
|---|---|
| Docker e Docker Compose v2 | Installare Docker |
| VPS o host | Si consiglia un segmento di rete dedicato o isolato |
| Dominio (opzionale) | Per HTTPS: configurare DNS e consentire il traffico in entrata TCP 80 e TCP 443 verso l'host |
git clone https://github.com/Hassan-Pouladi/Cisco-FMC-honeypot
cd FMC-Trap
cp .env.example .env
Modificare .env come richiesto (vedi Environment variables). Per distribuzioni dietro il Caddy incluso, impostare TRUST_X_FORWARDED_FOR=1 in modo che gli indirizzi IP dei client nei log riflettano il client originale.
Modificare Caddyfile: sostituire i nomi host segnaposto con il tuo dominio (e www se applicabile):
example.com, www.example.com {
reverse_proxy fmc-trap:5000
}
Opzionalmente, decommentare il blocco globale email [email protected] in Caddyfile per gli avvisi di scadenza di Let's Encrypt.
yourdomain.com verso l'IP pubblico del tuo server, e www se utilizzato.ufw allow 80,443/tcp).L'applicazione viene eseguita come UID 10001 all'interno del container. La directory montata ./data deve essere scrivibile:
mkdir -p data/logs data/downloads
sudo chown -R 10001:10001 data/logs data/downloads
Senza la proprietà corretta, le richieste POST di exploit potrebbero restituire 500 (Permission denied durante la scrittura di log o blob grezzi).
docker compose up -d --build
docker compose ps
curl -sI https://yourdomain.com/
Aspettarsi HTTP/2 200 (o 301 o 302) e Via: Caddy. In un browser, https://yourdomain.com/ dovrebbe mostrare la pagina di login FMC simulata.
Per sapere dove leggere eventi, payload e output Docker, vedere Finding logs, downloads, and service output e Common operations.
Tutto ciò che segue è relativo alla directory del progetto (la cartella che contiene docker-compose.yml, solitamente FMC-Trap dopo aver clonato). I percorsi sono sull'host; Docker li monta nel container.
| Cosa | Percorso host | Come aprire o seguire |
|---|---|---|
| Log eventi (righe JSON) | data/logs/fmc-trap.json | tail -f data/logs/fmc-trap.json (stream live), o aprire in un editor, o importare in Splunk o ELK |
| Payload di secondo livello scaricati | data/downloads/ | I file appaiono solo quando il raccoglitore salva una risposta remota; ogni file è nominato con il suo hash SHA256 (64 caratteri esadecimali), senza estensione. Elencare con ls -la data/downloads (Linux o macOS) o Get-ChildItem data\downloads (Windows PowerShell) |
| Output del processo applicativo | Non un file; Docker | docker compose logs -f fmc-trap |
| Caddy (TLS, proxy, ACME) | Non un file; Docker | docker compose logs -f caddy |
| Avvisi Telegram (opzionale) | Non memorizzato in data/ | Impostare TELEGRAM_BOT_TOKEN e TELEGRAM_CHAT_ID in .env; gli avvisi vengono attivati quando gli eventi vengono registrati |
Quando qualcosa appare nel file di log: fmc-trap.json riceve un oggetto JSON per riga quando una richiesta corrisponde al comportamento di sonda di deserializzazione (byte magici in un POST). Le richieste GET ordinarie alla pagina di login fittizia non vengono scritte in questo file per impostazione predefinita.
Quando la cartella dei download ha file: le voci appaiono solo se la pipeline estrae un URL da una sonda e il raccoglitore recupera con successo contenuti remoti consentiti entro MAX_DOWNLOAD_MB. Se la directory rimane vuota, potrebbero non esserci ancora URL qualificanti, o i recuperi potrebbero essere bloccati dalla politica nell'applicazione.
Stampa formattata JSON (opzionale): per una singola riga, inviarla tramite python -m json.tool o usare jq se installato.
| Obiettivo | Comando o azione |
|---|---|
| Verificare se i container sono in esecuzione | docker compose ps |
Riavviare dopo aver modificato .env o Caddyfile | docker compose up -d --build (o docker compose up -d --force-recreate se è cambiato solo l'ambiente) |
| Fermare lo stack | docker compose down |
| Seguire i nuovi eventi JSON in modo continuo | tail -f data/logs/fmc-trap.json |
| Ispezionare gli ultimi eventi | tail -n 50 data/logs/fmc-trap.json |
| Contare gli artefatti scaricati | Aprire data/downloads nel gestore file, o usare un conteggio file shell su quella directory (i file sono nominati per SHA256) |
| Confermare che la pagina honeypot si carichi | Aprire https://yourdomain.com/ in un browser o usare curl -sI come nel passaggio di verifica |
Internet :443/:80 → Caddy (TLS, Let’s Encrypt) → fmc-trap:5000 (Gunicorn/Flask)
↓
./data/logs, ./data/downloads (bind mounts)
expose: "5000" in Compose).| Variabile | Scopo | Default / nota |
|---|---|---|
TRUST_X_FORWARDED_FOR | Usare il primo hop X-Forwarded-For come src_ip | 1 è raccomandato con Caddy |
DECEPTION_STATUS | 200 restituisce un corpo HTML; 302 restituisce un reindirizzamento | 200 |
DECEPTION_REDIRECT_URL | Percorso di destinazione quando lo stato è 302 | / |
MAX_DOWNLOAD_MB | Limite del raccoglitore per URL | 16 |
TELEGRAM_BOT_TOKEN / TELEGRAM_CHAT_ID | Avvisi opzionali | Vuoto disabilita gli avvisi |
FMC_SERVER_HEADER | Intestazione della risposta Server | nginx |
VT_API_KEY | Riservato | Opzionale |
Compose passa queste variabili al servizio fmc-trap; fare riferimento a docker-compose.yml per i dettagli.
Ogni riga in data/logs/fmc-trap.json è un oggetto JSON. Le chiavi comuni includono timestamp, event_type, src_ip, headers, raw_payload_hash, extracted_commands e downloaded_file_hash quando un file è stato memorizzato. I blob salvati in data/downloads/ usano modalità 0400 (sola lettura per il proprietario).
| Sintomo | Risoluzione |
|---|---|
Permission denied durante la scrittura in data/ | Eseguire sudo chown -R 10001:10001 data/logs data/downloads |
Bind for 0.0.0.0:80 failed: port is already allocated | Un altro servizio o container è in ascolto sulla porta 80. Fermare quel servizio o liberare la 80; solo un processo può essere in ascolto sulla 80 per host. |
| Errori Let's Encrypt o ACME nei log di Caddy | Confermare che il DNS risolva a questo server e che le porte 80 e 443 siano raggiungibili da internet. Compose configura DNS 1.1.1.1 e 8.8.8.8 per Caddy quando il resolver dell'host fallisce all'interno di Docker. |
curl verso HTTPS restituisce output vuoto o fallisce al primo tentativo | Aspettare che certificate obtained successfully appaia in docker compose logs caddy. |
L'IP del client nei log è 172.x.x.x | Impostare TRUST_X_FORWARDED_FOR=1 quando si utilizza Caddy, poi ricreare i container: docker compose up -d --force-recreate. |
Per raggiungere Gunicorn direttamente senza Caddy, aggiungere quanto segue sotto fmc-trap in docker-compose.yml:
ports:
- "127.0.0.1:5000:5000"
Non associare l'applicazione a 0.0.0.0 in produzione quando Caddy termina TLS.
.env sull'host (mai fare commit di .env).Distribuire solo su sistemi di tua proprietà o sui quali sei esplicitamente autorizzato a distribuire strumentazione. Gli honeypot possono raccogliere traffico di attacco e malware; rispettare le leggi applicabili e le politiche organizzative. Questo software è destinato alla ricerca sulla sicurezza.