
Il motore di fingerprinting modulare e distribuito
Scannerl è un motore di fingerprinting modulare e distribuito implementato da Kudelski Security. Scannerl può effettuare il fingerprinting di migliaia di target su un singolo host, ma può altrettanto facilmente essere distribuito su più host. Scannerl sta al fingerprinting come zmap sta alla scansione delle porte.
Scannerl funziona su Debian/Ubuntu/Arch (ma probabilmente funzionerà anche su altre distribuzioni). Utilizza un'architettura master/slave in cui il nodo master distribuisce il lavoro (host da sottoporre a fingerprinting) ai suoi slave (locali o remoti). L'intero dispiegamento è trasparente per l'utente.
Quando si utilizzano strumenti convenzionali di fingerprinting per analisi su larga scala, i ricercatori di sicurezza si scontrano spesso con due limitazioni: in primo luogo, questi strumenti sono tipicamente progettati per scansionare comparativamente pochi host alla volta e non sono adatti a grandi intervalli di indirizzi IP. In secondo luogo, se si effettua il fingerprinting di un'ampia gamma di indirizzi IP protetti da dispositivi IPS, la probabilità di essere inseriti in una lista nera è maggiore, il che potrebbe portare a un set di informazioni incompleto. Scannerl è progettato per aggirare queste limitazioni, non solo fornendo la capacità di eseguire il fingerprinting di più host simultaneamente, ma anche distribuendo il carico su un numero arbitrario di host. Scannerl rende anche la distribuzione di questi compiti completamente trasparente, rendendo banale la configurazione e la manutenzione di progetti di fingerprinting su larga scala; ciò consente di concentrarsi sulle analisi piuttosto che sul compito titanico di gestire e distribuire manualmente i processi di fingerprinting. Oltre al fattore velocità, scannerl è stato progettato per permettere di impostare facilmente analisi di fingerprinting specifiche con poche righe di codice. Non solo la creazione di un cluster di fingerprinting è semplice da configurare, ma può essere ottimizzata aggiungendo scansioni finemente sintonizzate alle proprie campagne di fingerprinting.
È lo strumento più veloce per eseguire campagne di fingerprinting su larga scala.
Per maggiori informazioni:
Indice
Vedi il wiki per maggiori informazioni.
Vedi le diverse opzioni di installazione nella pagina di installazione del wiki
Per installare dal sorgente, installa prima Erlang (almeno v.18) scegliendo il pacchetto giusto per la tua piattaforma: Download di Erlang
Installa i pacchetti richiesti:
# on debian
$ sudo apt install erlang erlang-src rebar
# on arch
$ sudo pacman -S erlang-nox rebar
Poi compila scannerl:
$ git clone https://github.com/kudelskisecurity/scannerl.git
$ cd scannerl
$ ./build.sh
Ottieni l'utilizzo eseguendo
$ ./scannerl -h
Scannerl è disponibile su AUR per gli utenti Arch Linux
I DEB (Ubuntu, Debian) sono disponibili nelle release.
I RPM (OpenSUSE, CentOS, RedHat) sono disponibili su https://build.opensuse.org/package/show/home:chapeaurouge/scannerl.
Sono necessari due tipi di nodi per eseguire una scansione distribuita:
Il nodo master deve avere scannerl installato e compilato, mentre i nodi slave necessitano solo di Erlang installato. L'intera configurazione è trasparente e viene eseguita automaticamente dal nodo master.
Requisiti per una scansione distribuita:
$ ./scannerl -h
____ ____ _ _ _ _ _ _____ ____ _
/ ___| / ___| / \ | \ | | \ | | ____| _ \| |
\___ \| | / _ \ | \| | \| | _| | |_) | |
___) | |___ / ___ \| |\ | |\ | |___| _ <| |___
|____/ \____/_/ \_\_| \_|_| \_|_____|_| \_\_____|
USAGE
scannerl MODULE TARGETS [NODES] [OPTIONS]
MODULE:
-m <mod> --module <mod>
mod: the fingerprinting module to use.
arguments are separated with a colon.
TARGETS:
-f <target> --target <target>
target: a list of target separated by a comma.
-F <path> --target-file <path>
path: the path of the file containing one target per line.
-d <domain> --domain <domain>
domain: a list of domains separated by a comma.
-D <path> --domain-file <path>
path: the path of the file containing one domain per line.
NODES:
-s <node> --slave <node>
node: a list of node (hostnames not IPs) separated by a comma.
-S <path> --slave-file <path>
path: the path of the file containing one node per line.
a node can also be supplied with a multiplier (<node>*<nb>).
OPTIONS:
-o <mod> --output <mod> comma separated list of output module(s) to use.
-p <port> --port <port> the port to fingerprint.
-t <sec> --timeout <sec> the fingerprinting process timeout.
-T <sec> --stimeout <sec> slave connection timeout (default: 10).
-j <nb> --max-pkt <nb> max pkt to receive (int or "infinity").
-r <nb> --retry <nb> retry counter (default: 0).
-c <cidr> --prefix <cidr> sub-divide range with prefix > cidr (default: 24).
-M <port> --message <port> port to listen for message (default: 57005).
-P <nb> --process <nb> max simultaneous process per node (default: 28232).
-Q <nb> --queue <nb> max nb unprocessed results in queue (default: infinity).
-C <path> --config <path> read arguments from file, one per line.
-O <mode> --outmode <mode> 0: on Master, 1: on slave, >1: on broker (default: 0).
-v <val> --verbose <val> be verbose (0 <= int <= 255).
-K <opt> --socket <opt> comma separated socket option (key[:value]).
-l --list-modules list available fp/out modules.
-V --list-debug list available debug options.
-A --print-args Output the args record.
-X --priv-ports use only source port between 1 and 1024.
-N --nosafe keep going even if some slaves fail to start.
-w --www DNS will try for www.<domain>.
-b --progress show progress.
-x --dryrun dry run.
Vedi il wiki per maggiori informazioni.
Scannerl può essere utilizzato sull'host locale senza alcun altro host. Tuttavia, creerà comunque un nodo slave sullo stesso host da cui viene eseguito. Pertanto, devono essere soddisfatti anche i requisiti descritti in Configurazione distribuita.
Un modo rapido per farlo è assicurarsi che il proprio host sia in grado di risolversi da solo con
grep -q "127.0.1.1\s*`hostname`" /etc/hosts || echo "127.0.1.1 `hostname`" | sudo tee -a /etc/hosts
e creare una chiave SSH (se non ancora presente) e aggiungerla a authorized_keys (è necessario un server SSH in esecuzione):
cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
L'esempio seguente esegue un'analisi del banner HTTP su google.com da localhost
./scannerl -m httpbg -d google.com
Per eseguire una scansione distribuita, è necessario preconfigurare gli host che verranno utilizzati da scannerl per distribuire il lavoro. Vedi Configurazione distribuita per maggiori informazioni.
Scannerl si aspetta un elenco di slave da utilizzare (fornito tramite le opzioni -s o -S).
./scannerl -m httpbg -d google.com -s host1,host2,host3
Scannerl elenca i moduli disponibili (moduli di output e moduli di fingerprinting) con l'opzione -l:
$ ./scannerl -l
Fingerprinting modules available
================================
bacnet UDP/47808: Bacnet identification
chargen UDP/19: Chargen amplification factor identification
fox TCP/1911: FOX identification
httpbg TCP/80: HTTP Server header identification
- Arg1: [true|false] follow redirection [Default:false]
httpsbg SSL/443: HTTPS Server header identification
https_certif SSL/443: HTTPS certificate graber
imap_certif TCP/143: IMAP STARTTLS certificate graber
modbus TCP/502: Modbus identification
mqtt TCP/1883: MQTT identification
mqtts TCP/8883: MQTT over SSL identification
mysql_greeting TCP/3306: Mysql version identification
pop3_certif TCP/110: POP3 STARTTLS certificate graber
smtp_certif TCP/25: SMTP STARTTLS certificate graber
ssh_host_key TCP/22: SSH host key graber
Output modules available
========================
csv output to csv
- Arg1: [true|false] save everything [Default:true]
csvfile output to csv file
- Arg1: [true|false] save everything [Default:false]
- Arg2: File path
file output to file
- Arg1: File path
file_ip output to stdout (only ip)
- Arg1: File path
file_mini output to file (only ip and result)
- Arg1: File path
file_resultonly output to file (only result)
- Arg1: File path
stdout output to stdout
stdout_ip output to stdout (only IP)
stdout_mini output to stdout (only ip and result)
Gli argomenti possono essere forniti ai moduli con i due punti. Ad esempio per il modulo di output file:
./scannerl -m httpbg -d google.com -o file:/tmp/result
Il risultato restituito da scannerl ai moduli di output ha la seguente forma:
{module, target, port, result}
Dove
module: il modulo usato (atomo Erlang)target: IP o hostname (stringa o indirizzo IPv4)port: la porta (intero)result: vedi sottoLa parte result ha la forma:
{{status, type},Value}
Dove {status, type} è una delle seguenti tuple:
{ok, result}: il fingerprinting del target è riuscito{error, up}: il fingerprinting non è riuscito ma il target ha risposto{error, unknown}: il fingerprinting è fallitoValue è il valore restituito - può essere un atomo o una lista di elementi
Scannerl è stato progettato e implementato pensando alla modularità. È facile aggiungere nuovi moduli:
Per creare nuovi moduli, segui semplicemente il comportamento (fp_module.erl per i moduli di fingerprinting e out_behavior.erl per i moduli di output) e implementa i tuoi moduli.
I nuovi moduli possono essere aggiunti in fase di compilazione o dinamicamente come file esterni.
Vedi la pagina wiki per maggiori informazioni.
Sentiti libero di aprire un issue o una PR.
Copyright(c) 2017 Nagravision SA.
Questo programma è software libero: puoi ridistribuirlo e/o modificarlo secondo i termini della GNU General Public License versione 3 pubblicata dalla Free Software Foundation.
Questo programma è distribuito nella speranza che sia utile, ma SENZA ALCUNA GARANZIA; senza nemmeno la garanzia implicita di COMMERCIABILITÀ o IDONEITÀ PER UN PARTICOLARE SCOPO. Vedi la GNU General Public License per maggiori dettagli.
Dovresti aver ricevuto una copia della GNU General Public License insieme a questo programma. In caso contrario, vedi http://www.gnu.org/licenses/.