Automating Threat Intelligence series
4 Maggio 2025
Automatic network discovery and documentation
NetBrain è un noto software che consente la scoperta (e la gestione) della rete. Concentriamoci ora sulla scoperta e documentazione della rete: vogliamo rilevare automaticamente i dispositivi di rete, le loro connessioni e memorizzare tutto in un repository di controllo versione (GIT/CVS).
Quindi vogliamo:
- rilevare tutti i dispositivi di rete;
- mappare come sono connessi tra loro;
- tracciare automaticamente le modifiche;
- archiviare tutto in un repository di controllo versione (GIT/CVS);
- visualizzare qualsiasi mappa aggiornata tramite un semplice browser.
Come possiamo risolvere il problema:
- assumiamo che tutti i dispositivi siano Cisco, quindi possiamo usare CDP;
- possiamo ottenere i dati CDP tramite SNMPv3;
- possiamo costruire una topologia (sorgente, destinazione);
- possiamo archiviare la topologia in un repository di controllo versione (GIT/CVS);
- possiamo utilizzare jsPlumb per rendere la topologia (sorgente, destinazione) in una pagina web.
netdoc
netdoc è un piccolo esperimento che ho scritto per risolvere il problema. Contiene due script Python:
netdiscover.py
: per scoprire i dispositivi di rete via SNMPv3 e generare due file .ini:discovered_nodes.ini
: contiene tutti i dispositivi di rete con alcune informazioni aggiuntivediscovered_connections.ini
: contiene tutte le connessioni di rete con alcune informazioni aggiuntive
netplot.py
: per generare una pagina web a partire dai file .ini sopra indicati.
I file .ini
possono essere archiviati in un repository di controllo versione.
Esecuzione di netconf
Attualmente, netdoc è uno script POC, quindi potrebbe funzionare nella tua infrastruttura o potrebbe non funzionare. Per avviarlo, eseguire:
./netdiscover.py -u snmpv3user -p snmpv3password -h 10.1.1.4 -h 10.1.1.5 -h 10.1.1.6
Il file discovered_nodes.ini
contiene tutti i dispositivi rilevati tramite CDP nella seguente forma:
[AccessServer]
id = AccessServer
image = router.svg
disabled = false
platform = cisco 2610
Il titolo è l’ID del vicino CDP (di solito il nome host); gli altri attributi sono:
- id: l’ID del vicino CDP (di solito il nome host)
- image: un’immagine utilizzata per visualizzare il nodo nella pagina web
- disabled: true se il dispositivo è assente nell’ultima scansione
- platform: la piattaforma del vicino CDP
Il file discovered_connections.ini
contiene tutte le connessioni rilevate tramite CDP nella seguente forma:
[AccessServer:e0/0-switch.example.com:gi2/0/46]
source = AccessServer
source_if = e0/0
destination = swipd002.campus.infocert.it
destination_if = gi2/0/46
disabled = false
Il titolo è l’ID del vicino CDP sorgente e destinazione con i nomi delle interfacce; gli altri attributi sono:
- source: l’ID del vicino CDP sorgente
- source_if: il nome dell’interfaccia sorgente
- destination: l’ID del vicino CDP di destinazione
- destination_if: il nome dell’interfaccia di destinazione
- disabled: true se la connessione è assente nell’ultima scansione
Dopo una scansione riuscita, possiamo creare la pagina HTML:
./netplot.py > netdoc.html
Ed ecco una pagina web interattiva e trascinabile: