En temas de seguridad y protección de servidores, no existe nada mejor que proteger los mismos con aplicaciones de detección de intrusiones como Snort (https://www.snort.org/) o Suricata (http://suricata-ids.org/) u otras ofertas comerciales basadas tanto en hardware (firewalls) como Software (http://www.acunetix.com/) o servicios en la nube (https://www.cloudflare.com/) que actualizan con mayor regularidad sus bibliotecas y/o diccionarios de ataques, y están “más preparados” ante estas amenazas de la red Internet, por los que reaizar análisis de logs de Apache con Scalp! es una fantástica idea para prevenir y/o anticipar amenazas.
En esta ocasión les comparto un analizador de Logs muy sencillo, el cual propiamente, no es el más recomendado para “prevenir” ataques a un servidor Apache sino que más bien, su propósito es el de analizar potenciales huecos de seguridad o vulnerabilidades apoyándose de los registros (logs) que ha dejado atrás Apache para detectar aquellas áreas de oportunidad, mejora, e inclusive, vulnerabilidades propias de sistemas o aplicaciones desarrollados en PHP.
Scalp!, es un script analizador de logs del servidor Apache desarrollado en Phyton, que tiene como objetivo buscar problemas de seguridad. Su idea principal, es “leer” dentro de los registros de accesos al servidor para buscar patrones ataques potenciales mediante el envío de peticiones por los métodos HTTP/GET y HTTP/POST.
El sitio Web oficial de Scalp! es https://code.google.com/p/apache-scalp/.
Primeros pasos
Para los propósitos de este post, he de comentar que estoy realizando pruebas sobre Ubuntu Server 14.04. En este caso, tengo una instalación con Apache 2, PHP5 y MySQL para un servidor Web, en donde mis “logs”, se encuentran dentro del directorio /var/logs/apache2/access.log.
Con esto en consideración, lo primero que tenemos que hacer, es “descargar” el script de Scalp! en nuestro directorio favorito:
wget https://apache-scalp.googlecode.com/files/scalp-0.4.py
(Nota: te sugiero que visites regularmente la página de Scalp! para descargar la última versión actualizada).
Ahora, descargamos el archivo de expresiones regulares que utiliza PHP-IDS (otra estupenda herramienta para proteger a nuestras aplicaciones PHP) para combinarlo en su uso con Scalp! mediante el siguiente comando:
wget https://dev.itratos.de/projects/php-ids/repository/raw/trunk/lib/IDS/default_filter.xml --no-check-certificate
Ahora bien, con estos dos archivos descargados, vamos a hacer nuestro primer análisis de logs:
python scalp-0.4.py -l /var/log/apache2/access.log default_filter.xml -o scalp-output --html
En este caso, al ejecutar Scalp! por primera vez, me arrojó este mensaje de error:
The directory %s doesn't exist, scalp will try to create it
Loading XML file 'default_filter.xml'...
The rule '(?i:(\%SYSTEMROOT\%))' cannot be compiled properly
“Tuneando” nuestro fichero de patrones
Con respecto a la primera y segunda línea de error, no tenemos mayor problema. Más bien, el detalle que tenemos que resolver es que al parecer Phyton, no es capaz de “procesar” correctamente parte del contenido XML que descargamos de PHP-IDS. Para ello, la solución es muy sencilla, abrimos el archivo default_filter.xml con nuestro editor favorito:
nano default_filter.xml
Y alrededor de la línea 741, hay que cambiar (referencia: https://code.google.com/p/apache-scalp/issues/detail?id=8) esto:
(?i:(\%SYSTEMROOT\%))
…por esto:
(?:(\%[sS][yY][sS][tT][eE][mM][rR][oO][oO][tT]\%))
Iniciando Scalp!
Con lo anterior, guardamos los cambios, y volvemos a ejecutar el comando de Scap!
python scalp-0.4.py -l /var/log/apache2/access.log default_filter.xml -o scalp-output --html
A continuación, les aparecerá un mensaje como este, ante el cual, solo tenemos que esperar un poco (en función del tamaño de archivo de tu log o de las reglas que hayas pedido ejecutar):
Loading XML file 'default_filter.xml'...
Processing the file '/var/log/access.log'...
Scalp results:
Processed 491229 lines over 491413
Found 3175 attack patterns in 177.725208 s
Generating output in scalp-output/access.log_scalp_*
Ahora, solo tienes que ir al directorio scalp-output y “visualizar” en tu navegador en archivo generado para visualizar el reporte completo de patrones de ataque observados.
¡Esta herramienta es genial!
Goodie
Tecleando el comando:
python scalp-0.4.py --help
…podrás obtener la ayuda relacionada con otros patrones de uso de Scalp!.
Scalp the apache log! by Romain Gaucher - http://rgaucher.info
usage: ./scalp.py [--log|-l log_file] [--filters|-f filter_file] [--period time-frame] [OPTIONS] [--attack a1,a2,..,an]
[--sample|-s 4.2]
--log |-l: the apache log file './access_log' by default
--filters |-f: the filter file './default_filter.xml' by default
--exhaustive|-e: will report all type of attacks detected and not stop
at the first found
--tough |-u: try to decode the potential attack vectors (may increase
the examination time)
--period |-p: the period must be specified in the same format as in
the Apache logs using * as wild-card
ex: 04/Apr/2008:15:45;*/Mai/2008
if not specified at the end, the max or min are taken
--html |-h: generate an HTML output
--xml |-x: generate an XML output
--text |-t: generate a simple text output (default)
--except |-c: generate a file that contains the non examined logs due to the
main regular expression; ill-formed Apache log etc.
--attack |-a: specify the list of attacks to look for
list: xss, sqli, csrf, dos, dt, spam, id, ref, lfi
the list of attacks should not contains spaces and comma separated
ex: xss,sqli,lfi,ref
--output |-o: specifying the output directory; by default, scalp will try to write
in the same directory as the log file
--sample |-s: use a random sample of the lines, the number (float in [0,100]) is
the percentage, ex: --sample 0.1 for 1/1000
Si te interesa el tema, aquí puedes encontrar un estupendo artículo (en inglés) sobre una comparativa entre Snort y Suricata, los IDS (intrusion detection system) Open Source más populares. La liga es: http://wiki.aanval.com/wiki/Snort_vs_Suricata