Defiende tu sitio web con ¡bombas zip!

Hoy en el blog de Christian Haschek leía una curiosa contramedida contra escáneres de vulnerabilidades web automáticos. Se trata de servir una bomba zip (en formato gzip para que lo "entiendan" los navegadores web) para que, cuando el servidor detecte actividad de una estas herramientas automáticas, envíe el archivo para que sea procesado y agote los recursos (memoria y disco) de la máquina del atacante.

Para crear una bomba sencilla, un fichero lleno de ceros, podemos ejecutar el siguiente comando desde la consola:
$ dd if=/dev/zero bs=1M count=10240 | gzip > 10G.gzip
10240+0 records in
10240+0 records out
10737418240 bytes (11 GB, 10 GiB) copied, 67,6557 s, 159 MB/s

$ du -sh 10G.gzip 
10M    10G.gzip

Como veis, hemos creado un fichero de 10M que se convertirá en 10GB al descomprimirse. Ahora, para construir una simple defensa simplemente usa un pequeño script que, dependiendo del User-Agent, enviará la "bomba" creada:
<?php
$agent = lower($_SERVER['HTTP_USER_AGENT']);

//check for nikto, sql map or "bad" subfolders which only exist on wordpress
if (strpos($agent, 'nikto') !== false || strpos($agent, 'sqlmap') !== false || startswith($url,'wp-') || startswith($url,'wordpress') || startswith($url,'wp/'))
{
      sendBomb();
      exit();
}

function sendBomb(){
        //prepare the client to recieve GZIP data. This will not be suspicious
        //since most web servers use GZIP by default
        header("Content-Encoding: gzip");
        header("Content-Length: ".filesize('10G.gzip'));
        //Turn off output buffering
        if (ob_get_level()) ob_end_clean();
        //send the gzipped file to the client
        readfile('10G.gzip');
}

function startsWith($haystack,$needle){
    return (substr($haystack,0,strlen($needle)) === $needle);
}

Como dice su autor, no es la "panacea" puesto que todos sabemos que cambiar el User-Agent es trivial, pero ya supondría una molestia para script kiddies y podrían implementarse otros triggers (por número de peticiones, IPs o países, payloads, etc.).

El resultado dependiendo del navegador o herramienta utilizada sería el siguiente:

- IE 11: se incrementa la memoria, IE se bloquea
- Chrome: se incrementa la memoria, se muestra un error
- Edge: se incrementa la memoria, luego drippea y carga en bucle
- Nikto: parece escanear bien pero no reporta nada (ninguna salida)
- SQLmap: alto uso de memoria hasta que se bloquea

Fuente: How to defend your website with ZIP bombs

7 comentarios :

  1. Oye, pues es una opción que estuvo en nuestra cara todo el tiempo y (al menos nosotros), no nos dimos cuenta.
    Se me ocurre meterlo en la lista de robots.txt para que la araña vaya como una idiota hacia la trampa. Con eso se acabó el problema del User-Agent. ¿No? Siempre tengo la sensación de que se me escapa algo...

    ResponderEliminar
    Respuestas
    1. el robots.txt precisamente le dice a las "arañas" de los motores de búsqueda los sitios que NO deben rastrear, así que sería lo contrario. Aunque quizás algún escáner automática precisamente vaya hacer el crawling en esos recursos de forma intencionada...
      Pero yo me iría a algo más sencillo, por ejemplo alojar el código de la función del envío de la bomba zip en recursos predecibles que se encuentran en diccionarios comunes que utilizan muchas herramientas en la fase de descubrimiento.

      Saludos

      Eliminar
    2. El robots.txt es para las arañas de indexado, pero los escáneres de vulnerabilidades lo revisan y marcan el contenido como objetivo a revisar. Al menos los automáticos de BurpSuite y Zap lo hacen.
      Yo me vi troleado por un javascript trampa de esta manera. Sólo tuve que añadirlo a la lista de exclusions, pero es tan fácil como cambiar el user-agent.

      Eliminar
    3. por eso, una buena idea sería dejar estas "trampas" en recursos predecibles presentes en diccionarios para el fuzzing de directorios (dirb, wfuzz, etc.) . Evidentemente no estarían enlazados en la aplicación y sólo se descubriría al hacer este tipo de reconocimiento, independientemente del user-agent.

      Saludos!

      Eliminar
    4. También, también. Además podemos plagar el sitio con estas trampitas, que no pesan demasiado ni nos costará demasiada transferencia de subida de nuestro hosting (En caso de haberlo).
      Lo que me pregunto es si entrarán en un 'href' que metamos en una division oculta. Si la encuentra buscando en el código fuente que pique, pero que el enlace no aparezca en la interfaz de cualquier usuario que entre.
      Tengo que hacer unas cuantas pruebas, que este tema me está despertando la imaginación.

      Eliminar
  2. Genial y esto serviría para introducirse en un blogger y aria el mismo resultado o no pasaría nada, y si se puede en que parte lo podría alojar ? En que parte podría colocar el código?

    ResponderEliminar
    Respuestas
    1. Esto podría ponerse en cualquier cosa que ofrezca un servicio PHP, así que desde blogger hasta un foro, pasando por un portal de servicios, Wikimedia...
      El código fuente podrías incluirlo directamente en el propio index.php, ya que depende directamente del User-Agent que use el cliente al conectarse. Si entran desde un navegador se verá el sitio como si nada hubiera cambiado.

      Eliminar