Se trata de un modulo que proporciona la capacidad de examinar el trafico HTTP, incluyendo URL’s, cookies, parámetros por GET/POST, character encodings, etc. Tiene la capacidad de detectar ataques realizados con herramientas como Nikto y Nessus, por lo que sin lugar a dudas, se trata de un modulo bastante útil en el campo de la seguridad de aplicaciones y servidores web.
Para habilitar este preprocessor se tienen dos módulos, uno para configuración global y otro para la configuración especifica de cada servidor web en el segmento de red, cada uno de esto módulos cuenta con determinadas opciones que permiten controlar el comportamiento de este preprocessor, a continuación se listan las opciones para cada uno.
http_inspect Global
Como su nombre lo indica, determina la funcionalidad global de HTTP Inspect, las opciones disponibles que destacan por su utilidad son:
iis_unicode_map <mapa> | Se trata de un fichero que le indica a HTTP Inspect como debe decodificar caracteres Unicode en el proceso de de-codificación de una petición, en el directorio <SNORT_DIR>/etc se encuentra el fichero unicode.map |
proxy_alert | Alerta sobre el uso del servidor proxy HTTP. Este preprocessor generará alertas sobre los usuarios que no utilizan los proxies pre-configurados o utilizan algún tipo de proxy independiente. |
compress_depth <numero> | Especifica la cantidad máxima de paquetes a descomprimir, el rango de valores esta entre 1 y 65535. por defecto es 1460 |
decompress_depth <numero> | Especifica la cantidad máxima de datos descomprimidos a obtener desde un paquete de datos comprimido, el rango de valores esta entre 1 y 65535. por defecto es 2920 |
http_inspect Server
Del mismo modo que se han indicado las propiedades para el modulo global, también se indican las propiedades mas interesantes para el modulo servidor, solamente se listan las mas importantes, sin embargo existen algunas otras que tal vez puedan ser de utilidad dependiendo del entorno, por este motivo se invita a leer la documentación oficial de Snort donde se detallan todas las opciones disponibles de este preprocessor.
profile <perfil> | Indica el perfil que utilizará HTTP Inspect para realizar los procesos de auditoria de las peticiones y respuestas HTTP, cada uno de estos perfiles están diseñados para que funcionen de una forma optima dependiendo del tipo de servidor web, sin embargo, es una propiedad opcional y no es necesaria para el correcto funcionamiento del modulo, los valores validos son: all: Normaliza las URI utilizando todas las técnicas de ataque disponibles y alerta sobre formas de evasión mas serias, con este perfil, se intenta detectar todos los tipos de ataques sin importar el tipo de servidor HTTPapache: Perfil para Servidores web Apache.iis: Perfil para servidores web ISS.iss4_0, iss5_0: Son idénticos al perfil ISS, la diferencia esta en que alerta si una URL tiene un encoding doble. |
ports {<puerto><puerto>} | Se trata de los puertos HTTP para decodificar peticiones en el servidor HTTP. Sin embargo, el trafico HTTPS es cifrado y no puede ser decodificado por HTTP Inspect. Para tratar con esto es necesario utilizar el preprocessor SSL que se verá en próximas entradas próximamente. |
extended_response_inspection | Por defecto la inspección de las respuestas no incluye algunos campos HTTP, con el uso de esta propiedad todos los campos HTTP son inspeccionados, todos estos campos son extraídos y almacenados en buffers, posteriormente se aplican distintas reglas sobre dichos buffers. |
enable_cookie | Permite la extracción de cookies desde peticiones HTTP y respuestas HTTP, Estas cookies extraídas son almacenadas en el buffer de cookies |
inspect_gzip | Con esta opción HTTP inspect descomprimirá ficheros comprimidos (gzip/deflate) que viajen en las respuestas. Para que esta propiedad funcione correctamente se debe activar la opción extended_response_inspection, por otro lado también depende de los valores indicados en las propiedades compress_depth y decompress_depthdefinidas en el modulo global, ya que el proceso de descompresión finalizará cuando se alcance uno de estos dos limites o cuando los datos sean descomprimidos por completo. |
unlimited_decompress | Con esta opción no se aplican restricciones para descomprimir datos comprimidos (inclusive aunque vengan partidos en distintos paquetes) la des-comprensión finalizará solamente cuando los datos sean descomprimidos por completo o cuando una secuencia de final de paquete sea recibida. Sin embargo la des-compresión en un único paquete aun se encuentra limitada por el valor de la propiedad compress_depth |
enable_xff | Con esta propiedad Snort podrá parsear y registrar la dirección IP original de cliente presentada en el X-Forwarded-For o True-Client-IP |
server flow depth <numero> | Indica el tamaño de respuesta del servidor a inspeccionar, cuando se encuentra activada la propiedad extended_response_inspection la inspección se aplicará al cuerpo de la respuesta HTTP y no a los Headers, cuando la propiedad extended_response_inspectionesta desactivada, la inspección aplicará a toda la respuesta incluyendo los headers. Esta opción es utilizada para balancear las necesidades de desempeño del IDS y el nivel de inspección necesario sobre los datos de la respuesta de servidores web.El rango de valores va desde -1 hasta 655535, donde el valor -1 indicará a Snort que ignore todo el trafico del lado del servidor para los puertos definidos en la propiedad ports cuando la propiedad extended_response_inspection esta desactivada, sin embargo cuando esta activada, Snort ignorará el cuerpo de la respuesta HTTP, pero no sus headers. Inversamente al valor de -1, con el valor de 0, Snort inspeccionará todos los campos HTTP definidos en la propiedad ports (lo que afectará el rendimiento general del IDS). Valores superiores a 0 le indicaran a Snort el número de bytes que debe inspeccionar en la respuesta del servidor.El valor por defecto es de 300 bytes, ya que frecuentemente los datos de los headers son menores a esta longitud, sin embargo este valor puede variar dependiendo de las particularidades especificas de cada entorno, por esta razón, en muchas ocasiones se ha recomendado establecer el máximo valor. |
client_flow_depth <numero> | Indica el tamaño de la petición del cliente que Snort inspeccionará, a diferencia de server_flow_depth, esta propiedad es aplicada al primer paquete de la petición HTTP y no esta basado en el flujo de una sesión TCP. El rango de valores para esta propiedad esta entre -1 y 1460 y el valor por defecto es de 300, con este valor Snort no intentará inspeccionar Cookies demasiado grandes que frecuentemente aparecen al final de los headers de muchas peticiones de clientes.El valor de -1 causa que Snort ignore todo el trafico del lado del cliente para los puertos especificados en la propiedad ports, Inversamente al significado del valor -1, cuando se indica el valor 0, Snort inspeccionara todo el trafico HTTP del lado del cliente en los puertos indicados en la propiedad ports, valores superiores a 0 indican el numero de bytes que inspeccionará Snort en el primer paquete de la petición del cliente. Del mismo modo que server_flow_depth, dependiendo de las particularidades del entorno en algunas ocasiones es recomendable establecer el valor máximo de 1460. |
post_depth <numero> | Especifica la cantidad de datos a inspeccionar en un post message del cliente, el valor puede ser establecido entre -1 y 65495. El valor por defecto es -1 lo que causa que Snort ignore todos los datos en el post message. Inversamente proporcional al valor -1, el valor 0 indicará a Snort que inspeccione todos los datos en el post message del cliente, valores superiores a 0 indican el numero de bytes a inspeccionar en el post message del cliente. |
ascii <yes|no> | Esta opción indica cuando decodificar caracteres ASCII codificados como por ejemplo “%2f” “%2e”, etc. Es muy frecuente que en las URL existan caracteres ASCII codificados, por lo tanto es recomendado tener esta característica desactivada para evitar que http inspect genere alertas relacionadas con esto. |
multi_slash <yes|no> | Esta opción normaliza múltiples slash en una linea, (URL o URI) dejando solamente uno valido, por ejemplo home///////////page es normalizado a home/page, esta opción permite generar una alerta cuando se detecta este tipo de comportamientos cuando esta activada. |
directory <yes|no> | Esta opción normaliza directorios transversales y autoreferenciables, por ejemplo: /home/./page, se normaliza a /home/page, o /home/../page se normaliza en /home/page.Especificando “yes” en esta opción se genera una alerta, sin embargo en algunos casos puede resultar en falsos positivos, puesto que algunos sitios web hacen referencia a directorios transversales. |
allow_proxy_use | Especificando esta opción, indica a HTTP Inspect que no genere alertas si la opción global proxy_alert esta activada, si la opción proxy_alert no se encuentra activada, esta propiedad no hace nada. La opción allow_proxy_use es una forma de restringir el uso no autorizado del proxy de un servidor autorizado |
no_alerts | Desactiva todas las alertas generadas por HTTP Inspect, sin embargo no tiene efecto alguno sobre las reglas definidas en Snort. |
oversize_dir_length <numero> | Establece el número máximo de caracteres permitido para la longitud de un directorio en una URL, si un directorio URL es mas amplio que este tamaño se genera una alerta, un valor recomendado es 300 esto limita las alertas de evasión de IDS como whisker -i 4 |
inspect_uri_only | Se trata de una opción que permite inspeccionar solamente la porción URI de una petición HTTP, dado que normalmente entre el 90% y 95% de los ataques se encuentran en dicha porción de las peticiones, se capturarán la mayoría de los ataques, por otro lado esta opción mejora el desempeño cuando se encuentra habilitada, sin embargo, no tiene en cuenta ninguna regla que utilice el “uricontent”, por ejemplo si se define la siguiente regla:alert tcp any any -> any 80 ( msg:»content»; content: «foo»; )y posteriormente se realiza la siguiente petición:get /pagina.htm http/1.0\r\n\r\nLo anterior no generará ninguna alerta. |
max_header_length <numero> | Se trata del valor máximo permitido para el header de una petición, las peticiones que excedan esta restricción generarán una alerta de “Long Header”, por defecto se encuentra desactivada, para activar esta propiedad se debe establecer un valor mayor a 0 y menor o igual 65535, especificando el valor de 0, indica que se desactiva la alarma. |
normalize_headers | Activa la normalización de headers HTTP, usando la misma configuración de los parámetros de normalización comunes, (multi slash, transversal directory, etc.) es útil para normalizar Referrer URI’s que podrían aparecer en el header HTTP. |
normalize_cookies | Activa la normalización de campos de Cookies usando la misma configuración de los parámetros de normalización comunes, (multi slash, transversal directory, etc.) es útil para normalizar Cookies codificadas |
normalize_utf | Activa la normalización para el cuerpo de las respuestas HTTP, donde el header “Content-Type” tiene un conjunto de caracteres ”utf-16le”, ”utf-16be”, ”utf-32le”, o ”utf-32be”. HTTP inspect normalizará estos valor a su forma de codificación de 8-bits generando una alarma en el caso de que bytes extras sean mayores a 0. |
max_headers <numero> | Indica el numero máximo de campos que puede contener el Header de una petición, las peticiones que superen este valor generaran una alerta de “Max Headers”. La opción se encuentra desactivada por defecto, para activarla, es necesario especificar un valor mayor a cero y menor o igual a 1024. Especificar el valor de 0 es igual que desactivar esta opción. |
http_methods <metodos> | Especifica métodos adicionales en las peticiones HTTP a parte de los chequeados por defecto en este preprocessor (GET y POST) Por ejemplo: http_methods { PUT TRACE CONNECT } |
Estas son solamente algunas de las opciones mas interesantes de este preprocessor, sin embargo existen otras que probablemente no son tan importantes en la mayoría de los casos por esta razón no se han comentado, sin embargo se recomienda revisar la guiá de Snort para mayor información.
HTTP INSPECT EN ACCIÓN
A continuación se enseñan ejemplos de configuración validos de este preprocessor utilizando algunas de las opciones anteriormente descritas y como se generan alertas sobre escaneos realizados con herramientas como Nikto.
Ejemplo Configuración Global.preprocessor http_inspect: \global iis_unicode_map unicode.map 1252 compress_depth 65535 decompress_depth 65535Ejemplos de Configuraciones de Servidor.1. Servidor por defecto (todos los servidores web), todos los perfiles, payload por el puerto 80
preprocessor http_inspect_server: \ server default profile all ports { 80 } NOTA: A parte de la configuración Global, HTTP Inspect también necesita tener como mínimo una configuración de Servidor por defecto (server default) que se utilizará para suplir configuraciones de cualquier otro servidor no especificado individualmente con un preprocessor http_inspect_server. 2. Servidor por IP, todos los perfiles, payload por el puerto 80 preprocessor http_inspect_server: \ server 192.168.1.34 profile all ports { 80 } 3. Servidor por IP (server 192.168.1.34); payload por el puerto 80 y 443 (ports { 80 443 }), parseo de URI no estricto (non_strict), char “null” no valido (non_rfc_char), 300 bytes a inspeccionar en la respuesta del servidor (server_flow_depth), Uso de Tab para delimitador de espacio en Apache (apache_whitespace), sin activación de normalización de directorios transversales (directory no), sin normalización de backslash a slash en IIS (iis_backslash no), Sin activar la emulación del esquema de codificación %u de IIS (u_encode no), sin activar la decodificación de caracteres ASCII codificados (ascii no), Activando la opción de detección de porciones de peticiones codificadas a un máximo de 500000 (chunk_length 500000), Activa la opción de usar caracteres no especificados en formato ASCII como valores validos cuando se decodifica valores UTF-8 (bare_byte yes), Activa la opción de doble decodificación (double_decode yes), Activa el uso del mapeo unicode de IIS (iis_unicode yes), Activa el delimitador especifico de IIS y Apache (iis_delimiter yes), Activa la normalización de múltiples slash (multi_slash no ), Activa la extracción de Cookies de la petición HTTP (enable_cookie), Activa la inspección extendida de la respuesta del servidor (extended_response_inspection), Activa la inspección de ficheros comprimidos que se transmiten en la respuesta del servidor (inspect_gzip), Activa la normalización del cuerpo de la respuesta HTTP (normalize_utf), Activa la opción de extracción de datos sin restricciones de tamaño de ficheros comprimidos transmitidos en la respuesta del servidor (unlimited_decompress), Especifica el valor máximo de inspección de mensajes post de un cliente (post_depth) preprocessor http_inspect_server: \ server 192.168.1.34 \ ports { 80 443 } \ non_strict \ non_rfc_char { 0x00 } \ server_flow_depth 300 \ apache_whitespace yes \ directory no \ iis_backslash no \ u_encode no \ ascii no \ chunk_length 500000 \ bare_byte yes \ double_decode yes \ iis_unicode yes \ iis_delimiter yes \ multi_slash no \ enable_cookie \ extended_response_inspection \ inspect_gzip \ normalize_utf \ unlimited_decompress \ post_depth 65495 |
Ahora bien, utilizando la ultima configuración establecida en el ejemplo anterior, se procede a ejecutar un escaneo simple con Nikto y de esta forma se podrá apreciar como Snort es capaz de detectar y alertar sobre el escaneo que se esta realizando contra el servidor web en cuestión:
>./nikto.pl -h 192.168.1.34 – Nikto v2.1.4—————————————————————————
+ Target IP: 192.168.1.34 + Target Hostname: adastra-VPCEB3C5E + Target Port: 80 + Start Time: 2011-06-21 23:15:56 ————————————————————————— + Server: Apache/2.2.16 (Debian) + Apache/2.2.16 appears to be outdated (current is at least Apache/2.2.17). Apache 1.3.42 (final release) and 2.0.64 are also current. + ETag header found on server, inode: 198499, size: 177, mtime: 0x4a4cb6f36ec48 + Allowed HTTP Methods: GET, HEAD, POST, OPTIONS + OSVDB-3092: /manual/: Web server manual found. + OSVDB-3268: /icons/: Directory indexing found. + OSVDB-3268: /manual/images/: Directory indexing found. + OSVDB-3233: /icons/README: Apache default file found. + 6448 items checked: 0 error(s) and 7 item(s) reported on remote host + End Time: 2011-06-21 23:16:10 (14 seconds) ————————————————————————— + 1 host(s) tested |
Las alertas generadas por Snort son las siguientes:
06/20-23:15:57.768367 [**] [119:14:1] (http_inspect) NON-RFC DEFINED CHAR [**] [Priority: 3] {TCP} 192.168.1.33:35643 -> 192.168.1.34:8006/20-23:16:03.545326 [**] [119:2:1] (http_inspect) DOUBLE DECODING ATTACK [**] [Priority: 3] {TCP} 192.168.1.33:35693 -> 192.168.1.34:80……………………….. |
Seguramente si el lector tiene conocimientos intermedios y/o avanzados sobre seguridad en aplicaciones web, los conceptos aquí indicados serán familiares, de otro modo, probablemente se encontrará perdido con el significado de algunas de las opciones que se han indicado anteriormente, de ser así, se aconseja profundizar un poco mas sobre seguridad en aplicaciones web, vectores de ataque en arquitecturas cliente-servidor y seguridad en servidores web.
Una excelente fuente de recursos y de documentos valiosos sobre el tema se encuentra en el sitio oficial de OWASP (The Open Web Application Security Project): https://www.owasp.org/index.php/Main_Page
Allí se encontrará documentación actualizada y muy interesante sobre seguridad en entornos web.