
Honeypot per IoT e Tecnologia Operativa
| 📢 ATTENZIONE!!! |
|---|
| Questo repository è stato spostato su The Honeynet Project :) |
RIoTPot è un honeypot a interazione ibrida, focalizzato principalmente sull'emulazione di protocolli IoT e OT, sebbene sia anche in grado di emulare altri servizi. In sostanza, RIoTPot funge da servizio proxy per altri honeypot inclusi nel sistema. Pertanto, puoi eseguire qualsiasi honeypot e altri servizi insieme a RIoTPot. Inoltre, è disponibile un'applicazione web UI che puoi utilizzare per gestire il tuo instradamento.
L'honeypot viene fornito con diversi servizi a bassa interazione pronti all'uso. Poiché questi servizi sono scritti come plugin, sono supportati solo su Linux; tuttavia, puoi avviare RIoTPot senza di essi. La tabella seguente contiene l'elenco dei servizi inclusi in RIoTPot per impostazione predefinita, la loro porta interna e la porta proxy.
Indice
L'architettura di RIoTPot si basa su connessioni proxy verso servizi interni e circostanti (o esterni) (ad esempio, honeypot, servizi completi, container, host remoti, ecc.).
A tal fine, l'honeypot gestisce un certo numero di proxy definiti dall'utente che inoltrano le connessioni tra servizi e RIoTPot 1.
In questo modo, RIoTPot può decidere come e dove instradare gli attacchi in arrivo.
La logica utilizzata per determinare come gestire l'attacco in arrivo è implementata sotto forma di middleware 2.
Per gestire servizi, middleware e proxy, RIoTPot è dotato di una REST API 3 e di un'interfaccia webapp UI 4 già pronti all'uso.
L'interfaccia utente è accessibile tramite il browser all'indirizzo localhost:2022 e puoi interagire con gli endpoint API all'indirizzo localhost:2022/api/swagger che mostra un'interfaccia Swagger.
Figura 1 mostra l'architettura di RIoTPot, incluse le due applicazioni principali che lo costituiscono (RIoTPot stesso e RIoTPot UI) e i loro componenti, e una sezione per racchiudere servizi esterni (o adiacenti).
RIoTPot è scritto in Golang5. Ogni istanza di RIoTPot espone proxy registrati (in base alla loro porta) su richiesta. Per servire un proxy, deve avere un servizio associato e la porta proxy deve essere disponibile (attualmente, RIoTPot non accetta più servizi in esecuzione sulla stessa porta). Quando un proxy è stato associato e servito, gli aggressori saranno in grado di inviare messaggi a RIoTPot su quella porta, inoltrando i messaggi al servizio associato e viceversa all'aggressore6.
Per facilità di accesso, più istanze di RIoTPot possono essere gestite dall'app web RIoTPot UI.
Oltre a gestire i proxy registrati in ciascuna istanza, l'interfaccia utente consente di creare, utilizzare e modificare i profili.
Ogni profilo contiene un certo numero di proxy denominati in base a protocolli o altri servizi, facendo sì che un'istanza di RIoTPot assomigli a un dispositivo reale (ad esempio, un assistente domestico).
In poche parole, i profili accelerano il processo di configurazione e provisioning di un'istanza di RIoTPot con configurazioni specifiche.
L'interfaccia utente è scritta utilizzando la libreria front-end React JavaScript (usiamo Typescript per questo progetto) e la libreria di gestione dello stato Recoil.
Poiché RIoTPot è piuttosto piccolo, al momento non utilizza un database.
Eseguire RIoTPot è relativamente semplice. In generale, hai tre opzioni. La prima è scaricare una release di RIoTPot; puoi scegliere di scaricare l'ultima release o una precedente. La seconda opzione è compilare il progetto da solo. L'ultima opzione è utilizzare il codice sorgente per creare un container Docker con RIoTPot e alcune applicazioni aggiuntive per potenziare l'honeypot.
Info: Questa guida è pensata per utenti senza esigenze particolari, che desiderano un'esperienza semplice e pronta all'uso.
Ogni release si presenta in una cartella denominata riotpot con un binario eseguibile (anch'esso) chiamato riotpot e una cartella plugins piena di vari servizi (o honeypot a bassa interazione).
È importante mantenere la struttura interna delle cartelle affinché RIoTPot funzioni correttamente.
📁 riotpot
┕ riotpot
┕ 📁 plugins
riotpot.riotpot. Questo avvierà RIoTPot con l'API abilitata, tutti i plugin pronti all'uso e il server UI.
localhost:2022Info: Questa guida è pensata per utenti avanzati che si trovano a proprio agio in ambienti di sviluppo.
Requisiti
- Golang - Necessario per compilare il progetto
- Node - Necessario per compilare l'UI
Opzionali:
- Git - Utilizzato per scaricare il codice sorgente
- Make - Per eseguire comandi già pronti
Scarica il codice sorgente di RIoTPot da GitHub. Apri una console e digita la seguente riga.
git clone [email protected]:aau-network-security/riotpot.git
Naviga nella cartella in cui hai scaricato il codice sorgente di RIoTPot e installa i pacchetti node richiesti.
npm install
Se hai installato Make, abbiamo incluso diversi helper di comando per assisterti nella compilazione del progetto. Per semplificare, puoi eseguire due semplici comandi che compileranno il binario di RIoTPot e i plugin (e li posizioneranno nella cartella corretta).
# Compila il server
make build-ui
# Compila RIoTPot e i plugin
make riotpot-build
NOTA: L'UI utilizza Vite per compilare il progetto. Se preferisci usare un altro compilatore, potresti dover apportare alcune modifiche da solo.
Info: Questa guida è pensata per utenti avanzati che preferiscono utilizzare RIoTPot in un ambiente virtuale.
Requisiti
- Docker - Utilizzato per creare un'immagine di un'istanza di RIoTPot e del server UI.
- Docker-compose - Utilizzato per creare un singolo container con un'istanza di RIoTPot, l'UI e altre applicazioni e servizi.
I principali vantaggi di utilizzare questa configurazione sono le funzionalità di sicurezza aggiuntive con modifiche minime alla configurazione del container e ai container stessi. Ad esempio, possiamo definire reti private virtuali separate e reti overlay per nascondere, isolare e incapsulare RIoTPot e altri servizi adiacenti. Inoltre, i container ci consentono di associare i servizi utilizzando il nome dell'indirizzo docker anziché il loro IP, il che è molto comodo. Infine, possiamo generare e arrestare container separati su richiesta senza influenzare altri servizi.
D'altra parte, la virtualizzazione è presumibilmente più impegnativa rispetto all'utilizzo di applicazioni su hardware reale. Sebbene una singola istanza di RIoTPot sia relativamente leggera, è importante considerare gli svantaggi introdotti dalla virtualizzazione e dall'emulazione hardware (ad esempio, ritardi di risposta).
Attenzione: Tecnicamente parlando, un aggressore dedicato potrebbe rendersi conto che RIoTPot è in realtà un honeypot analizzando e confrontando i ritardi di risposta introdotti dalla virtualizzazione rispetto ai server reali (!!). Sebbene questo tipo di fingerprinting degli honeypot sia stato studiato in precedenza, i risultati per i servizi Internet comuni sono ancora inconcludenti (ad esempio, HTTP, Telnet e SSH), a causa della mercificazione dei servizi di hosting cloud che utilizzano macchine virtuali e configurazioni dettagliate dei server.
Il file docker-compose include servizi aggiuntivi per migliorare l'esperienza di RIoTPot.
La tabella seguente riassume l'elenco dei servizi e delle applicazioni inclusi in questo container.
Servizi
RIoTPot è dotato di flag di comando che influenzano come e cosa viene avviato. Esempio:
# Esegui RIoTPot senza l'ui
./riotpot --ui false
I servizi interni e circostanti non sono accessibili tramite Internet. I servizi interni sono integrati e accessibili solo a RIoTPot. Questi servizi vengono caricati all'avvio e non possono essere eliminati, ma possono essere arrestati. I servizi circostanti devono essere nella stessa rete di RIoTPot. I servizi esterni devono inserire RIoTPot nella whitelist solo. ↩
I middleware sono attualmente in fase di sviluppo. ↩
L'API di RIoTPot non deve essere esposta a Internet. Ad ogni modo, l'API attualmente accetta solo connessioni da localhost. Questo potrebbe essere modificato in futuro, fornendo una whitelist di host e autenticazione standard. ↩
Sebbene l'interfaccia web possa essere utilizzata come componente separato, è integrata nel binario di RIoTPot. ↩
Sebbene l'applicazione di base sia interoperabile, i servizi interni (plugin) possono essere utilizzati solo in ambienti Linux, FreeBSD e macOS. Prevediamo di superare questa limitazione sostituendo i plugin con microservizi che comunicano tramite gRPC. ↩
Per motivi etici e di sicurezza, RIoTPot non consente richieste non sollecitate verso l'esterno, ovvero shell inverse e simili non sono consentite. ↩
| Servizio | Porta Interna | Porta Proxy |
|---|
| Echo | 20007 | 7 |
| SSH | 20022 | 22 |
| Telnet | 20023 | 23 |
| HTTP | 28080 | 80 |
| Modbus | 20502 | 502 |
| MQTT | 21883 | 1883 |
| CoAP | 25683 | 5683 |
| Servizio | Immagine | Porta | Dettagli |
|---|
| MQTT | eclipse-mosquitto | 1883 | Server MQTT Mosquito |
| HTTP | httpd | 80 | Server HTTP regolare |
| Modbus | oitc/modbus-server | 502 | Server Modbus |
| OCPP | ocpp1.6-central-system | 443 | OCPP v1.6 (utilizzato nelle stazioni di ricarica per auto) |
| Applicazione | Immagine | Dettagli |
|---|---|---|
| TCPDump | kaazing/tcpdump | Registratore di pacchetti. Memorizza il traffico di rete in file .pcap |
Il container può essere configurato in tre semplici passaggi:
Scarica il codice sorgente di RIoTPot da GitHub. Apri una console e digita la seguente riga.
git clone [email protected]:aau-network-security/riotpot.git
Naviga nella cartella in cui hai scaricato il codice sorgente di RIoTPot.
Con Docker in esecuzione: se hai installato Make, esegui il comando seguente. Altrimenti, esegui un comando docker-compose utilizzando il file docker-compose incluso nella cartella build/docker.
# Con make
make up
# Con docker-compose
docker-compose -p riotpot -f build/docker/docker-compose.yaml up -d --build
| Flag | Tipo | Default | Descrizione |
|---|
| debug | Booleano | false | Imposta il livello di log su debug |
| api | Booleano | true | Se avviare l'API |
| plugins | Booleano | true | Se caricare i plugin honeypot a bassa interazione |
| whitelist | Stringa | http://localhost,http://localhost:3000 | Elenco di host consentiti separati da virgola per contattare l'API |
| ui | Booleano | true | Se avviare l'UI |