Snort: Alertas geolocalizadas con flowbits

En esta ocasión voy a mostrar un ejemplo que sirva de idea sobre cómo utilizar reglas un poco más complejas en Snort para detectar actividades sospechosas en nuestra red basadas en geolocalización. Para ello, haremos uso de la opción flowbits en unas determinadas reglas para que salten cuando aparezcan algunos países que consideraremos como hostiles o peligrosos.

Entrando un poco en detalle, deciros que me basaré en el preprocesador de geolocalización que desarrolló nuestro compañero Joaquín Moreno (un saludo, Ximo ;)). De esta forma vamos a marcar las conversaciones con países que queramos destacar y activaremos un flowbit, que luego será comprobado por algunas reglas puntuales.

Para comenzar por la geolocalización podemos empezar por analizar las peticiones DNS realizadas por nuestros equipos hacia dominios de países hostiles:

alert udp $HOME_NET any -> $EXTERNAL_NET 53 (msg:”DNS Petición dominio en Islas Caiman”; 
flow:to_server; byte_test:1,!&,0xF8,2; content:"|03|ky|00|"; fast_pattern:only; 
sid: 3200001; rev:1;)

Esto podría alertar sobre una situación anómala pero no significa que la comunicación se establezca, ni siquiera si el servidor se encuentra en esa ubicación, aunque podemos utilizarla como un indicio más si contamos con un correlador de alertas. A continuación haremos uso del preprocesador de geolocalización para detectar comunicaciones hacia determinados países:

alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:”S2 GEO Conexión TCP a país 
sospechoso”; flow:established,to_server; country: [] -> [KY]; 
flowbits:set,s2.geo.taxhaven; flowbits:noalert; sid: 3200002; rev:1;)

Otra forma de geolocalizar, aunque mucho más costosa de mantener, es definir una variable indicando rangos de direcciones IP.

ipvar $TAX_HAVEN [63.136.112.0/21, 74.117.112.0/21, 74.117.216.0/21, 74.222.64.0/19, 
162.211.136.0/22, 73.225.208.0/20, 192.0.4.0/22, 198.147.208.0/22, 199.201.84.0/22, 
208.82.216.0/22, 208.157.144.0/21, 208.168.224.0/19, 209.27.52.0/22, 209.27.60.0/22, 
216.144.80.0/20]

alert tcp $HOME_NET any -> $TAX_HAVEN $HTTP_PORTS (msg:” S2 GEO Conexión TCP a país
 sospechoso”; flow:established,to_server; flowbits:set,s2.geo.taxhaven; 
flowbits:noalert; sid:3200003; rev:1;)

En ambos casos activamos el flowbits2.geo.taxhaven‘ y con el parámetro noalert le indicamos que no genere alerta. Esto no es necesario pero la alerta que nos interesa es la siguiente por lo que no queremos que nos alerte en este caso.

Ahora viene la regla compleja. Utilizaremos una regla que nos avise en caso de que un servidor nos presente un certificado SSL que contenga las palabras “Bank” o “Cayman Island”. Previamente, comprueba que el flowbits2.geo.taxhaven‘ está activo para esa conversación, es decir, no sólo el servidor dice ser de Islas Caimán sino que la IP está ubicada allí.

alert tcp $TAX_HAVEN 443 -> $HOME_NET any (msg:”S2 GEO Certificado SSL de Islas Caimán”;
 flow:established,to_client; flowbits:isset,s2.geo.taxhaven; content:“Bank”; 
content:“Cayman Island”; sid:3200004; rev:1;)

Todo esto tan sólo ha sido un ejemplo. Estoy seguro de que podréis adaptar estas reglas a aquellas situaciones en las que queráis añadir geolocalización. Particularmente, yo creo una regla por cada país hostil y utilizo un flowbitsbadcountry”. Por otro lado, creo reglas para que me alerten de descarga de ficheros o conexiones desde IPs críticas a una serie de países hostiles desde el punto de vista de ser fuente de frecuentes ataques de red (flowbits:isset,s2.geo.badcountry).

alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:”S2 GEO Conexión TCP a país 
sospechoso (Israel)”; flow:established,to_server; country: [] -> [IL]; 
flowbits:set,s2.geo.badcountry; flowbits:noalert; sid: 3200021; rev:1;) 
alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:”S2 GEO Conexión TCP a país 
sospechoso (Rusia)”; flow:established,to_server; country: [] -> [RU]; 
flowbits:set,s2.geo.badcountry; flowbits:noalert; sid: 3200022; rev:1;) 
alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:”S2 GEO Conexión TCP a país 
sospechoso (Ucrania)”; flow:established,to_server; country: [] -> [UA]; 
flowbits:set,s2.geo.badcountry; flowbits:noalert; sid: 3200023; rev:1;) 
alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:”S2 GEO Conexión TCP a país 
sospechoso (Lituania)”; flow:established,to_server; country: [] -> [LT]; 
flowbits:set,s2.geo.badcountry; flowbits:noalert; sid: 3200024; rev:1;)
[...]

NOTA: Por cuestión de rendimiento, el orden en el que se comprueba el flowbit es importante, por lo que en comunicaciones TCP se recomienda colocarlo inmediatamente después del parámetro flow.

Comments

  1. Muy interesante. El hecho de poder filtrar escuchas por países es algo que es de gran utilidad actualmente, solo que hay que echar mano de estadísticas recientes que indican que más de la mitad de las amenazas y ataques a nivel mundial provienen de 3 o 4 países.

    Saludos.

  2. Dos saludos a ti Nelo. Espero que os este dando buenos resultados :-P

Trackbacks

  1. […] En esta ocasión voy a mostrar un ejemplo que sirva de idea sobre cómo utilizar reglas un poco más complejas en Snort para detectar actividades sospechosas en nuestra red basadas en geolocalización….  […]

  2. […] En esta ocasión voy a mostrar un ejemplo que sirva de idea sobre cómo utilizar reglas un poco más complejas en Snort para detectar actividades sospechosas en nuestra red basadas en geolocalización….  […]