Snort: Alertas geolocalizadas complejas

En mi anterior artículo expuse un ejemplo para geolocalizar determinadas alertas utilizando flowbits y un preprocesador o rangos de IP para identificar el país. El ejemplo terminaba con la búsqueda de una cadena de texto en un certificado SSL de una forma un poco “chapucera”.

Vamos a retomarlo desde este punto para buscar un certificado de una forma más ortodoxa. Para ello, se utilizará el preprocesador SSL/TLS (SSLPP).

El preprocesador SSLPP es más importante de lo que pueda parecer a priori, y lo sabrá la gente que administre Snort en redes con una alta tasa de tráfico, ya que no sólo permite extraer información de una comunicación SSL/TLS sino que, con la opción noinspect_encrypted dejará de analizar el tráfico marcado como cifrado, aumentando sensiblemente el rendimiento (especialmente en entornos cargados).

El uso es sencillo. Únicamente se definen los puertos en los que se procesará el tráfico (por defecto: 443 HTTPS, 465 SMTPS, 563 NNTPS, 636 LDAPS, 989 FTPS, 992 TelnetS, 993 IMAPS, 994 IRCS, 995 POPS) y dos modificadores. El primero, noinspect_encrypted, hace que no se procese el tráfico marcado como cifrado (aumentando el rendimiento). El segundo, trustservers, evita que sea necesario observar tráfico cifrado en ambos sentidos para marcar al comunicación como cifrada.

Bien, para usarlo en las reglas existen dos modificadores: ssl_version y ssl_state. Ambos son bastante autodescriptivos.

ssl_version: ["!"] "sslv2" | "sslv3" | "tls1.0" | "tls1.1" | "tls1.2"
ssl_state: ["!"] "client_hello" | "server_hello" | "client_keyx" | "server_keyx" | "unknown"

Retomando el ejemplo anterior:

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;)

Vemos que esta regla es bastante rudimentaria, ya que analiza cada paquete que viene del puerto 443, con lo que el rendimiento se ve afectado (sobre todo si no activamos la opción noinspect_encrypted). Como queremos capturar únicamente el certificado del servidor, vamos a hacerlo de forma más ortodoxa.

alert tcp $TAX_HAVEN 443 -> $HOME_NET any (msg:"S2 GEO Certificado SSL 
desde Paraiso Fiscal"; flow:established,to_client; flowbits:isset,s2.geo.taxhaven; 
ssl_state: server_hello; sid:3200004; rev:2;)

La idea para utilizar estas reglas es que, debido a que el tráfico viaja cifrado no sabemos la URL del servidor al que se conecta. De esta forma, viendo el certificado que nos presenta podremos deducir varios detalles del servidor contactado, incluyendo el dominio. Otra utilidad es para detectar posibles certificados suplantados; veríamos que el certificado en cuestión pertence a un dominio concreto pero proviene de una IP sospechosa.

A continuación se muestra una captura de BASE con la alerta (y el contenido) de un certificado SSL presentado por un servidor en un país sospechoso. Vemos que el dominio es s1.mi-img.com.

Haciendo una consulta vemos que el dominio pertenece a la IP desde la que proviene.

$ nslookup s1.mi-img.com
Non-authoritative answer:
s1.mi-img.com canonical name = s1.mi-img.gslb.mi-idc.com.
Name: s1.mi-img.gslb.mi-idc.com
Address: 183.61.237.6
Name: s1.mi-img.gslb.mi-idc.com
Address: 223.202.255.20
Name: s1.mi-img.gslb.mi-idc.com
Address: 58.68.235.14
Name: s1.mi-img.gslb.mi-idc.com
Address: 120.197.84.249
Name: s1.mi-img.gslb.mi-idc.com
Address: 123.129.222.196

En este caso, vemos que la conexión se realiza a dicho dominio (cosa que de otra forma no sabríamos) y que es quien dice ser (con lo que tampoco ha habido suplantación). Otra cosa es que pusiera *.facebook.com…

¿Alguien hace uso del preprocesador SSL/TLS para otras situaciones? ¿Se os ocurre alguna interesante?

Comments

  1. Mil gracias

  2. Valiosa información, ya que últimamente hemos visto muchas suplantaciones de certificados y es útil contar con herramientas que permitan saber si son confiables.