Snort: Sniffer y detector de intrusos

Snort es un sniffer de paquetes y un detector de intrusos basado en red (se monitoriza todo un dominio de colisión). Es un software muy flexible que ofrece capacidades de almacenamiento de sus bitácoras tanto en archivos de texto como en bases de datos abiertas como lo es MySQL. Implementa un motor de detección de ataques y barrido de puertos que permite registrar, alertar y responder ante cualquier anomalía previamente definida. Así mismo existen herramientas de terceros para mostrar informes en tiempo real (ACID) o para convertirlo en un Sistema Detector y Preventor de Intrusos.

Versiones de software

Sistema Operativo: Debian Jessie
Snort: snort-2.9.7.6

Instalación

Agregar los repositorios necesarios

vim /etc/apt/sources.list
deb http://repo.percona.com/apt jessie main
deb-src http://repo.percona.com/apt jessie main
deb http://packages.dotdeb.org jessie all
deb-src http://packages.dotdeb.org jessie all
Agregar las claves
cd /usr/src && wget http://www.dotdeb.org/dotdeb.gpg && cat dotdeb.gpg | apt-key add -
apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A

Y actualizar los repositorios

apt update

Instalar las dependencias necesarias

apt install apache2 autoconf automake bison ca-certificates ethtool flex git g++ gcc gcc-4.9 libapache2-mod-php5 libcrypt-ssleay-perl libmysqlclient-dev libnet1 libnet1-dev libpcre3 libpcre3-dev libphp-adodb libssl-dev libtool libwww-perl make percona-server-client-5.6 percona-server-common-5.6 percona-server-server-5.6 ntp php5-cli php5-gd php5-mysql php-pear sendmail sysstat usbmount iputils-ping

Añadir la siguientes líneas al archivo rc.local antes de exit0 (sustituir eth0 por la interfaz de vuestra máquina)

vim /etc/rc.local
ethtool --offload eth0 rx off tx off
ethtool -K eth0 gso off
ethtool -K eth0 gro off 

exit 0

Instalar los pre-requisitos de Snort (libcap, libdnet, DAQ)

Libpcap

 # cd /usr/src && wget http://www.tcpdump.org/release/libpcap-1.7.4.tar.gz
 # tar -zxvf libpcap-* && cd libpcap-*
 # ./configure --prefix=/usr && make && make install

Libdnet

cd /usr/src && wget http://libdnet.googlecode.com/files/libdnet-1.12.tgz
tar -zxvf libdnet-* && cd libdnet-*
./configure --prefix=/usr --enable-shared && make && make install

DAQ

cd /usr/src && wget https://www.snort.org/downloads/snort/daq-2.0.6.tar.gz
tar -zxvf daq-*.tar.gz && cd daq-*
./configure && make && make install

Actualizar la ruta de la librería

echo >> /etc/ld.so.conf /usr/lib
echo >> /etc/ld.so.conf /usr/local/lib && ldconfig

Instalar, configurar y probar snort

cd /usr/src && wget https://www.snort.org/downloads/snort/snort-2.9.7.6.tar.gz
tar -zxvf snort-*.tar.gz && cd snort-*
./configure --enable-sourcefire && make && make install
mkdir /usr/local/etc/snort /usr/local/etc/snort/rules /var/log/snort /var/log/barnyard2 /usr/local/lib/snort_dynamicrules
touch /usr/local/etc/snort/rules/white_list.rules /usr/local/etc/snort/rules/black_list.rules /usr/local/etc/snort/sid-msg.map
groupadd snort && useradd -r -g snort snort && passwd snort
chown snort:snort /var/log/snort /var/log/barnyard2 -R
cp /usr/src/snort-*/etc/*.conf* /usr/local/etc/snort
cp /usr/src/snort-*/etc/*.map /usr/local/etc/snort

Configuración

Editar el archivo de configuración de snort

vim /usr/local/etc/snort/snort.conf
Línea #45 - ipvar HOME_NET 192.168.1.0/24
Línea #48 - ipvar EXTERNAL_NET !$HOME_NET
Línea #104 - var RULE_PATH ./rules
Línea #109 - var WHITE_LIST_PATH ./rules
Línea #110 - var BLACK_LIST_PATH ./rules
Línea #519 - añadir esta nueva línea:  output unified2:  filename snort.log, limit 128
Línea #547 - comentar todas las include $RULE_PATH/ menos la primera include $RULE_PATH/local.rules

Crear la variable de la ruta de las reglas

RULE_PATH=/usr/local/etc/snort/rules/

Crear archivo local.rules y añadir una norma para probar

vim /usr/local/etc/snort/rules/local.rules
alert icmp any any -> $HOME_NET any (msg:"ICMP test"; sid:10000001; rev:1;)

Hacemos un testeo de la configuración

/usr/local/bin/snort -T -c /usr/local/etc/snort/snort.conf

Ejecutar el siguiente comando y generar trafico ICMP con un ping desde otra consola

/usr/local/bin/snort -A console -q -u snort -g snort -c /usr/local/etc/snort/snort.conf -i eth0

Si se genera algo así es que está bien configurado

02/09-11:29:43.450236 [**] [1:10000001:0] ICMP test [**] [Priority: 0] {ICMP} 172.26.12.1 -> 172.26.12.2
02/09-11:29:43.450251 [**] [1:10000001:0] ICMP test [**] [Priority: 0] {ICMP} 172.26.12.2 -> 172.26.12.1

Instalar y configurar Barnyard2 para aumentar el rendimiento y liberar a Snort de trabajos de proceso.

cd /usr/src/ && git clone https://github.com/firnsy/barnyard2 && cd barnyard2
autoreconf -fvi -I ./m4 && ./configure --with-mysql --with-mysql-libraries=/usr/lib/x86_64-linux-gnu && make && make install
mv /usr/local/etc/barnyard2.conf /usr/local/etc/snort
cp schemas/create_mysql /usr/src

Editar el archivo de configuración de barnyard2

vim /usr/local/etc/snort/barnyard2.conf

Línea #27 sustituir por /usr/local/etc/snort/reference.config
Línea #28 sustituir por /usr/local/etc/snort/classification.config
Línea #29 sustituir por /usr/local/etc/snort/gen-msg.map
Línea #30 sustituir por /usr/local/etc/snort/sid-msg.map
Línea #227 sustituir por output alert_fast
Añadir al final del archivo: output database: log, mysql, user=snort password=<contraseña> dbname=snort host=localhost

MySQL

Configurar Mysql

Securizar mysql

mysql_secure_installation

Crear la base de datos de snort y el usuario

mysql -u root -p
mysql> create database snort;
mysql> grant CREATE, INSERT, SELECT, DELETE, UPDATE on snort.* to snort@localhost;
mysql> SET PASSWORD FOR snort@localhost=PASSWORD('<contraseña>'); 
mysql> use snort;
mysql> source /usr/src/create_mysql
mysql> exit;

Iniciar Snort y barnyard con los siguientes comandos

/usr/local/bin/snort -q -u snort -g snort -c /usr/local/etc/snort/snort.conf -i eth0 &
/usr/local/bin/barnyard2 -c /usr/local/etc/snort/barnyard2.conf -d /var/log/snort -f snort.log -w /usr/local/etc/snort/bylog.waldo -C /usr/local/etc/snort/classification.config &

Comprobar que se añaden correctamente los eventos. Se puede hacer un ping desde otra máquina para ver que el contador sube

mysql -u root -p -D snort -e "select count(*) from event"

Apache y PHP

Configuración de apache y PHP

vim /etc/php5/apache2/php.ini
      Línea #449 – cambiar la línea error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE
a2enmod ssl
a2dissite default-ssl ; a2ensite default-ssl
pear config-set preferred_state alpha && pear channel-update pear.php.net
pear install --alldeps Image_Color2 Image_Canvas Image_Graph
/etc/init.d/apache2 restart

Instalar y configurar BASE

cd /usr/src && wget http://sourceforge.net/projects/secureideas/files/BASE/base-1.4.5/base-1.4.5.tar.gz
mkdir /var/www/html/base
tar -zxvf base-*.tar.gz && cd base* && cp -r * /var/www/html/base
chmod 777 /var/www/html/base -R

En el navegador https://IP/base y seguir los pasos de configuración.

Snortbarn

Crear el archivo snortbarn

vim /etc/init.d/snortbarn
#! /bin/sh
#
### BEGIN INIT INFO
# Provides: snortbarn
# Required-Start: $remote_fs $syslog mysql
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# X-Interactive: true
# Short-Description: Start Snort and Barnyard
### END INIT INFO
. /lib/init/vars.sh
. /lib/lsb/init-functions
mysqld_get_param() {
/usr/sbin/mysqld --print-defaults | tr " " "n" | grep -- "--$1" | tail -n 1 | cut -d= -f2
}
do_start()
{
log_daemon_msg "Starting Snort and Barnyard" ""
# Make sure mysql has finished starting
ps_alive=0
while [ $ps_alive -lt 1 ];
do
pidfile=`mysqld_get_param pid-file`
if [ -f "$pidfile" ] && ps `cat $pidfile` >/dev/null 2>&1; then ps_alive=1; fi
sleep 1
done
/sbin/ifconfig eth0 up
/usr/local/bin/snort -q -u snort -g snort -c /usr/local/etc/snort/snort.conf -i eth0 &
/usr/local/bin/barnyard2 -q -c /usr/local/etc/snort/barnyard2.conf -d /var/log/snort -f snort.log -w /usr/local/etc/snort/bylog.waldo -C /usr/local/etc/snort/classification.config 2> /dev/null &
log_end_msg 0
return 0
}
do_stop()
{
log_daemon_msg "Stopping Snort and Barnyard" ""
kill $(pidof snort) 2> /dev/null
kill $(pidof barnyard2) 2> /dev/null
log_end_msg 0
return 0
}
case "$1" in
start)
do_start
;;
stop)
do_stop
;;
restart)
do_stop
do_start
;;
*)
echo "Usage: snort-barn {start|stop|restart}" >&2
exit 3
;;
esac
exit 0

Darle permisos de ejecución y hacer que se inicie con el sistema

chmod +x /etc/init.d/snortbarn
insserv -f -v snortbarn

Pulledpork

Tener las reglas actualizadas con pulledpork

cd /usr/src && git clone https://github.com/shirkdog/pulledpork
cd pulledpork
cp pulledpork.pl /usr/local/bin && cp etc/*.conf /usr/local/etc/snort

Crearse una cuenta en snort para conseguir el oinkcode

vim /usr/local/etc/snort/pulledpork.conf
Línea 19: introducir el “oinkcode” donde aparece
Línea 26: introducir el “oinkcode” donde aparece
Línea 29: descomentar: rule_url=https://rules.emergingthreats.net/|emerging.rules.tar.gz|open-nogpl
Línea 133: cambiar a: distro=Debian-8-0
Línea 141: comentar la Blacklist
Líneas 196-199: descomentar
echo pcre:fwsam >> /usr/local/etc/snort/disablesid.conf # disables all block (fwsam) rules
chmod +x /usr/local/bin/pulledpork.pl
/usr/local/bin/pulledpork.pl -c /usr/local/etc/snort/pulledpork.conf -T –l

Limpiar el sistema despues de la instalación

rm /var/www/html/index.html
chmod 755 /var/www/html/base
pkill snort && pkill barnyard2
rm -rf /var/log/snort/* /var/log/barnyard2/*
vim /usr/local/etc/snort/rules/local.rules – Comentar la regla de prueba
vim /usr/local/etc/snort/snort.conf – Línea 544: añadir: include $RULE_PATH/snort.rules


Ref:

https://s3.amazonaws.com/snort-org-site/production/document_files/files/000/000/049/original/Debian___Snort_based_Intrusion_Detection_System.pdf?AWSAccessKeyId=AKIAIXACIED2SPMSC7GA&Expires=1420223669&Signature=FjGmxPiTERMqNuU1ofWvWRpl%2Fq8%3D
http://es.wikipedia.org/wiki/Snort

5 comments

  1. Buenas noches
    Tendran un manual como este adaptado para arch linux o manjaro, ya que algunas comandos son diferentes, quisiera implentarlo pero ya he intentado con varios tutoriales pero no funciona correctamentes
    Saludos

    1. Buenas,
      yo no te recomendaría instalar snort en un arch ya que es mucho mas complicado ya que tienes que compilar todos los paquetes uno a uno y a la hora de actualizar te va dar muchos mas problemas. Por eso te recomiendo hacerlo sobre una Debian.

  2. Buenas,
    He seguido el tutorial línea a línea pero cuando trato de iniciar el snortbart creado en /etc/init.d me aparece el siguiente error:

    /etc/init.d/snortbarn start
    [….] Starting snortbarn (via systemctl): snortbarn.serviceFailed to start snortbarn.service: Unit snortbarn.service failed to load: No such file or directory.
    failed!

    ¿Podrías ayudarme?
    Gracias y un saludo.

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *