Blacklist - O que é? Como consultar o IP? Como automatizar?

Explana sobre bloqueio de IPs em Blacklists (RBL), demonstrando como consultar e como automatizar via shell script.

[ Hits: 20.833 ]

Por: Danillo Costa em 19/05/2015 | Blog: https://nillow.com.br/


Automatizando consultas via shell script



Pré-requisitos:
  • msmtp (envio de notificação via email)
  • lynx

Embora o ambiente utilizado seja o Cygwin, acredito que qualquer Linux é compatível com o script, desde que atenda os pré-requisitos.

Não ensinarei como configurar o msmtp, pois este não é foco e caso decida não utiliza-lo, basta adapta-lo.

As consultas são feitas utilizando o método 2 da página anterior, que é mais rápido em relação ao método 1.

O check-blacklist, nome do shell script, pode ser executado de duas formas.

Para um IP em específico:

bash check-blacklist.sh 23.226.214.16

Para uma lista determinada dentro do script:

bash check-blacklist.sh

Imagem da saída em tempo real do script:
Linux: Blacklist - O que é? Como consultar o IP? Como automatizar?
Imagem da notificação via email:
Linux: Blacklist - O que é? Como consultar o IP? Como automatizar?
Salve o código abaixo, em "check-blacklist.sh". Não esqueça de editar os endereços de e-mails e a faixa de IP a ser analisada.

#!/bin/bash
# Editado por hellnux (Danillo Costa)
# Fonte: http://daemonforums.org/showthread.php?t=302
version="15.0508"

# Checa um determinado IP se passado como parametro, caso contrario eh
# analisado um faixa de IPs pre determinados.

#######################################################
#                               Functions
#######################################################

function dateNow () {
        date +%d/%m/%Y" "%k:%M:%S
}

function getIps() {
        # Cria lista de ips
        ips=""
        notes_mail="Faixa de IPs analisadas:\n"
        prefix="162.144.34"
        notes_mail="$notes_mail de 162.144.34.1 até 162.144.34.126 \n"
        for i in `seq 1 126`; do
                ips="$ips $prefix.$i"
        done        
        # Adiciona a lista de ips, os ips de 37.49.226.1 até 37.49.226.62
        prefix="37.49.226"
        notes_mail="$notes_mail de 37.49.226.1 até 37.49.226.62 \n"
        for i in `seq 1 62`; do
                ips="$ips $prefix.$i"
        done 
}

function printResultBase () {
        printf "%-22s %-18s %-30s %-24s %s \n" "$date_now" "$ip" "$reverse_dns" "${BL}" "$result"
}

function printResultSenderbase() {
        date_now=`dateNow`
        BL="senderbase.org"
        # Evita consulta desnecessaria quando o SenderBase tiver bloqueado IP da maquina que executa este script
        if [ "$block_printResultSenderbase" == "1" ]; then
                result="Fail"
                printResultBase
        else
                # Passa pelos Termos de Servicos do SenderBase, method post e pega a saida do lynx
                out=$(echo "tos_accepted=Yes, I Agree" | lynx -dump -post_data "$link_sederbase$ip" | nl -ba)
                if [ $? -eq 0 ]; then
                        if [ "`echo "$out" | grep -F "You don't have permission to access"`" != "" ]; then
                                block_printResultSenderbase="1"
                                result="Fail"
                                printResultBase
                        else
                                # O status do email_reputation costuma estar uma linha antes de "Web Reputation Help" na saida do lynx
                                n_web_reputation=$(echo "$out" | grep -F "Web Reputation Help" | awk '{print $1}')
                                n_email_reputation=$(( $n_web_reputation - 1 ))
                                email_reputation=$(echo "$out" | sed -n "$n_email_reputation"p | awk '{print $2}')
                                if [ "$email_reputation" == "Poor" ]; then
                                        result="Listed"
                                        printResultBase | tee -a "$log_file"
                                else
                                        result="---"
                                        printResultBase
                                fi
                        fi
                else # Metodo antigo. Nao eh tao preciso, pois informa apenas o score. Raramente entre neste trecho
                        BL="rf.senderbase.org"
                        result=$(dig +short txt ${reverse[$i]}.${BL}.)
                        date_now=`dateNow`
                        if [ "`echo "$result" | grep -F "-"`" != "" ]; then
                                score=$(echo "$result" | tr -d '"') 
                                result="NeedCheck:$score" 
                                printResultBase | tee -a "$log_file"
                        else
                                result="---"
                                printResultBase
                        fi
                fi
        fi
}

function printResult() {
        date_now=`dateNow`
        if [ "$result" != "" ]; then
                result="Listed"
                printResultBase | tee -a "$log_file"
        else
                result="---" # Nao listado
                printResultBase
        fi
}

#######################################################
#                                       Main
#######################################################

# Lista de blacklists. SenderBase eh analisado separadamente
BLISTS="
b.barracudacentral.org
zen.spamhaus.org
xbl.spamhaus.org
pbl.spamhaus.org
bl.spamcop.net
dnsbl.sorbs.net
http.dnsbl.sorbs.net
web.dnsbl.sorbs.net
"

script_name=$(basename $0 .sh)
emails="seu@email.com"
msmtp="/usr/sbin/msmtp"
log_file="/tmp/$script_name.log"
sign_mail="------------------\n$script_name $version" #Assinatura da notificacao via email
link_sederbase="http://www.senderbase.org/lookup/?search_string="
block_printResultSenderbase="0" # disable
msg_printResultSenderbase=""

# Define se usa IP passado via argumento ou "lista de IPs" informadas neste codigo.
if [ "$2" != "" ]; then
        echo "Error: Informe apenas 1 IP ou nenhum para usar a lista pre-determinada."
        exit 1
elif [ "$1" != "" ]; then
        ips="$1"
else
        getIps
fi

# limpa log
> "$log_file"

# Cria IP reverso
i=0
for ip in $ips; do
        reverse[$i]=$(echo "$ip" | sed -ne "s~^\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)$~\4.\3.\2.\1~p")
        if [ "x${reverse[$i]}" = "x" ]; then
                echo "Error: '$ip' nao parece ser um IP valido."
                exit 1
        fi
        (( i++ ))
done

# Faz checagem nas blacklists
i=0
for ip in $ips; do
        #echo "[$ip]" #debug
        reverse_dns=$(dig +short -x "$ip")
        if [ "$reverse_dns" == "" ]; then
                reverse_dns="reverseNull"
        fi
        # Chama funcao printResultSenderbase
        printResultSenderbase
        # Demais blacklists
        for BL in ${BLISTS} ; do
                result="$(dig +short -t a ${reverse[$i]}.${BL}.)"
                printResult
        done
        sleep "$(( ( RANDOM % 10 )  + 5 ))" # Random de ~5s a ~20s
        (( i++ ))
done

# Print in body mail if this script blocked in SenderBase
if [ "$block_printResultSenderbase" == "1" ]; then
        msg_printResultSenderbase="SenderBase blocked the `hostname -i` to queries.\n"
fi

# Send mail - Se identar o echo, pode bugar
if [ "`wc -l "$log_file" | awk '{print $1}'`" != "0" ]; then
echo "To: $emails
From: seu@email.com
Subject: [$script_name]
Content-Type: text/html; charset=\"utf-8\"

`cat \"$log_file\"`
`echo -e \"$msg_printResultSenderbase\"`
`echo -e \"$notes_mail\"`
`echo -e \"\n\n$sign_mail\"`
" | "$msmtp" --read-recipients fi # senderbase # dig +short txt 55.145.202.186.rf.senderbase.org # Outras RBL # combined.njabl.org # spam.rbl.msrbl.net # bl.spamcannibal.org # bl.deadbeef.com # bl.emailbasura.org # blackholes.five-ten-sg.com # bogons.cymru.com # blacklist.woody.ch # cbl.abuseat.org # cdl.anti-spam.org.cn # combined.abuse.ch # combined.rbl.msrbl.net # db.wpbl.info # dnsbl-1.uceprotect.net # dnsbl-2.uceprotect.net # dnsbl-3.uceprotect.net # dnsbl.ahbl.org # dnsbl.cyberlogic.net # dnsbl.inps.de # dnsbl.njabl.org # drone.abuse.ch # drone.abuse.ch # duinv.aupads.org # dul.dnsbl.sorbs.net # dul.ru # dyna.spamrats.com # dynip.rothen.com # images.rbl.msrbl.net # ips.backscatterer.org # ix.dnsbl.manitu.net # korea.services.net # misc.dnsbl.sorbs.net # noptr.spamrats.com # ohps.dnsbl.net.au # omrs.dnsbl.net.au # orvedb.aupads.org # osps.dnsbl.net.au # osrs.dnsbl.net.au # owfs.dnsbl.net.au # owps.dnsbl.net.au # probes.dnsbl.net.au # proxy.bl.gweep.ca # proxy.block.transip.nl # psbl.surriel.com # rbl.interserver.net # rdts.dnsbl.net.au # relays.bl.gweep.ca # relays.bl.kundenserver.de # relays.nether.net # residential.block.transip.nl # ricn.dnsbl.net.au # rmst.dnsbl.net.au # sbl.spamhaus.org # short.rbl.jp # smtp.dnsbl.sorbs.net # socks.dnsbl.sorbs.net # spam.abuse.ch # spam.dnsbl.sorbs.net # spam.spamrats.com # spamlist.or.kr # spamrbl.imp.ch # t3direct.dnsbl.net.au # tor.ahbl.org # tor.dnsbl.sectoor.de # torserver.tor.dnsbl.sectoor.de # ubl.lashback.com # ubl.unsubscore.com # virbl.bit.nl # virus.rbl.jp # virus.rbl.msrbl.net # wormrbl.imp.ch # zombie.dnsbl.sorbs.net # phishing.rbl.msrbl.net # Fontes de pesquisas # http://www.redhat.com/archives/rhl-list/2003-December/msg01341.html # http://h3manth.com/content/methods-submit-form-post-using-curl-perl-python-ruby-lynx # Numero random em um determinado range pelo shuf # http://stackoverflow.com/questions/2556190/random-number-from-a-range-in-a-bash-script

Download do script acima: check-blacklist-VOL.sh

Agora, basta agendar via cron:

crontab -e

Exemplo para executar às 7 e 13h de todos os dias:

00 7,13 * * * /bin/bash /caminho/para/o/check-blacklist.sh

Aconselho não abusar no número de execuções, ainda mais se mandar analisar uma lista de IPs, pois as Blacklists podem acabar bloqueando o IP de onde está rodando o script, por abuso.

Caso esteja iniciando nesta área, lembre-se que apenas tal método não é o suficiente para combater os Spams.

Sintam-se livre para editar o script, desde que mantenha os créditos. Por um mundo sem Spam! =D

Página anterior    

Páginas do artigo
   1. Introdução
   2. Consultando o IP
   3. Automatizando consultas via shell script
Outros artigos deste autor

Shell Script como serviço no Windows

Gerenciando Mouses da Razer

Adium, IM open source

Overclock em placas de vídeo GeForce

Gnome Shell e Extensions no Ubuntu 11.10

Leitura recomendada

Liberar navegação para Speedy Home

Relatório de conexão Wi-Fi com dados de usuários conectados nos POPs

Shell Script nosso de cada dia - Episódio 3

Gerar músicas aleatórias com YAD (Modo Gráfico)

Shell script com PHP

  
Comentários
[1] Comentário enviado por vmmello em 19/05/2015 - 18:43h

legal o artigo. Na página 2, a linha do sed não funciona pra mim. E copiando direto do script na página 3 também não funciona. Será que a formatação do texto no VOL estragou a linha? Só funciona modificando ela um pouco.

[2] Comentário enviado por hellnux em 19/05/2015 - 18:55h

vmmello,

Obrigado por reportar. Já enviei a equipe de moderação tanto o comando sed da segunda página quanto o script da última página.

--- EDIT ---
Ambos foram corrigidos no artigo. =D

[3] Comentário enviado por xerxeslins em 21/05/2015 - 18:49h


Não trabalho com isso, mas achei o artigo bem informativo!

Eu não sabia dessas coisas de blacklist.

Valeu!

Abraço!
--
http://pastebin.com/aji5Qp05

[4] Comentário enviado por brunor1989 em 25/05/2015 - 11:04h

Olá,

Copiei o arquivo e fiz as mudanças necessárias, porém me retorna o seguinte erro:
/check.backlist.sh: 25: ./check.backlist.sh: Syntax error: "(" unexpected


[5] Comentário enviado por brunor1989 em 25/05/2015 - 14:18h


[4] Comentário enviado por brunor1989 em 25/05/2015 - 11:04h

Olá,

Copiei o arquivo e fiz as mudanças necessárias, porém me retorna o seguinte erro:
/check.backlist.sh: 25: ./check.backlist.sh: Syntax error: "(" unexpected



Resolvido, apenas troquei /bin/sh para /bin/bash

[6] Comentário enviado por hellnux em 25/05/2015 - 14:30h

Obriagado brunor1989. Corrigido no artigo, mas para quem chama o bash na linha de comando, que nem eu, não faz diferença.

[7] Comentário enviado por fmpfmp em 25/05/2015 - 17:00h

Muito útil seu script. No meu caso a maior causa do IP ser listado é ele ser considerado um IP dinâmico quando na verdade é estático. Aqui pagamos pra ter um IP fixo da GVT e vez ou outra ele é listado como IP doméstico. Toda vez eu tinha que ir na página do Spamhaus pra tirá-lo da lista, mas com seu script isso se torna desnecessário. Obrigado.

[8] Comentário enviado por juliomartins em 26/05/2015 - 17:10h

Código apenas para consulta passando ip por parâmetro ...

#!/bin/bash
#VERIFICADOR DE IPS BLACKLIST
BLISTS="b.barracudacentral.org zen.spamhaus.org xbl.spamhaus.org pbl.spamhaus.org bl.spamcop.net dnsbl.sorbs.net http.dnsbl.sorbs.net web.dnsbl.sorbs.net cbl.abuseat.org"

IP=`echo $1 | awk -F . '{print $4,$3,$2,$1}' | tr " " .`

for i in `echo $BLISTS`;
do
echo "$i ----> `dig +short -t a $IP.$i`"
done

[9] Comentário enviado por juliomartins em 26/05/2015 - 17:17h

Para executar o script:

Salve com o nome ChecaRBL

chmod 755 ChecaRBL

./ChecaRBL IP_QUE_VC_QUE_VERIFICAR

[10] Comentário enviado por wilyman em 29/08/2016 - 10:19h

Oi pessoal poderiam me ajudar, eventualmente tenho problemas de clientes com esse problema e na qual uso o BRMA.
Fiz o download do script porém ao executar ocorre esse erro
[root@mail root]# sh check-blacklist-VOL.sh
: command not found.sh: line 5:
: command not found.sh: line 8:
: command not found.sh: line 12:
'heck-blacklist-VOL.sh: line 13: syntax error near unexpected token `{
'heck-blacklist-VOL.sh: line 13: `function dateNow () {

Talvez o BRMA não tenha todos os recursos necessários para a execução do script mas seria muito util para o uso aqui na empresa

[11] Comentário enviado por hellnux em 29/08/2016 - 10:42h

wilyman

Use o bash em vez do sh


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts