About
Games
Software
IMPORTANTE: El proyecto Harvester se ha cancelado, en parte por diversos ataques DoS que ha recibido el servidor de su promotor. Por lo tanto este artículo puede considerarse obsoleto.
The Harvester Project es un interesante proyecto que pretende identificar a los spam-bots que recolectan direcciones de correo de las páginas web que visitan, para luego emplearlas en el envío del molesto spam.
Este documento es una mini-guía de como he configurado mi servidor web con OpenBSD para colaborar en el proyecto.
La idea es bastante simple: ponemos trampas para que los spam-bots recolecten direcciones falsas que más tarde los identifiquen.
Hay una duda que es muy frecuente siempre que se filtra por IP:
¿No filtraré con esto a gente inocente? ¿Qué pasa con las cuentas RTB que tiene IP dinámica?
Los filtros por IP siempre dependen de lo bueno que sea el que selecciona las IPs. El proyecto Harvester tiene mecanismos para evaluar si una IP debe ser filtrada o no. Además en esta guía se propone una puesta en marcha de la idea que permite corregir posibles errores.
También hay que estar al día de la evolución del proyecto, porque actualmente (Dic 2003) se usan unas direcciones con dominio fijo para recolectar IPs, y es posible que los programadores de spam-bots comiencen a filtrar ese dominio.
Necesitaremos para seguir esta guía:
El proceso consta de dos partes:
Las trampas no son más que direcciones de correo falsas en las que el usuario es la IP del recolector codificada con Base64 más una parte aleatoria. Estas direcciones son ocultadas a los usuarios de navegadores modernos mediante CSS, y además se advierte a los usuarios de navegadores sin soporte CSS que las direcciones son trampas para spam-bots y que no deben utilizarlas.
Para insertar esas direcciones solo necesitamos poner el siguiente código en nuestras páginas PHP:
<?php
$REMOTE_ADDR = getenv("REMOTE_ADDR");
$bait = base64_encode($REMOTE_ADDR);
?>
<div style="display:none">
<p>Las siguientes direcciones son trampas para spam. No las uses o serás
excluido de cientos de páginas web.
<p>
<a href="mailto:<?php echo $bait; ?><?=rand(1,999)?>@spywareinfo.org">sales</a>
<br>
<a href="mailto:<?php echo $bait; ?><?=rand(1,999)?>@spywareinfo.org">mailing</a>
<br>
<a href="mailto:<?php echo $bait; ?><?=rand(1,999)?>@spywareinfo.org">webmaster</a>
<p>The previous addresses are spamtraps. Do not use them or you will be
banned from hundreds of web sites.
</div>
Este código es un ejemplo. Las direcciones pueden cambiar (el texto que aparece en la página: sales,
mailing o webmaster) y podemos poner tantas como queramos. En este caso, un navegador sin
CSS mostrará algo como esto:
Las siguientes direcciones son trampas para spam. No las uses o serás excluido de cientos de páginas web.
The previous addresses are spamtraps. Do not use them or you will be banned from hundreds of web sites.
Es conveniente situar el código al final de nuestra página web, cerca del TAG </body>, por ejemplo.
Ahora nuestra web está preparada para recolectar direcciones IP de spam-bots, que serán procesadas por el proyecto Harvester.
Las IPs de los spam-bots ya identificados se encuentran en: http://www.spywareinfo.com/harvest_project/spambots.txt.
Vamos a automatizar su descarga y posterior proceso con PF. Para ello empleamos el siguiente script:
#!/bin/sh
# spam-bots.sh
# directorio de trabajo donde almacenamos la última descarga
cd /root/spam-bots
# Obtenemos las IPs solo si han cambiado
# no es obligatorio el uso de wget, podemos usar cualquier herramienta similar
/usr/local/bin/wget -q -N http://www.spywareinfo.com/harvest_project/spambots.txt
# Si hemos descargado algo con éxito:
#
# 1. quitamos los comentarios
# 2. ordenamos las IPs y quitamos duplicados
# 3. guardamos la IPs listas para filtrar en /etc/spam-bots
# 4. indicamos a pf que re-cargue las reglas para que se actualize la tabla
#
if [ $? -eq 0 ]; then
cat spambots.txt | grep -v ^# | sort | uniq > /etc/spam-bots
pfctl -f /etc/pf.conf
fi
Guardamos el script en /root/spam-bots y le damos permisos de ejecución con:
# chmod +x /root/spam-bots/spam-bots.sh
Ahora editamos nuestro /etc/pf.conf. Podemos simplemente bloquear los
spam-bots, siendo n3 la tarjeta de red que es accesible desde
internet, con:
# bloquear la web a spam-bots table <spam-bots> file "/etc/spam-bots" block return in on ne3 proto tcp from <spam-bots> to ne3 port 80
Aunque no es quizás la mejor opción. Con el bloqueo suponemos que la gente del proyecto no se va a equivocar nunca y no damos opción a corregir errores: la máquina filtrada no sabe porqué ha sido filtrada (y puede que no sepa ni que ha sido filtrada).
Por lo tanto vamos a cambiar la regla por:
# bloquear la web a spam-bots table <spam-bots> file "/etc/spam-bots" rdr on ne3 proto tcp from <spam-bots> to ne3 port 80 -> 127.0.0.1
Y con la ayuda de Apache, vamos a mostrar una página web personalizada a los supuestos spam-bots bloqueados, y además vamos a registrar su visita en un fichero aparte.
Editamos /var/www/conf/httpd.conf:
<VirtualHost 127.0.0.1>
DocumentRoot /var/www/spam-bot_htdocs
CustomLog logs/smap-bot_access_log combined
</VirtualHost>
<VirtualHost _default_:*>
</VirtualHost>
Si no teniamos definidos hosts virtuales, ahora ya los tenemos :) Con esas lineas se añade
un nuevo host en 127.0.0.1, dejando por defecto lo que ya había definido hasta ese momento.
Puede ser necesario ajustar esta configuración a cada caso, pero en general la idea es que las peticiones a
127.0.0.1 vayan a parar a una web distinta, situada en /var/www/spam-bot_htdocs.
Además se llevará un registro especial en logs/smap-bot_access_log donde podremos
consultar los spam-bots que han sido bloqueados.
Ahora solo falta poner un index.php en la web para spam-bots con algo como:
<p><b>You're Blocked</b> <p>Your IP address (<? echo $_SERVER["REMOTE_ADDR"]; ?>) has been identified as a spam-bot or as pro-spam host. <p>If you think that's an error, you can complain at <a href="http://www.spywareinfo.com/harvest_project/">The Harverster Project</a>. <p>Thank you!
Con esto damos una oportunidad para rectificar a la gente del proyecto Harvester. Si un usuario es bloqueado
por error, puede ir a la página indicada para pedir que lo desbloqueen. Aunque en nuestro caso
permanecerá bloqueado toda una semana, a no ser que ejecutemos el spam-bots.sh diariamente.
Ahora solo queda automatizar el proceso haciendo que nuestro script se ejecute cada semana, introduciendo algo
así en el crontab(5) de root:
# actualizar lista de spam-bots @weekly /root/spam-bots/spam-bots.sh
En este momento podemos elegir un bonito logo para poner en nuestra web, con un enlace al proyecto.