Ethical Hacker con AI

honeyPot

Creare un semplice honeyPot in Python

Semplice honeypot in Python: guida pratica per testare il traffico nel laboratorio

Promemoria importante

Uso consentito e sicurezza

Esegui questo honeypot solo in un laboratorio isolato (Host-Only / Internal Network) e con autorizzazione scritta. Un honeypot cattura traffico potenzialmente malevolo: usalo esclusivamente a scopi didattici e difensivi. Non esporre il servizio su Internet pubblico.

Che cosa vedrai in questa pagina

Contenuti

Spiego cosa è un honeypot HTTP leggero, come funziona il piccolo server Python proposto, come eseguirlo nel laboratorio (senza Docker o con Docker), come leggere i log e alcune estensioni utili per analisi e integrazione con sistemi di logging.

Perché creare un honeypot semplice

Obiettivi
  • Raccogliere informazioni su scansioni e probe (IP, URI, user-agent).
  • Testare pipeline di logging e alerting (file, syslog, ELK).
  • Fornire un target sicuro e isolato per esercitazioni di rilevamento.

Strumenti necessari

Prerequisiti software
  • Python 3.8+ installato sulla macchina che esegue il honeypot.
  • Opzionale: Docker (per containerizzare il honeypot).
  • Un editor di testo (es. Visual Studio Code, nano).

Codice: honeypot HTTP minimale in Python (senza eseguire payload)

Descrizione del comportamento

Il server registra in un file log le richieste in arrivo (timestamp UTC, IP, metodo, path, query, header e body). Non esegue comandi ricevuti dal client e risponde sempre con una pagina finta "Service unavailable" per sembrare un servizio reale ma sicuro.

File: honeypot.py


# honeypot.py

from flask import Flask, request, Response
import logging
from datetime import datetime
import json
import os

app = Flask(**name**)

LOGFILE = os.environ.get("HONEYPOT\_LOG", "honeypot.log")
logging.basicConfig(level=logging.INFO, filename=LOGFILE, format="%(message)s")

def log\_request(req):
entry = {
"time": datetime.utcnow().isoformat() + "Z",
"ip": req.remote\_addr,
"method": req.method,
"path": req.path,
"query": req.query\_string.decode(errors="ignore"),
"headers": dict(req.headers),
"body": req.get\_data(as\_text=True)
}
\# registra come JSON per facilitare parsing successivo
logging.info(json.dumps(entry))

@app.route("/", defaults={"path": ""}, methods=\["GET","POST","PUT","DELETE","OPTIONS","HEAD","PATCH"])
@app.route("/\", methods=\["GET","POST","PUT","DELETE","OPTIONS","HEAD","PATCH"])
def catch\_all(path):
log\_request(request)
\# risposta finta, non eseguire nulla ricevuto
body = "\\\

Service temporarily unavailable\

\\" return Response(body, status=200, mimetype="text/html") if **name** == "**main**": \# ascolta su 0.0.0.0:8080 (adatta la porta al tuo laboratorio) app.run(host="0.0.0.0", port=8080)
```

Esecuzione locale (senza Docker)

Passi rapidi
  • Salva il file precedente come honeypot.py.
  • Installa dipendenze e avvia:



python3 -m venv venv
source venv/bin/activate      # su Windows: venv\Scripts\activate
pip install --upgrade pip
pip install flask
python honeypot.py 

Il server ascolterà sulla porta 8080. Dal tuo host/VM di attacco puoi testare con curl o un browser verso http\://\:8080/.

Esecuzione in Docker (consigliato per isolamento)

Dockerfile



# Dockerfile

FROM python:3.11-slim
WORKDIR /app
COPY honeypot.py /app/
RUN pip install --no-cache-dir flask
VOLUME \["/data"]
EXPOSE 8080
CMD \["python", "honeypot.py"] 
Build e run del container



# dalla cartella con Dockerfile e honeypot.py

docker build -t simple-honeypot\:latest .

# crea una rete Docker isolata per il lab (opzionale)

docker network create lab-net

# avvia il container con volume per i log e rete isolata

docker run -d --name honeypot --network lab-net -p 127.0.0.1:8080:8080 -v "\$(pwd)/data":/app simple-honeypot\:latest 

Nota: la porta è esposta solo su localhost (127.0.0.1) per evitare esposizione pubblica; se usi una rete Docker interna (lab-net), puoi collegare anche la VM attaccante a quella rete.

Come leggere i log

Formati e comandi

I log vengono salvati in JSON riga per riga in honeypot.log (o nella cartella data/ montata nel container). Esempi di comandi utili:


```

# in locale

tail -f honeypot.log

# se i log sono montati in ./data

tail -f data/honeypot.log

# visualizzare le ultime 5 entries formattate (jq richiesto)

tail -n 20 data/honeypot.log | jq -r '.' 
```

Testare il honeypot dal nodo attaccante

Esempi di probe
  • Scansione semplice con nmap: nmap -p 8080 <IP_honeypot>
  • Richiesta HTTP con payload: curl -X POST -d "test=1" http://<IP_honeypot>:8080/login
  • Simulare scanner web: nikto -host http://<IP_honeypot>:8080

Regole base di detection

Cosa cercare nei log
  • Molte richieste dallo stesso IP in un intervallo breve (scan rapido).
  • URI sospette come /admin, /phpmyadmin, /wp-login.php.
  • User-agent riconducibili a scanner automatizzati o assenti.
  • Payload con pattern tipici di exploit (es. ../, union select, stringhe di injection).

Estensioni suggerite

Migliorie rapide
  • Simulare pagine come /admin o /login e registrare accessi specifici.
  • Inviare i log via Filebeat a un'istanza Elasticsearch per dashboard Kibana.
  • Aggiungere alert via script (email/Slack) quando un IP supera una soglia di richieste.
  • Per interazione avanzata valutare Cowrie (honeypot SSH) o altre soluzioni di medium interaction.

Rischi e buone pratiche

Precauzioni
  • Non connettere il honeypot a reti di produzione o a Internet pubblico.
  • Non eseguire i payload ricevuti dal client: il codice registrerà solo i dati e non li esegue.
  • Proteggi i file di log; possono contenere dati personali o stringhe sensibili.
  • Usa immagini Docker ufficiali come base e verifica sempre le sorgenti.

Risorse e approfondimenti

Link utili

Articolo generato da ChatGPT.

Livio Bollini
Walter Livio Bollini

Matematico & Informatico · Intelligenza Artificiale · Sviluppo Web