Roberto Gómez Cárdenas rogomez@itesm.mx http://homepage.cem.itesm.mx/rogomez Lámina 1 Escrito por Martín Roesch (1998) fundador de sourcefire (www.sourcefire.com) Es una version ligera de IDS de red que se basa en libpcap, y corre en UNIX Gratuito Puede lograr búsquedas de contenido en paquetes de IP después a través de un logging, le avisa al administrador de seguridad si ha habido alguna actividad inusual Lámina 2 Cárdenas 1
SNORT Provee a los administradores de seguridad con la información suficiente para tomar decisiones adecuadas. Puede ayudar cuando se encuentran hoyos de seguridad y no se haya liberado su parche o cuando por pólitica de seguridad no se pueda instalar el parche sin antes ser probado. Disponible bajo la licencia GNU (General Public License) y su código fuente está disponible. Lámina 3 SNORT Sniffer basado en libpcap que puede ser utilizado como NIDS ya que cuenta con capacidad de analizar, a través de reglas, el contenido completo de cada paquete que circula por la red. Utiliza reglas definidas por el administrador de seguridad para buscar patrones y detectar actividad hostil (buffer overflows, STEALTH portscans, CGI attacks, etc.) dentro de la red. Existen bases de datos conocidas con las huellas de ataques más comunes (http://www.whitehats.com/ids/index.html) Lámina 4 Cárdenas 2
SNORT vs TCPdump Porqué se puede decir que SNORT no es un simple sniffer? SNORT es distinto a TCPdump ya que éste no tiene capacidad de analizar el payload de los paquetes. SNORT puede decodificar hasta la capa de aplicación, por lo tanto también, capa transporte, capa red, capa enlace. La salida que entrega SNORT es más legible que la entregada por TCPdump. Lámina 5 SNORT Los 3 elementos básicos de SNORT son: 1. decodificador de paquetes 2. motor de detección 3. subsistema de logeo y alerta Lámina 6 Cárdenas 3
Plataformas corre en casi cualquier versión de UNIX, incluyendo: Linux (originalmente desarrollado para y en) OpenBSD FreeBSD Solaris HP-UX AIX. Windows ( porque no? ) Plataformas de hardware como Sparc, Alpha y los x86. Lámina 7 Donde se obtiene Versión actual 2.6 Página snort http://www.snort.org Las firmas se pueden bajar de http://www.snort.org http://www.whitehats.ca http://www.silicondefense.com Lámina 8 Cárdenas 4
Bajar y compilar Instalando snort en ambientes Unix (.src.rpm,.rpm,.src.tar.gz) Reglas actuales Libnet (si no se tiene instalado) Unix: http://www.packetfactory.net/libnet Windows: netgroup-serv.polito.it Libpcap (si no se tiene instalado) Unix: Windows: www.tcpdump.org/release/libpcap netgroup-serv.polito.it/winpcap Lámina 9 Archivos instalados /root/downloads/snort-2.4.3/etc/ contiene los archivos de configuración /var/log/snort contendrá las bitácoras generadas por snort NO lo instala es necesario crearlo /usr/bin/snort contiene el ejecutable de snort Lámina 10 Cárdenas 5
Pasos previos para usar snort Crear el directorio de bitacoras mkdir /var/log/snort Bajar los archivos de reglas http://www.snort.org/pub-bin/downloads.cgi subscription release, registered user release, unregistered user release, Community Rules Instalar los archivos de reglas cd /root/downloads/snort-2.4.3/ tar -zxvf snortrules-pr-2.4.tar.gz se crearán dos directorios: ~/rules y ~/doc/signatures Trasladarse al directorio donde se encuentran las reglas y el archivo de configuracion cd /root/downloads/snort-2.4.3/etc snort Lámina 11 Una prueba rápida Ejecutar siguiente comando dentro del directorio /etc/snort toto@cognac:3> snort A console * Desde otra máquina, utilice nmap para generar eventos para que los detecte snort toto@tequila:3> nmap Sp <IP máquina con snort> Se debe ver una alerta como la que sigue: 03/27-15:18:06.911226 [**] [1:469:1] ICMP PING NMAP [**] [Classification: Attempted Information Leak] [Priority: 2] {ICMP} 192.168.1.20 -> 192.168.1.237 Lámina 12 * posible tener definir ubicación archivo configuracio: snort -A console -c etc/snort.conf Cárdenas 6
Modos operación snort sniffer solo lee los paquetes que circulan por la red y los despliega packet logger almacena paquetes en el disco network intrusion detection system analiza tráfico que coincida con una regla definida y realiza una determinada acción especificada en la regla Lámina 13 Modo sniffer snort v despliega los encabezados de los paquetes TCP/IP en la pantalla solo despliega los encabezados de IP y TCP/UDP/ICMP nada más snort vd despliega tanto los datos como los encabezados snort vde lo mismo que antes, y además despliega los encabezados de la capa de enlace Lámina 14 Cárdenas 7
Modo packet logger Posible almacenar paquetes en el disco, para lo cual es necesario especificar un directorio snort dev l./log Capturar paquetes relativos a la red 192.168.1.0 tipo C, todos los paquetes serán registrados en los subdirectorios del directorio log snort dev l./log h 192.168.1.0/24 En redes alta velocidad, es posible almacenar paquetes en forma más compacta (modo binario: formato tcpdump) snort l./log b Lámina 15 Leyendo lo almacenado Posible leer lo almacenado con un snifer que soporte fomato binario tcpdump tcpdump o ethereal Se puede usar snort con la opción r, que lo pone en modo playback Paquetes en formato tcpdump pueden ser procesados por snort snort dv r packet.log Lámina 16 Cárdenas 8
Modo NIDS Para habilitar el modo de detección de intrusos en red es necesario teclear: snort dev l./log h 192.168.1.0/24 c snort.conf donde snort.conf es el archivo de las reglas si no se especifica directorio salida, se tomará como default /var/log/snort No se recomienda la opción v En muchos casos no es necesario verificar los encabezados de enlace de datos snort d h 192.168.1.0/24 l./log -c snort.conf Lámina 17 Elementos configuración snort Existen tres formas de indicarle a como actuar snort.conf configura variables, preprocesadores, salidas y conjuntos de reglas activas archivos.rules define las huellas (signatures) actuales opciones a nivel línea de comandos, las cuales sobreescriben las opciones en el archivo snort.conf correrá con el archivo snort.conf por default se aconseja configurarlo de acuerdo a la actividad de la red monitoreada de esta forma se puede ahorrar tiempo al examinar los resultados Lámina 18 Cárdenas 9
Ejemplo archivo snort.conf # Step #1: Set the network variables: # var HOME_NET $eth0_address var EXTERNAL_NET $HOME_NET # Step #2: Configure preprocessors preprocessor frag2 preprocessor bo # Step #3: Configure output plugins # # output log_tcpdump: snort.log # output trap_snmp: alert, 7, trap -v 2c -p 162 mytraplistener mycommunity # Step #4: Customize your rule set include $RULE_PATH/finger.rules include $RULE_PATH/ftp.rules include $RULE_PATH/telnet.rules include $RULE_PATH/smtp.rules include $RULE_PATH/rpc.rules include $RULE_PATH/rservices.rules include $RULE_PATH/dos.rules include $RULE_PATH/ddos.rules include $RULE_PATH/dns.rules include $RULE_PATH/tftp.rules Lámina 19 Comentarios snort.conf La indica a snort: cual es la red local que herramientas usar para preprocesar paquetes paquetes fragmentados/defragmentados que herramientas usar para formatear las bitácoras de salida por ejemplo: habilitar XML Mayoría opciones: dejar la opción por default y solo ajustar la dirección red local, por ejemplo: var HOME_NET [192.168.1.0/24,10.120.0.0/16] Lámina 20 Cárdenas 10
Diseño reglas en snort Archivos y sintaxis Lámina 21 Archivos de reglas bad-traffic.rules exploit.rules scan.rules finger.rules ftp.rules telnet.rules smtp.rules rpc.rules rservices.rules dos.rules ddos.rules dns.rules web-coldfusion.rules web-cgi.rules tftp.rules web-frontpage.rules web-iis.rules web-misc.rules web-attacks.rules sql.rules x11.rules icmp.rules netbios.rules misc.rules backdoor.rules shellcode.rules policy.rules porn.rules info.rules icmp-info.rules attack-responses.rules local.rules virus.rules Lámina 22 Cárdenas 11
Ejemplo archivo.rules alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"icmp ISS Pinger"; content:" 495353504e475251 ";itype:8;depth:32; reference:arachnids,158; classtype:attempted-recon; sid:465; rev:1;) alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"icmp L3retriever Ping"; content: "ABCDEFGHIJKLMNOPQRSTUVWABCDEFGHI"; itype: 8; icode: 0; depth: 32; reference:arachnids,311; classtype:attempted-recon; sid:466; rev:1;) alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"icmp Nemesis v1.1 Echo"; dsize: 20; itype: 8; icmp_id: 0; icmp_seq: 0; content: " 0000000000000000000000000000000000000000 "; reference:arachnids,449; classtype:attempted-recon; sid:467; rev:1;) alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"icmp PING NMAP"; dsize: 0; itype: 8; reference:arachnids,162; classtype:attempted-recon; sid:469; rev:1;) alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"icmp icmpenum v1.1.1"; id: 666; dsize: 0; itype: 8; icmp_id: 666 ; icmp_seq: 0; reference:arachnids,450; classtype:attempted-recon; sid:471; rev:1;) Lámina 23 Comentarios reglas Si un paquete coincide con el criterio especificado por una regla lo almacena en un archivo de bitácora Si un paquete no coincide con ninguna regla no hace nada no es necesario preocuparse por el tráfico que snort no esta configurado para reconocer Posible aumentar las capacidades de snort incorporar reglas nuevas de los diferentes sitios que proporcionan una regla posible crear sus propias reglas Lámina 24 Cárdenas 12
Reglas de snort Flexibles y fáciles de modificar. Un ejemplo de regla: alert tcp any any -> 192.168.1.0/24 111 ( content:" 00 01 86 a5 ; msg mountd access ; ) Elementos antes paréntesis comprenden el encabezado de la regla. Elementos dentro paréntesis son las opciones de la regla palabras antes : son keywords esta sección no es forzosa para todas las reglas Lámina 25 Encabezados de las reglas Contiene información que define el quien, donde y que de un paquete la acción a tomar si un paquete cumple con la regla Formato: accion protocolo IP puerto -> IP puerto El primer elemento en una regla es la acción de la regla. Se tienen definidas acciones por default Lámina 26 Cárdenas 13
Acciones por default accion protocolo IP puerto -> IP puerto alert genera una alerta usando el método de alerta seleccionado y envía a una bitácora el paquete log envía a una bitácora el paquete pass ignora el paquete activate alerta y activa otro regla dinámica dynamic permanecer inactiva hasta activarse por otra regla, entonces actuar como una regla de tipo log Lámina 27 Protocolos accion protocolo IP puerto -> IP puerto Existen cuatro protocolos que snort analiza buscando un comportamiento sospechoso Los protocolos actuales son: TCP UDP ICMP IP Se piensa incluir en un futuro ARP,IGRP, GRE. OSPF, RIP, IPX Lámina 28 Cárdenas 14
Las direcciones IP accion protocolo IP puerto -> IP puerto Información dirección IP entrada y salida Palabra any puede definir cualquier dirección Operador negación! cualquier dirección excepto la especificada Lista de direcciones [ IP1, IP2,... IP3 ] Formadas por dirección numérica IP y bloque CIDR bloque CIDR indica el netmask que debe aplicarse a las direcciones de las reglas cada paquete que entra es probado contra la regla /24: red clase C, /16 red clase B, /32 dirección específica Lámina 29 Ejemplos direcciones Ejemplo dirección con bloque CIDR 192.168.1.0/24 bloque direcciones 192.168.1.0 a 192.168.1.255 Ejemplo negación alert tcp!192.168.1.0/24 any -> 192.168.1.0/24 111 \ ( content: 00 01 86 a5 ; msg: peligro ; ) Ejemplo rango direcciones: alert tcp![ 192.168.1.0/24, 10.1.1.0/24] any -> [ 192.168.1.0/24, 10.1.1.0/24] 111 \ ( content: 00 01 86 a5 ; msg: peligro ; ) Lámina 30 Cárdenas 15
Numeros de puerto accion protocolo IP puerto -> IP puerto Especificación del puerto de entrada y de salida. Pueden especificarse de varias formas any, puertos estáticos, rangos y negación Keyboard any: cualquier número de puerto Puertos estáticos: un solo número de puerto, (21 para ftp, 80 para http, 23 para telnet) Rangos puertos: operador : Negación puerto: operador! Lámina 31 Ejemplos números de puerto log udp any any -> 192.168.1.0/24 1:1024 tráfico proveniente de cualquier puerto y cuyo puerto destino varía entre 1 y 1024 log udp any any -> 192.168.1.0/24 :6000 tráfico proveniente de cualquier puerto dirigido a puertos menores o iguales a 6000 log udp any :1024 -> 192.168.1.0/24 500: tráfico proveniente de puertos privilegiados menores o iguales a 1024 dirigido a puertos mayores o iguales a 500 Lámina 32 Cárdenas 16
El operador de dirección accion protocolo IP puerto Indica la orientación o dirección del tráfico de la regla que se esta aplicando. Las direcciones y puertos del lado izquierdo corresponden a tráfico proveniente del host origen y del lazo derecho al host destino Existe un operador bidireccional <> considerar los pares dirección/puerto tanto en una orientación destino como origen usado para analizar una conversación de los dos lados (telnet, ftp, pop3) ejemplo -> IP puerto log!192.168.1.0/24 any <> 192.168.1.0/24 23 Lámina 33 Opciones de las reglas Forman el corazón de la máquina de detección de intrusión. Todas las opciones están separadas por el caracter ; Las keywords de las opciones están separadas por el carácter : Cuenta con 35 keywords Lámina 34 Cárdenas 17
Los keywords de las opciones msg logto ttl tos id ipoption fragbits dsize flags seq ack itype icode icmp_id icmp_seq content content-list offset depth nocase session rpc resp react reference sid rev classtype priority uricontent tag ip_proto sameip stateless regex Lámina 35 Significado algunos keywords Keyword msg logto ttl, tos, id flags rpc priority sameip content seq,ack Significado imprime un mensaje en las alertas y bitácoras envía paquete a archivo usuario en lugar archivo usual prueba los campos encabezado IP por un valor en específico prueba los valores de las banderas TCP prueba identificador de severidad de la regla verifica de la dirección fuente es igual a la destino busca por un patrón dentro del payload verifica en el campo TCP por un valor específico Lámina 36 Cárdenas 18
Aclaraciones sobre algunos keywords msg indican a la maquina de alerta y bitacoras el mensaje a imprimir con el paquete caracater \ para indicar carácter que pueda conincidir con las reglas de snort formato: msg: <texto mensaje> ejemplo: alert tcp any any -> any 21 ( msg: ataque sobre servidor ftp ) Lámina 37 Referencias y clasificación ataques reference referencias para sistemas externos de identificación de ataques sid identificación única de reglas de snort rev identificación de forma única de revisiones classtype clasifica alertas para formar clases de ataques priority asigna niveles de severidad a las reglas alert tcp any any -> any 80 (msg: Intento ataque a servicio HTTP ; reference:arachnids,ids411; classtype:attempted-admin; priority:10,; sid:1000983; rev:1); Lámina 38 Cárdenas 19
El keyword content content definición reglas buscan por contenido específico en el payload del paquete posible buscar por texto y datos binarios texto binario: encerrado entre caracteres pipe y representados en código hexadecimal varias reglas de contenido puede ser especificadas en una sola regla carácter! especificar que no se busca por dicho contenido formato: content: [!] "<content string>"; ejemplos: alert tcp any any -> any 139 (content:" 5c 00 P 00 I 00 P 00 E 00 5c ";) alert tcp any any -> any 80 (content:!"get";) Lámina 39 Parámetros de búsqueda de contenido nocase ignorar mayúsculas formato: nocas ejemplo: alert tcp any any -> any 21 (msg:"ftp ROOT"; content:"user root"; nocase;) rawbytes verificar datos paquetes raw, ignorando la decodificación hecha por los preprocesadores formato: rawbytes ejemplo: alert tcp any any -> any 21 (msg: "Telnet NOP"; content: " FF F1 "; rawbytes;) Lámina 40 Cárdenas 20
Definiendo profundidad de búsqueda depth especifica cuanto dentro del paquete debe ir a buscar el patrón especificado valor de 5 implica que busque los primeros 5 bytes del payload formato: depth: <number>; offset especifica donde empezar a buscar dentro de un paquete valor de 5 implica paquete busca después de 5 bytes dentro del paquete formato: offset: <number>; ejemplo: alert tcp any any -> any 80 (content: "cgi-bin/phf"; offset:4; depth:20;) Lámina 41 Hasta donde buscar distance especifica cuanto debe ignorar el paquete antes de empezar a buscar por el patrón especificado distancia relativa al match previo formatodistance: <byte count>; ejemplo: alert tcp any any -> any any (content:"abc"; content: "DEF"; distance:1;) within asegurarse que al menos N bytes se encuentran entre pattern matches usando content a usar en combinación con distance formato: within: <byte count>; ejemplo alert tcp any any -> any any (content:"abc"; content: "EFG"; within:10;) Lámina 42 Cárdenas 21
Ejemplo opciones reglas alert tcp any any -> 192.168.1.0/24 any ( flags: A; ack: 0; msg: Escaneo ping con NMAP ; reference: arachnids,28; classtype: attempetd-recon; sid:628; rev:1;) ) flags:a Establece el contenido de los flags o banderas TCP, en este caso ACK ack:0 Caso particular para valor ACK=0, es el valor que pone nmap para TCP ping scan. reference:arachnids,28 Referencia un a un Advisory, alerta tipo Bugtrac, etc. classtype:attempted-recon Categoría de la alerta según unos niveles predefinidos y prioridades sid:628 Identificación única para esta regla snort según unos tramos determinados. rev:1 Identificación de la revisión o versión de la regla. Lámina 43 Ejemplos reglas snort Un ejemplo de content alert tcp any any -> 192.168.1.9/24 143 ( content: 90C8 C0FF FFFF /bin/sh ; msg: IMAP buffer overflow ); Un ejemplo de rpc alert tcp any any -> 192.168.1.0/24 111 ( rpc: 100000,*,3; msg: RPC getport (UDP) ;) Infección de CodeRed alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS 80 ( msg: "WEB-IIS cmd.exe access"; flags: A+; content: "cmd.exe"; nocase; classtype: web-application-attack; sid: 1002; rev: 2; ) Lámina 44 Cárdenas 22
Más ejemplos de reglas Combinando varias opciones alert tcp $EXTERNAL_NET 27374 -> $HOME_NET any ( msg: "BACKDOOR subseven 22"; flags: A+; content: " 0d0a5b52504c5d3030320d0a "; reference: arachnids,485; reference: url.www.hackfix.org/subseven/; sid: 103; classtype: misc-activity; rev: 4; ) Un servidor de SQL Microsoft comprometido alert tcp $EXTERNAL_NET any -> $SQL_SERVERS 1433 ( msg: "MS-SQL xp_cmdshell - program execution"; content: "x 00 p 00 _ 00 c 00 m 00 d 00 s 00 h 00 e 00 l 00 l 00 "; nocase; flags: A+; classtype:attempted-user; sid:687; rev:3; ) Lámina 45 Las alertas Formatos Lámina 46 Cárdenas 23
Formato tcpdump Los formatos de las alertas 11:53:49:869667 eth0 > 192.168.0.231.12242 > 192.168.1.10.www: s 6373380:6373380(0) win 8192 <mss 1460, nop, nop, sackok> (DF) Formato snort [**] IDS024 RPC portmap-request-ttdbserv [**] 07/27 13:33:58.314512 10.0.0.69:896 -> 192.168.38.15:111 UDP TTL:64 TOS: 0x0 ID:33481 Len 64 [**] rwwwshell CGI access attempt [**] 06/10 07:55:01.284025 62.0.183.93:1526 -> 208.237.191.52:80 TCP TTL:64 TOS: 0x0 ID:4816 DF *****PA* Seq: 0xF3156AC9 Ack: 0x9B63081 Win: 0x7078 47 45 54 20 2F 63 67 69 2D 62 69 6E 2F 72 77 77 Get /cgi-su 77 73 68 65 6C 6C 2E 70 6C 20 48 54 54 50 2F 31 bin/rww 2E 30 0A 0A 02 00 00 00 wshell.pl Lámina 47 Formato TCPdump 11:53:49:869667 eth0 > 192.168.0.231.12242 > Tiempo Interfaz Dirección y puerto origen 192.168.1.10.www: s 6373380:6373380(0) win 8192 Dirección y puerto destino Flag Set Número de secuencia <mss 1460, nop, nop, sackok> (DF) Bytes en el paquete Tamaño en la ventana OPCIONES mss: Maximum Segment Size Don t Fragment Lámina 48 Cárdenas 24
Formato (1) [**] IDS024 RPC portmap-request-ttdbserv [**] Nombre de la alerta 07/27 13:33:58.314512 10.0.0.69:896 -> 192.168.38.15:111 Fecha y tiempo FUENTE DESTINO Dirección y puerto Dirección y puerto origen orientación destino tráfico UDP TTL:64 TOS: 0x0 ID:33481 tipo protocolo time to live tipo de servicio identificador de sesión Len 64 longitud Lámina 49 Formato (2) [**] rwwwshell CGI access attempt [**] Nombre de la alerta 06/10 07:55:01.284025 62.0.183.93:1526 -> 208.237.191.52:80 Fecha y tiempo FUENTE TCP TTL:64 TOS: 0x0 ID:4816 DF protocolo time to live servicio id sesión don t fragment DESTINO *****PA* Seq: 0xF3156AC9 Ack: 0x9B63081 Win: 0x7078 banderas # de secuencia # acknowledgement tamaño ventana 47 45 54 20 2F 63 67 69 2D 62 69 6E 2F 72 77 77 Get /cgi-su 77 73 68 65 6C 6C 2E 70 6C 20 48 54 54 50 2F 31 bin/rww 2E 30 0A 0A 02 00 00 00 wshell.pl HTTP/1.0... hex payload Formato comprensible por el humano Lámina 50 Cárdenas 25
Salidas de una sesion telnet Salida TCPdump de una sesión telnet Salida snort de una sesión telnet Lámina 51 Software relacionado Lámina 52 Cárdenas 26
Snarf ACID Demarc Ethereal SQL Software relacionado con snort y producido por terceros Lámina 53 Snarf Producido por Silicon Defense Es un programa en Perl que toma archivos de alertas de y produce reportes en formato HTML La salida esta dirigida a una inspección de diagnóstico Silicon Defense también proporciona sensores con soporte comercial Página: http: www.silicondefense.com/software/snortsnarf/ Lámina 54 Cárdenas 27
Lámina 55 ACID Analysis Console for Intrusion Databases (ACID) Máquina de análisis basada en PHP Busqueda y procesamiento en un base de datos de eventos de seguridad generados por diferentes IDSes, firewalls y herramientas de monitoreo de red. Generador de queries e interfaz de busqueda, visualizador de paquetes (decodificador), administrador de alertas, generador de gráficas y estadísticas Página: http://acidlab.sourceforge.net/ Lámina 56 Cárdenas 28
Lámina 57 Lámina 58 Cárdenas 29
Demarc Consola de administración de NIDS Integra con el poder y conveniencia de una interfaz centralizada para todos los sensores de red. Monitorea todos los servidores/hosts para asegurarse que servicios de red como correo y web permanezcan accesibles todo el tiempo. Monitorea bitacoras de sistema en busca de entradas anormales que pueden indicar intrusos o malfuncionamiento del sistema Página http://www.demarc.com Lámina 59 Lámina 60 Cárdenas 30
Lámina 61 Ethereal No es un elemento de Es uno de los mejores GUI, open source, para visualizar paquetes Paquetes http://www.ethereal.com Para windows: www.ethereal.com/distribution/win32/ethereal-setup- 0.9.2.exe Para Unix: www.ethereal.com/download.html Red Hat Linux RPMs: ftp.ethereal.com/pub/ethereal/rpms/ Lámina 62 Cárdenas 31
SQL Módulo para enviar salidas a una variedad de bases de datos SQL. Módulo desarrollado por Jed Pickel. Después es posible consultar la base de datos a través de queries los resultados dependen de la base de datos El formato es database: <log alert>, <database type>, <parameter list> Lámina 63 Cárdenas 32