Las reglas de Snort no funcionan como una regla típica basada en firmas, lo que trae como ventaja que puede detectar ataques de día 0 o zero days, ya que se basan en la detección de la vulnerabilidad real, no en un exploit o en un dato único. El desarrollo de una regla requiere una comprensión profunda de cómo funciona realmente la vulnerabilidad.
En nuestro anterior artículo (link aquí) realizamos la instalación de Snort en Kali 2021.2 mediante el gestor de paquetes apt-get, que por defecto instala la versión de snort 2.9.15.1, actualmente snort ya está en la versión 3.x, en una próxima publicación nos enfocaremos a la versión más reciente, por ahora seguiremos trabajando con la versión por default en Kali Linux 2021.2.
Iniciaremos haciendo una validación de nuestra configuración del fichero snort.conf para comprobar su correcto funcionamiento como se muestra a continuación:
┌──(root💀kali)-[/etc/snort]
└─# snort -c /etc/snort/snort.conf -T
Running in Test mode
--== Initializing Snort ==--
Initializing Output Plugins!
Initializing Preprocessors!
Initializing Plug-ins!
Parsing Rules file "/etc/snort/snort.conf"
PortVar 'HTTP_PORTS' defined : [ 80:81 311 383 591 593 901 1220 1414 1741 1830 2301 2381 2809 3037 3128 3702 4343 4848 5250 6988 7000:7001 7144:7145 7510 7777 7779 8000 8008 801
4 8028 8080 8085 8088 8090 8118 8123 8180:8181 8243 8280 8300 8800 8888 8899 9000 9060 9080 9090:9091 9443 9999 11371 34443:34444 41080 50002 55555 ]
PortVar 'SHELLCODE_PORTS' defined : [ 0:79 81:65535 ]
PortVar 'ORACLE_PORTS' defined : [ 1024:65535 ]
PortVar 'SSH_PORTS' defined : [ 22 ]
PortVar 'FTP_PORTS' defined : [ 21 2100 3535 ]
PortVar 'SIP_PORTS' defined : [ 5060:5061 5600 ]
PortVar 'FILE_DATA_PORTS' defined : [ 80:81 110 143 311 383 591 593 901 1220 1414 1741 1830 2301 2381 2809 3037 3128 3702 4343 4848 5250 6988 7000:7001 7144:7145 7510 7777 7779
8000 8008 8014 8028 8080 8085 8088 8090 8118 8123 8180:8181 8243 8280 8300 8800 8888 8899 9000 9060 9080 9090:9091 9443 9999 11371 34443:34444 41080 50002 55555 ]
PortVar 'GTP_PORTS' defined : [ 2123 2152 3386 ]
...
Snort successfully validated the configuration!
Snort exiting
Ejemplo de una regla avanzada para detectar una vulnerabilidad (CVE-2020-1350):
alert tcp any 53 -> any any (msg: "Potential exploit attemp to CVE-2020-1350"; \
sid:1; \
flow:from_server,established; \
content: "|00 00 18 00 01 C0|"; \
offset:0; \
depth: 70; \
content:"|00 18 00 01|"; \
distance: 1; \
within: 4; \
content: "|9E 04|"; \
distance: 0; \
reference: url, https://github.com/maxpl0it/CVE-2020-1350-DoS)
Ejecución de Snort en modo IDS
┌──(root💀kali)-[/etc/snort]
└─# snort -A console -c /etc/snort/snort.conf -v
Running in IDS mode
--== Initializing Snort ==--
Initializing Output Plugins!
Initializing Preprocessors!
Initializing Plug-ins!
Parsing Rules file "/etc/snort/snort.conf"
PortVar 'HTTP_PORTS' defined : [ 80:81 311 383 591 593 901 1220 1414 1741 1830 2301 2381 2809 3037 3128 3702 4343 4848 5250 6988 7000:7001 7144:7145 7510 7777 7779 8000 8008 801
4 8028 8080 8085 8088 8090 8118 8123 8180:8181 8243 8280 8300 8800 8888 8899 9000 9060 9080 9090:9091 9443 9999 11371 34443:34444 41080 50002 55555 ]
PortVar 'SHELLCODE_PORTS' defined : [ 0:79 81:65535 ]
PortVar 'ORACLE_PORTS' defined : [ 1024:65535 ]
PortVar 'SSH_PORTS' defined : [ 22 ]
PortVar 'FTP_PORTS' defined : [ 21 2100 3535 ]
PortVar 'SIP_PORTS' defined : [ 5060:5061 5600 ]
PortVar 'FILE_DATA_PORTS' defined : [ 80:81 110 143 311 383 591 593 901 1220 1414 1741 1830 2301 2381 2809 3037 3128 3702 4343 4848 5250 6988 7000:7001 7144:7145 7510 7777 7779
8000 8008 8014 8028 8080 8085 8088 8090 8118 8123 8180:8181 8243 8280 8300 8800 8888 8899 9000 9060 9080 9090:9091 9443 9999 11371 34443:34444 41080 50002 55555 ]
PortVar 'GTP_PORTS' defined : [ 2123 2152 3386 ]
Detection:
Search-Method = AC-Full-Q
Split Any/Any group = enabled
Search-Method-Optimizations = enabled
Maximum pattern length = 20
Tagged Packet Limit: 256
Reglas de Snort 3
La antigua sintaxis de Snort 2 fue un estándar en la industria para definir firmas durante mucho tiempo, una cosa un poco molesta en la antigua versión era la necesidad de referenciar las redes y los puertos en el header. Para ello se necesitaba definir varias reglas basadas en estos dos aspectos lo que daba como resultado varias reglas para realizar básicamente la misma tarea en diferentes protocolos.
Ejemplo de una regla de Snort 2. Si queremos bloquear un archivo para múltiples protocolos necesitábamos crear múltiples reglas:
alert tcp $EXTERNAL_NET $FILE_DATA_PORTS -> $HOME_NET any (msg:"MALWARE-OTHER Win.Ransomware.Agent payload download attempt"; flow:to_client,established file_data; content:"secret_encryption_key"; metadata:service ftp-data, service http; classtype:trojan-activity; sid:1;)
alert tcp $EXTERNAL_NET any -> $SMTP_SERVERS 25 (msg:"MALWARE-OTHER Wi Ransomware.Agent payload download attempt"; flow:to_server,established; file_data content:"secret_encryption_key"; metadata:service smtp;> classtype:trojan-activity sid:2;)
Snort 3 simplifica este proceso al introducir encabezados de reglas simplificados, encabezados de reglas de servicio y encabezado de reglas de archivos. Estos nuevos formatos de encabezados hacen que las reglas sean independientes de la red y puerto.
El resultado es que podemos combinar varias reglas de Snort 2 en una sola regla de Snort 3.
alert file (msg:"MALWARE-OTHER Win.Ransomware.Agent payload download attempt";
file_data;
content:"secret_encryption_key",fast_pattern,nocase;
classtype:trojan-activity; sid:3;)
Esta nueva característica no solo es excelente desde el punto de vista de las operaciones, sino también en cuanto al rendimiento. Nuestra base de reglas se simplifica, liberando recursos y optimizando su rendimiento.
Migración de Reglas
Existe una herramienta desarrollada por el equipo de Snort que nos ayudará a convertir la sintaxis de las reglas de Snort 2.x a en la nueva sintaxis escrita en Lua. Snort2lua se puede encontrar en tools/snort2lua del repositorio oficial. Para ello será necesario nuestra antigua configuración (snort.conf):
snorty@snort3:/tmp/tmp.LjyLQ9CIKi$ snort2lua -c snort2.conf
El siguiente comando convertirá una regla de Snort 2.x que sea compatible con Snort 3.x:
snort2lua -c web-attacks-2.rules -r web-attacks-3.rules
Escrito Por:
Jesús Flores
Security Engineer