
Sensore di rete Spip scritto in Go
Spip è un sensore honeypot di rete a bassa interazione per Linux, scritto in Go. Accetta connessioni TCP su qualsiasi porta che l'host gli reindirizza, in chiaro o TLS, risponde quanto basta per indurre un client a inviare il proprio messaggio successivo e scrive ogni scambio come un singolo record JSON con nomi di campo ECS, pronto per un SIEM o un data lake. L'acquisizione UDP opzionale registra i datagrammi e non risponde mai ad essi.
HoneyLabs esegue Spip per raccogliere i dati pubblicati su honeylabs.net.
Prerequisiti:
iptables e accesso root per installare le regole di reindirizzamentogit clone https://github.com/honeylabshq/Spip-Go.git
cd Spip-Go
go build -o spip-agent ./cmd/spip-agent
Per impostare la versione riportata in observer.version e agent.version (predefinita dev), aggiungere -ldflags "-X main.version=v1.2.3".
sudo ./scripts/initial_setup.sh
Vedi Initial setup helper di seguito.
config.toml
config.toml minimale:name = "spip-agent"
ip = "0.0.0.0"
port = 8080
Chiavi di configurazione opzionali:
cert_path / key_path: abilitano TLS se entrambe impostate. I percorsi relativi vengono risolti rispetto alla directory del file di configurazione.log_file: aggiunge i record a questo file invece che a stdout. Vedi Output del log di seguito.[loom]: invia anche i record tramite HTTP. Vedi Loom di seguito.read_timeout_seconds / write_timeout_seconds: timeout di lettura inattivo e timeout di scrittura per connessione.rate_limit_per_second / rate_limit_burst: limite di frequenza sulle nuove connessioni TCP, condiviso da tutte le sorgenti. Una connessione oltre il limite viene chiusa senza essere letta.community_id_seed: seed opzionale a 16 bit per l'hashing dei flussi Community ID v1 (omettere o 0 per il valore predefinito).capture_client_hello: impostare false per omettere tls.client.hello_hex. Vedi Fingerprinting.ignore_sources: indirizzi o reti le cui connessioni e datagrammi vengono chiusi o scartati prima che qualsiasi cosa venga letta, così non vengono mai registrati, sottoposti a fingerprinting o inviati. Indirizzi semplici e CIDR, IPv4 o IPv6:
ignore_sources = ["192.0.2.10", "198.51.100.0/24", "2001:db8::/32"]. Un honeypot su un host noleggiato viene interrogato dal monitoraggio dell'host stesso, e conteggiare queste richieste distorce le classifiche delle porte e i conteggi degli scanner. Una voce che non viene analizzata correttamente impedisce l'avvio dell'agente, perché un errore di battitura qui registrerebbe silenziosamente traffico che si ritiene scartato. Gli scarti vengono conteggiati per sorgente e riportati nel log ogni ora e allo spegnimento.udp_enabled e le chiavi udp_*: vedi Cattura UDP.Se questi campi di ottimizzazione a runtime vengono omessi o impostati a 0, Spip applica i seguenti valori predefiniti:
read_timeout_seconds: 30write_timeout_seconds: 10rate_limit_per_second: 20rate_limit_burst: 50000sudo iptables -t nat -F
sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -j RETURN
sudo iptables -t nat -A PREROUTING -p tcp -j REDIRECT --to-port 8080
Il primo comando svuota l'intera tabella nat. Ometterlo su un host che ha regole NAT proprie. Le stesse due regole con ip6tables coprono IPv6. Spip legge la destinazione originale di ogni connessione dal connection tracking del kernel e la registra come destination.ip e destination.port.
./spip-agent -config config.toml
-config è l'unico flag e per impostazione predefinita punta a config.toml nella directory di lavoro. SIGINT o SIGTERM arrestano il listener, attendono fino a 15 secondi le connessioni aperte e scrivono qualsiasi batch Loom in sospeso nello spool, concedendogli 5 secondi per l'invio; il resto viene inviato al successivo avvio.
Spip sceglie un responder in base alla porta di destinazione originale. Ognuno dice solo quanto basta per far inviare al client il suo messaggio successivo: credenziali, un comando o una busta di posta.
| Porte | Risposta |
|---|---|
| 23, 2323 | Negoziazione delle opzioni Telnet e un prompt login:, poi Password:, poi Login incorrect e chiusura |
| 21, 990 | Saluto FTP, una richiesta di password dopo la prima riga, poi 530 Login incorrect. e chiusura |
| 25, 465, 587 | Saluto SMTP, risposte 250 alle prime tre righe, 354 alla quarta, poi chiusura. Nulla viene inoltrato e nessuna connessione in uscita viene effettuata. |
| 110, 995 | Saluto POP3, +OK dopo la prima riga, -ERR invalid login dopo la seconda, poi chiusura |
| 143, 993 | Saluto IMAP, poi * BAD Login failed e chiusura |
| 6379, 6380, o qualsiasi payload che sembri un comando Redis | +PONG a PING, +OK a tutto il resto |
| qualsiasi altra porta | HTTP/1.1 200 OK con l'indirizzo IP del client come corpo per una richiesta HTTP, l'indirizzo IP nudo per qualsiasi altra cosa |
Un client che invia SSH-2.0 senza un messaggio di scambio chiavi riceve il banner SSH-2.0-spip, e Spip attende fino a 2 secondi lo scambio chiavi per poter calcolare l'impronta del client.
I saluti telnet, FTP, SMTP, POP3 e IMAP vengono inviati alla connessione. Con TLS abilitato, Spip legge prima un byte per distinguere TLS dal testo in chiaro, quindi quei saluti vengono inviati solo dopo che il client ha inviato qualcosa.
Spip scrive i log ECS su un'unica destinazione locale e può anche inviare gli stessi record a un server Loom:
| Destinazione | Config | Comportamento |
|---|---|---|
| Locale | log_file | Omesso o vuoto: stdout. Impostato a un percorso: i record vengono aggiunti a quel file. Sempre attivo. |
| Loom | [loom] con enabled = true | Opzionale. Gli stessi record vengono raggruppati in batch e inviati tramite POST all'URL di ingest di Loom in aggiunta all'output locale. |
L'output locale trasporta anche le righe di log dell'agente stesso, come i conteggi orari degli scarti e gli avvisi, come {"timestamp": <unix seconds>, "level": "INFO", "message": "...", "target": "...", "record_type": "log"}. Solo i record di connessione vanno a Loom. I messaggi di avvio vanno su stderr.