Snort su macOS

Snort e' uno dei piu' conosciuti ed utilizzati IDS (Intrusion Detection Systems).
In questa paginetta vediamo come installarlo ed utilizzarlo su Mac, ma quanto descritto vale anche per altri sistemi operativi *n*x.

Nel seguito sono riportate alcune informazioni di interesse organizzate in paragrafi specifici: Introduzione, Installazione, Utilizzo, Regole, Varie ed eventuali.

Introduzione

Snort logo - un porcellino dal naso sensibile Snort e' un software Open Source per l'analisi dei pacchetti all'interno di una rete. Snort e' stato creato nel 1998 da Martin Roesch ed e' mantenuto dalla Sourcefire (che e' stata acquisita da Cisco nel 2013).

Snort e' il piu' utilizzato NIDS (Network Intrusion Detection Systems) ed e' quindi un punto di riferimento per la sicurezza, in particolare per l'analisi del traffico di rete.

Il funzionamento e' relativamente semplice: Snort analizza il traffico di rete arrivando fino al livello applicativo e scopre i tentativi di sfruttare eventuali vulnerabilita' del software (exploit) segnalandoli sul log, attivando un allarme o semplicemente visualizzandoli:

02/14-15:02:18.380474 [**] [1:30040:3] SQL 1 = 1 - possible sql injection attempt [**] [Classification: Web Application Attack] [Priority: 1] ...

L'analisi del traffico si basa su regole che debbono essere aggiornate per essere efficaci. Snort inoltre e' estensibile con plugin esterni e diversi altri programmi utilizzano i suoi risultati per memorizzarli in un SIEM (Security Information and Event Management).

Installazione

Per l'installazione su macOS X utilizziamo Homebrew che rende il tutto molto semplice, basta un comando:
 brew install snort

Ecco il dettaglio:

$ brew install snort
==> Downloading https://homebrew.bintray.com/bottles/snort-2.9.11.1.high_sierra.bottle.tar.gz
Already downloaded: /Users/meo/Library/Caches/Homebrew/snort-2.9.11.1.high_sierra.bottle.tar.gz
==> Pouring snort-2.9.11.1.high_sierra.bottle.tar.gz
==> Caveats
For snort to be functional, you need to update the permissions for /dev/bpf*
so that they can be read by non-root users.  This can be done manually using:
    sudo chmod o+r /dev/bpf*
or you could create a startup item to do this for you.
==> Summary
🍺  /usr/local/Cellar/snort/2.9.11.1: 271 files, 6.6MB

Gia' fatto!
Naturalmente chi non ha un Mac non utilizza il comando brew ma scarica il software dal sito ufficiale.

Ora possiamo lanciarlo...

$ snort Running in packet dump mode --== Initializing Snort ==-- Initializing Output Plugins! ... --== Initialization Complete ==-- ,,_ -*> Snort! <*- o" )~ Version 2.9.11.1 GRE (Build 268) '''' By Martin Roesch & The Snort Team: http://www.snort.org/contact#team Copyright (C) 2014-2017 Cisco and/or its affiliates. All rights reserved. Copyright (C) 1998-2013 Sourcefire, Inc., et al. ... Commencing packet processing (pid=49104) =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 02/10-12:17:50.711617 8.8.8.8:53 -> 192.168.1.8:64956 UDP TTL:64 TOS:0x0 ID:0 IpLen:20 DgmLen:205 DF Len: 177 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ ...

Per interromperlo basta un Ctrl-C e viene riportato un prospetto riassuntivo dei pacchetti visualizzati.

===============================================================================
Run time for packet processing was 5.237161 seconds
Snort processed 19 packets.
Snort ran for 0 days 0 hours 0 minutes 5 seconds
   Pkts/sec:            3
===============================================================================
Packet I/O Totals:
   Received:           32
   Analyzed:           19 ( 59.375%)
    Dropped:            0 (  0.000%)
   Filtered:            0 (  0.000%)
Outstanding:           13 ( 40.625%)
   Injected:            0
===============================================================================
Breakdown by protocol (includes rebuilt packets):
        Eth:           19 (100.000%)
       VLAN:            0 (  0.000%)
        IP4:           19 (100.000%)
       Frag:            0 (  0.000%)
       ICMP:            0 (  0.000%)
        UDP:            2 ( 10.526%)
        TCP:           17 ( 89.474%)
        IP6:            0 (  0.000%)
    IP6 Ext:            0 (  0.000%)
   IP6 Opts:            0 (  0.000%)
      Frag6:            0 (  0.000%)
      ICMP6:            0 (  0.000%)
       UDP6:            0 (  0.000%)
       TCP6:            0 (  0.000%)
     Teredo:            0 (  0.000%)
    ICMP-IP:            0 (  0.000%)
    IP4/IP4:            0 (  0.000%)
    IP4/IP6:            0 (  0.000%)
    IP6/IP4:            0 (  0.000%)
    IP6/IP6:            0 (  0.000%)
        GRE:            0 (  0.000%)
    GRE Eth:            0 (  0.000%)
   GRE VLAN:            0 (  0.000%)
    GRE IP4:            0 (  0.000%)
    GRE IP6:            0 (  0.000%)
GRE IP6 Ext:            0 (  0.000%)
   GRE PPTP:            0 (  0.000%)
    GRE ARP:            0 (  0.000%)
    GRE IPX:            0 (  0.000%)
   GRE Loop:            0 (  0.000%)
       MPLS:            0 (  0.000%)
        ARP:            0 (  0.000%)
        IPX:            0 (  0.000%)
   Eth Loop:            0 (  0.000%)
   Eth Disc:            0 (  0.000%)
   IP4 Disc:            0 (  0.000%)
   IP6 Disc:            0 (  0.000%)
   TCP Disc:            0 (  0.000%)
   UDP Disc:            0 (  0.000%)
  ICMP Disc:            0 (  0.000%)
All Discard:            0 (  0.000%)
      Other:            0 (  0.000%)
Bad Chk Sum:            0 (  0.000%)
    Bad TTL:            0 (  0.000%)
     S5 G 1:            0 (  0.000%)
     S5 G 2:            0 (  0.000%)
      Total:           19
===============================================================================
Snort exiting

Utilizzo (packet dump e packet logger mode)

Lanciato senza parametri come abbiamo appena fatto Snort visualizza semplicemente i pacchetti che passano in rete: packet dump mode [NdA come il tcpdump]. Possono essere utilizzate alcune opzioni come snort -ved che visualizzano i data header, il livello data link ed i dati rispettivamente.

Altro uso di Snort e' quello di packet logger; basta lanciarlo con l'opzione -l che indica la directory in cui scaricare il traffico rilevato (che viene suddiviso per IP). Spesso viene anche utilizzata l'opzione -b che utilizza il formato binario compatibile con tcpdump [NdA in questo modo il log e' compatibile con tutti gli sniffer che riconoscono tale formato come Wireshark].

Ma e' soprattutto l'esecuzione di Snort in modalita' NIDS (Network Intrusion Detection Systems) ad essere importante:
 snort -b -A fast -c /usr/local/etc/snort/snort.conf

In questa modalita' Snort legge il file di configurazione snort.conf che contiene le regole per l'analisi dei pacchetti.
Il file snort.conf contiene tipicamente le variabili di base ed effettua l'inclusione di decine di file di regole (eg. server-mysql.rules). La sintassi prevede alcune direttive come: include var config preprocessor output. Ma sono soprattutto le Rules che sono importanti.

Rules

Le regole di Snort (rules) consentono di effetturare l'analisi del traffico arrivando anche alla 0-day detection. Infatti, a differenza delle signatures che e' la tecnica piu' usata dagli antivirus, le rules vanno tipicamente alla ricerca della vulerabilita' e non dell'exploit. Sviluppare una regola richiede una profonda comprensione della vulnerabilita' ed ovviamente del processing di Snort.

La seguente e' una regola che controlla presenza della stringa ../../../ quando si accede ad un DNS (porta 53) che e' un noto exploit sul bind:

alert tcp $EXTERNAL_NET any -> $HOME_NET 53 \
 (msg:"DNS EXPLOIT named 8.2->8.2.1"; flow:to_server,established; \
 content:"../../../"; reference:bugtraq,788; reference:cve,1999-0833; \
 classtype:attempted-admin; sid:258; rev:6;)

La struttura di una regola e' semplice:

Anche se apparentemente semplici le regole in realta' sono un poco piu' complesse per evitare troppi falsi positivi. La regola seguente ricerca il test 1=1 tipico degli attacchi di SQL injection:

alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:"SQL 1 = 1 - possible sql injection attempt"; \
 flow:to_server,established; content:"1=1"; fast_pattern:only; http_uri; pcre:"/(and|or)[\s\x2f\x2A]+1=1/Ui"; \
 metadata:policy balanced-ips drop, policy max-detect-ips drop, policy security-ips drop, service http; \
 reference:url,ferruh.mavituna.com/sql-injection-cheatsheet-oku/; classtype:web-application-attack; sid:19439; rev:9;)

In questo caso oltre al messaggio ed ai riferimenti del tentativo di exploit viene utilizzata l'opzione pcre (Perl Compatible Regular Expression) per introdurre ulteriori controlli sul pacchetto dati oltre al semplice content.

Le regole vengono tipicamente scaricate dal sito ufficiale. Per gli utenti che hanno una sottoscrizione [NdA a pagamento] sono disponibili le regole piu' aggiornate, comprese quelle 0-day, per gli utenti registrati [NdA senza alcun costo] sono disponibili gli snapshot il mese successivo, ed infine sono disponibili a tutti le community-rules.

Quando Snort viene avviato in modalita' NDIS legge il file snort.conf e tutti gli include ottimizzando i propri filtri per applicare tutte le regole abilitate: si tratta della fase di inizializzazione che puo' durare anche qualche minuto. Al termine dell'inizializzazione Snort si mette in ascolto delle porte di rete analizzando tutto il traffico ricevuto e visualizzando eventuali allarmi. Ecco il comando per il lancio in modalita' NDIS:

snort -b -A console -c /Users/meo/snortrules/etc/snort.conf

Ed ecco cosa viene rilevato se tentiamo un attacco:

02/14-15:02:18.380474  [**] [1:30040:3] SQL 1 = 1 - possible sql injection attempt [**] [Classification: Web Application Attack] [Priority: 1] {TCP} 192.168.1.2:49876 -> 6.9.69.696:80

Policy

Controllando il contenuto dei file di rules inclusi da snort.conf si notera' che la maggior parte delle regole sono commentate! Ma allora Snort controlla solo pochi eventi?
In effetti si, ma qui entrano in gioco le policy:

Le direttive possono essere alert o drop... con ovvio significato!

Una nota importante: l'utilizzo di un IDS per quanto potente ed aggiornato come Snort, puo' fare molto poco se il parco macchine da proteggere non e' correttamente configurato e non viene aggiornato periodicamente alle ultime versioni del SW.

Varie ed eventuali

Sono molti i SIEM (Security Information and Event Management) che includono Snort: tra i prodotti Open Source sono molto diffusi OSSIM e Prelude mentre AANVAL e' un SIEM commerciale noto per il supporto di Snort [NdE oltre che di syslog e suricata].


Titolo: Snort su macOS
Livello: Esperto (4/5)
Data: 14 Febbraio 2018
Versione: 1.0.0 - 14 Febbraio 2018
Autore: mail [AT] meo.bogliolo.name