Estudio con recomendaciones para construir un sistema que bloquee accesos de spammers. Trabajaremos sobre el fichero .htaccess de nuestro Apache, donde bloquearemos según la naturaleza de los spam bots.

¡Ojo! Hago directos en Twitch sobre desarrollo web, ¿Te apuntas? ManzDev

webmasters
18

Escrito por

Uno de los mayores problemas en un blog se da cuando se empieza a recibir comentarios de spam que llenan nuestros artículos de mensajes no deseados: casinos, pastillas de viagra y hasta en algunos casos spyware o falsos antivirus.

Cualquiera podría pensar, que bastaría con bloquear los accesos a la página web del spammer y listo. El problema es que, usualmente, no se trata de un ataque individual, sino de una amenaza mayor, un ataque distribuido.

red bots botnet zombie pc

Este tipo de ataques, las llamadas redes de bots están formadas por cientos, miles (o más) de ordenadores que pertenecen a personas individuales e independientes, infectadas (sin ser conscientes de su infección ni de las consecuencias) por malware o troyanos que convierten su ordenador en un zombie manipulable.

Bloquear miles de accesos de diferente naturaleza (pais, navegador, proveedor...) se convierte en una tarea muy complicada y aunque existen varios sistemas para bloquear y filtrar estos ataques, voy a proponer un método distinto por varios motivos que afectan a la mayoría de sistemas:

  • Producen un consumo alto de recursos del servidor.
  • Producen falsos positivos (comentarios legítimos como spam).
  • Dependen de servicios de terceros.
  • En algunos casos es necesaria la moderación.
  • No actuan sobre el foco original del problema.

Es por ello, que he realizado un pequeño estudio para crear el siguiente informe con varias recomendaciones para construir un sistema que bloquee accesos de spammers. Trabajaremos sobre el fichero .htaccess de nuestro Apache, donde iremos bloqueando según la naturaleza de los spam bots.

stop spammers spam

NOTA: Como se verá posteriormente, en lugar de bloquear la petición haré una redirección a una carpeta llamada malware con la variable GET ident seteada a una determinada cadena. En esa ruta existirá un script que registrará ciertos datos de los accesos (ip, host, pais, referer, petición, agente de usuario...) para mantener unas estadísticas de los spambots bloqueados, su naturaleza y descubrir nuevos patrones, para luego mostrar un error 404 y simular que no existe:

if (isset($_GET['ident'])) {
$log = fopen($_SERVER['DOCUMENT_ROOT'] . "/malware/spam.log", 'a+');
$msg = $_GET['ident'] . ' ' . date('Y-m-d H:i:s') . ' ' . $_SERVER['REMOTE_ADDR'] . ' ' . $_SERVER['HTTP_USER_AGENT'] . "\n";
fwrite($log, $msg);
fclose($log);
}
header("HTTP/1.0 404 Not Found");
exit(0);

Si tu intención es sólo bloquearlos, y no te preocupan otras cosas como el registro de accesos, reemplaza la línea RewriteRule de los siguientes códigos por la siguiente:

RewriteRule .* - [F]

Esto, hará que los bloquee con un código HTTP 403.

EDITADO: Como bien apunta ajmacias en los comentarios, dentro de la carpeta malware hay que desactivar las redirecciones para evitar dejar el Apache en un bucle infinito. Para ello en el fichero .htaccess de la carpeta malware escribimos:

RewriteEngine off

Si no sabes de que estoy hablando, te recomiendo echar un vistazo a la chuleta Emezeta ModRewrite Card.

La misteriosa flecha

Probablemente se trate de un spambot mal configurado, pero lo cierto es que varias redes de botnets tienen las peticiones de sus spambots de modo que se les «escapa» un patrón poco común en peticiones HTTP.

210.126.72.42 - - [19/Sep/2008:04:53:10 -0700] "GET /tag/consumo%2Bcpu/ GET http://www.emezeta.com/tag/consumo%2Bcpu/ [0,30618,48635] -> HTTP/1.0" 301 263 "http://www.emezeta.com/tag/consumo%2Bcpu/ GET http://www.emezeta.com/tag/consumo%2Bcpu/ [0,30618,48635] ->" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Crazy Browser 2.0.0 Beta 1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)"

Lo aprovecharemos para bloquearlo, introduciendo en el fichero .htaccess lo siguiente:

RewriteCond %{SERVER_PROTOCOL} " -> " [OR]
RewriteCond %{REQUEST_METHOD} " -> " [OR]
RewriteCond %{HTTP_REFERER} " -> "
RewriteRule .* /malware/?ident=arrow-spam

La IP oculta

Algunos bots se aprovechan de ciertos trucos para evitar ser identificados. Uno de ellos es aprovechar servidores Apache con HostnameLookups activado (resolver las DNS inversa / hostname) de la IP del usuario.

Esa información suele ser una cadena que da información acerca del ISP, IP enmascarada u otros datos. No todos los usuarios deben tener DNS inverso, es más, los spammers acostumbran no tenerlo para hacer más dificil su identificación.

En este caso, el spammer camufla la IP en un DNS inverso que es un único punto (.) buscando la confusión y que no se registre la IP en los logs, ni se tenga forma de resolverla.

RewriteCond %{REMOTE_HOST} ^\.$
RewriteRule .* /malware/?ident=dot-spam

El spammer no canónico

Este es bastante ingenioso. En múltitud de casos, lo ideal es tener nuestra página web bajo una URL canónica, o lo que es lo mismo, que sólo podamos acceder a una dirección unívoca.

Un ejemplo sería que al entrar en www.emezeta.com y a emezeta.com sólo una de las dos direcciones prevalezca. Con el siguiente código se puede conseguir (prevalece con www):

RewriteCond %{SERVER_NAME} ^sitioweb.com$ [NC]
RewriteRule ^(.*)$ http://www.sitioweb.com/$1 [R=301]

Muchos spammers se «inventan» que vienen (referer) del sitio web al que están atacando, para que el servidor crea que es un usuario legítimo. Claro que, si tenemos esta característica canónica, parece que casi todos los spammers se olvidan de incluir el «www». Por lo tanto, si un usuario viene de otra página debe tener www, en caso contrario (no se puede dar), es un spammer.

RewriteCond %{HTTP_REFERER} "^http://sitioweb.com/" [NC]
RewriteRule .* /malware/?ident=canonical-spam

El falso agente

Un descuido común en varias redes de botnets es el especificar la previa cadena User-Agent: como agente de usuario. Probablemente se trate de un error de programación en ciertos bots, pero sin duda, podemos utilizarlo para detectar spam bots.

RewriteCond %{HTTP_USER_AGENT} "^User-(A|a)gent: "
RewriteRule .* /malware/?ident=fakeuser-spam

Agentes malignos

Uno de los filtros más sencillos pero, sorprendentemente, de los más potentes y efectivos es el bloquear accesos simplemente por su Agente de Usuario (User Agent). Pero ojo, hay que ser muy selectivo y sólo bloquear a los agentes que se esté completamente seguro de que son spam bots.

Por ejemplo, lwp-request (comando de UNIX), WWW-Mechanize o libwww-perl (módulos para Perl) y Jakarta Commons-HttpClient (extensión Jakarta) son algunos de los sistemas que, aunque no fueron concebidos para crear este tipo de malware, los hacen un sistema muy sencillo (y frecuente) para crear spam bots.

RewriteCond %{HTTP_USER_AGENT} "^(Java|lwp-request|WWW-Mechanize|libwww-perl|Attentio|ePochta_Extractor|Jakarta Commons-HttpClient)/"
RewriteRule .* /malware/?ident=badagent-spam

Sistema antispam CSS

El ya famoso sistema antispam del campo oculto por CSS ha resultado ser una auténtica y efectiva solución para el spam en blogs, que podemos combinar perfectamente para registrar los bots bloqueados por este sistema.

Para registrar estos accesos de spam bots, deberemos hacerlo desde PHP, ya que modrewrite no sirve para capturar variables GET / POST.

Esto puede plantear un problema, ya que no se puede hacer un include de un fichero PHP con variable GET por parámetro, como haciamos con ident. Sin embargo, existe una pequeña triquiñuela que podremos utilizar:

$_GET = array();
$_GET['ident'] = 'css-antispam';
include($_SERVER['DOCUMENT_ROOT'] . '/malware/index.php');

Como se puede ver, podemos modificar a nuestro antojo el array asociativo $_GET que conservará los cambios para la inclusión.

Resultados

Y ahora viene lo interesante. Después de menos de una semana de pruebas, los resultados son bastante tentadores, así que los muestro a continuación:

# wc -l spam.log
2476 spam.log

2.476 accesos de spam bloqueados.

# cat spam.log | cut -d" " -f1 | sort | uniq -c | sort -n
49 dot-spam
250 canonical-spam
593 savecom-antispam
718 badagent-spam
866 mail-antispam

Por las categorías anteriormente descritas. En mi caso he diferenciado varios formularios de otros (savecom para los comentarios y mail para el envío de email).

# cat spam.log | cut -d" " -f2 | sort | uniq -c | sort -n
44 2008-09-17
377 2008-09-18
417 2008-09-22
488 2008-09-19
571 2008-09-21
579 2008-09-20

Los accesos de spammers separandolos por días. Vemos que corre alrededor de una media de 500 peticiones de spam diarias, teniendo en cuenta que muchos de los rangos de IP que reiteraban fueron bloqueados por iptables.

# cat spam.log | cut -d" " -f4-5 | sort | uniq -c | sort -n | tail -10
35 94.102.49.14 -
36 89.179.91.33 -
49 206.71.157.116 -
58 162.114.40.33 ldyddy1.ky.gov
59 200.63.42.136 -
63 94.102.49.34 -
64 85.12.25.66 -
76 67.212.189.146 server2.yourdomain9.com
118 65.98.62.90 muk.nameserver5.info
621 94.100.29.250 -

Aquí los accesos de spammers más frecuentes, agrupados por IP y hosts. Este apartado es bastante interesante, puesto que se puede comprobar que la mayoría de spammers tienen servidores web instalados sin configurar o con posibles vulnerabilidades. Probablemente sus dueños no saben que están infectados.

Mi intención posterior es crear un script que permita crear informes acerca de las peticiones mas frecuentes de spam y se envíen al email abuse de su ISP de forma automática. Con esto no sólo estaríamos evitando el spam en nuestro servidor, sino ayudando a reducirlo y prevenir a los «zombies».

# cat spam.log | cut -d" " -f6 | sort | uniq -c | sort -n | tail -10
42 Spain
51 Poland
66 China
78 Russian_Federation
80 Korea,_Republic_of
87 Netherlands
88 Japan
106 Germany
556 United_States
868 -

Finalmente, se puede añadir más información acerca de los spam bots que en el ejemplo superior. Por ejemplo, con ayuda del sistema de geolocalización para Apache puedo saber el pais de origen de los spam bots.

RELACIONADOS ¡Se me abren otras páginas! go.google.com RELACIONADOS Robots: Accesos no humanos a la web RELACIONADOS Lencería geek para chicas
x ¡Se me abren otras páginas! go.google.com
Manz

18 comentarios

Publica tu opinión