lunes, 3 de marzo de 2014

verificar RBL/listas negras mediante scritp en bash

Como todo mundo ya conoce y a vivido en carne propia el molesto spam y el día de hoy tuve otro encuentro cercano con un cliente listado en RBL's, decidí comenzar en la búsqueda de como automatizar la verificación de determinados servidores en las listas negras mas populares.

Me encontré con este script que si bien es de mi utilidad no llenaba todos los requisitos que necesitaba, así que le hice ciertas modificaciones para que se adaptará a mis necesidades.

#!/usr/bin/env bash
DEBUG="$1"
LOG="`mktemp`"
SRV="correo.prueba.org.co mail.example.com.co"
# RBL list from http://www.anti-abuse.org/multi-rbl-check/
RBL="bl.spamcop.net
cbl.abuseat.org
b.barracudacentral.org
dnsbl.sorbs.net
http.dnsbl.sorbs.net
dul.dnsbl.sorbs.net
misc.dnsbl.sorbs.net
smtp.dnsbl.sorbs.net
socks.dnsbl.sorbs.net
spam.dnsbl.sorbs.net
web.dnsbl.sorbs.net
zombie.dnsbl.sorbs.net
dnsbl-1.uceprotect.net
pbl.spamhaus.org
sbl.spamhaus.org
xbl.spamhaus.org
zen.spamhaus.org
bl.spamcannibal.org
psbl.surriel.com
ubl.unsubscore.com
dnsbl.njabl.org
combined.njabl.org
rbl.spamlab.com
dnsbl.ahbl.org
ircbl.ahbl.org
dyna.spamrats.com
noptr.spamrats.com
spam.spamrats.com
cbl.anti-spam.org.cn
cdl.anti-spam.org.cn
dnsbl.inps.de
drone.abuse.ch
httpbl.abuse.ch
dul.ru
korea.services.net
short.rbl.jp
virus.rbl.jp
spamrbl.imp.ch
wormrbl.imp.ch
virbl.bit.nl
rbl.suresupport.com
dsn.rfc-ignorant.org
ips.backscatterer.org
spamguard.leadmon.net
opm.tornevall.org
netblock.pedantic.org
multi.surbl.org
ix.dnsbl.manitu.net
tor.dan.me.uk
rbl.efnetrbl.org
relays.mail-abuse.org
blackholes.mail-abuse.org
rbl-plus.mail-abuse.org
dnsbl.dronebl.org
access.redhawk.org
db.wpbl.info
rbl.interserver.net
query.senderbase.org
bogons.cymru.com
csi.cloudmark.com"
for server in $SRV
do

  lip=$(dig +short $server)
  for ip in $lip
  do
    rip=$(echo $ip|awk -F"." '{for(i=NF;i>0;i--) printf i!=1?$i".":"%s",$i}')
    echo $server $rip
    for rbl in $RBL
    do
      if [ ! -z "$DEBUG" ]
      then
    echo "testing $server ($ip) against $rbl"
      fi
      result=$(dig +short $rip.$rbl)

      if [ ! -z "$result" ]
      then
    echo "$server ($ip) esta en $rbl con codigo $result" >> $LOG
    echo "$server ($ip) devolvió el siguiente mensaje $(dig +short -t txt $rip.$rbl)" >> $LOG
    echo "" >> $LOG
      fi
      if [[ ! -z "$DEBUG" && -z "$result" ]]
      then
    echo "\`->negative"
      fi
    done
  done
done

if [ ! -z "$(cat $LOG)" ] ; then
    cat $LOG | mail -s "Spam en uno de nuestros clientes" admin@example.com.co
fi

rm $LOG


Las modificaciones mas relevantes fueron el hecho de que en caso que un nombre de los servidores a verificar tuviese mas de una ip estas también fuesen verificadas y el envío de la notificación a través de correo electrónico en caso de que encuentre algún servidor listado.

Eso es todo por el momento, agradezco los comentarios y mejoras que se le puedan hacer al script.