????

Your IP : 13.59.178.179


Current Path : /nutscripts/
Upload File :
Current File : //nutscripts/control_exim.sh

#!/bin/bash
#
#guillermo@nuthost.com @gu1113

host=`hostname -a`
email=tecnologia@nuthost.com
emailabuso=abusos@nuthost.com
emailviejo=tecnologia@nuthost.com
#cantidad de correos limite cada 10 minutos
limitesmtp=90
#limite de envio por script cada 10 minutos = 120 (dentro del codigo)
#anteriormente este limite estaba en 40 generando muchos falsos positivos

worklog=/tmp/nut-exim_tmp
logenviados=/tmp/nut-enviados.log
log_just_ips=/tmp/nut-just-ips.log
log_ips_arg=/tmp/nut-arg-ips.log
# Sin uso ?
emailsvulnerados=/tmp/nut-vulnerados.log
sentchart=/tmp/nut-enviadosok.log
countvulnerados=/tmp/nut-countvulnerados.log
countenviados=/tmp/nut-countenviados.log

loadavg=`cat /proc/loadavg | awk '{ print $1 }'`
carga=`echo $loadavg|awk -F \. '{print $1}'`
ip_local=`cat /var/cpanel/mainip`

############################
#   Funciones generales    #
############################

function buscarowner {
  emailwhmcs=$(curl -k "https://clientes.nuthost.com/wide.php?pasaporte=4b04fa4d91221fb2f72645d430918082&dominio=$dominio");
  if [ -z $emailwhmcs ]; then
    usercp=$(/scripts/whoowns $dominio);
    owner=$(cat /var/cpanel/users/$usercp | grep -i OWNER | grep -v DBOWNER | awk -F "=" {'print $2'});
    domainowner=$(grep 'DNS=' /var/cpanel/users/$owner | awk -F "DNS=" {'print $2'});
    emailwhmcsrv=$(curl -k "https://clientes.nuthost.com/wide.php?pasaporte=4b04fa4d91221fb2f72645d430918082&dominio=$domainowner");

    if [ ! -z $emailwhmcsrv ]; then
        email=$emailwhmcsrv;
    fi

  else
   email=$emailwhmcs;
  fi
}

function reportehora {
  buscarowner;
  subjectr="Email vulnerado $abusado | Titular: $owner $domainowner | Contacto: $email | Servidor $host "
  echo "Estimado Cliente, hemos detectado que desde su cuenta de email $abusado se ha realizado un envío masivo de correos." > /tmp/reportm.txt
  cat /nutscripts/mensajes/abuso_email.txt >> /tmp/reportm.txt
  reportewhmcs;
} 

function reportexterior {
  buscarowner;
  echo "Estimado Cliente, hemos detectado que se han realizado validaciones desde ips que no pudieron ser geolocalizadas a su cuenta de email $abusado." > /tmp/reportm.txt
  cat /nutscripts/mensajes/abuso_exterior.txt >> /tmp/reportm.txt
  subjectr="Validacion sospechosa $abusado | Pais: $pais | Titular: $owner $domainowner | Contacto: $email | Servidor $host";
  reportewhmcs;
}


function reportescript {
  buscarowner;
  echo "Estimado Cliente, hemos detectado que desde su sitio web $dominio  se ha realizado un envío masivo de correos." > /tmp/reportm.txt
  echo "El o los posibles archivos que posiblemente se hayan utilizado para realizar este envío se encuentra en:" >> /tmp/reportm.txt
  echo "$path" >> /tmp/reportm.txt
  cat /nutscripts/mensajes/abuso_script.txt >> /tmp/reportm.txt
  subjectr="Sitio web vulnerado $dominio | Titlar: $owner $domainowner | Contacto: $email | Servidor $host";
  reportewhmcs;
}

function reportewhmcs {
 #enviamos email a abusos para que quede copia
 #cat /tmp/reportm.txt | /bin/mail -s "$subjectr" $emailabuso;
 #enviamos reporte al cliente
 cat /tmp/reportm.txt | /bin/mail -s "$subjectr" -r soporte@nuthost.com $email;
}


#############################
#     Correo por smtp       #
#############################

function smtpemail {
 ##eliminamos los logs anteriores
 rm -f $emailsvulnerados;
 rm -f $sentchart;
 rm -f $log_ips_arg;
 rm -f $logenviados;

 ##analizamos el log de trabajo
 ##ips exclude
 grep -E 'dovecot_login|dovecot_plain' $worklog | grep -v failed | grep -v -E '(\[IPv6|\[::1]|\[\$ip_local|\[127|\[10.|\[192.168|\[201|\[200|\[190|\[186|\[181|\[24.232|\[209.85|\[74.125|\[191.84|\[149.56.22.100|\[209.13|\[167.250.4|\[167.250.5|\[167.250.6|\[167.250.7|\[185.30.17)' > $logenviados

cat $logenviados | awk -F'[][]' {'print $2'}  | sort | uniq | grep -E '^[0-9]' > $log_just_ips 

/bin/grepcidr -f /nutscripts/files/cirds_arg.txt $log_just_ips > $log_ips_arg

for i in $(cat $log_ips_arg); do
sed -i "/$i/d" $logenviados
done


 cat $logenviados > /dev/null
 while read line
 do
  ip=$(echo $line | awk -F'[][]' {'print $2'});
  cemail=$(echo $line | awk -F 'dovecot_login:' {'print $2'} | awk {'print $1'});

  #pais=`/nutscripts/nut_geoip.sh $ip | awk '{ print $2 }' | sed 's/\"//g' | tr -d '\n'`
  pais=`/usr/bin/geoiplookup $ip | grep Country | awk '{ print $4 }' | cut -d '=' -f 2 | sed 's/,$//'`

  dominio_=$(echo $cemail | awk -F "@" {'print $2'});

  esta=`grep $cemail /nutscripts/files/exclude.txt`
  si_esta=$?


  if [[ "$pais" != "AR" ]] && [[ "$pais" != "UY" ]] && [[ "$pais" != "ES" ]] && [[ "$pais" != "MX" ]] && [[ "$pais" != "US" ]] && [[ "$pais" != "CL" ]] && [[ "$pais" != "PY" ]] && [[ "$pais" != "PE" ]] && [[ $pais != "BR" ]] && [ ! -z "$pais"  ] && [[ $si_esta != 0 ]] ; then 
    #paises que tienen que ser bloqueados
    echo $cemail $dominio_ $ip $pais >> $emailsvulnerados;
  else
    #generamos la cantidad para los paises autorizados a hacer relay
    echo $cemail $dominio_ $ip $pais >> $sentchart;
  fi;

 done < $logenviados

 ##analisis de vulnerados
 if [ -f $emailsvulnerados ]; then
 awk {'print $1'} $emailsvulnerados | sort | uniq -c > $countvulnerados
 cat $countvulnerados > /dev/null
  while read line
  do
   emilio=$(echo $line | awk {'print $2'});
   dominio=$(echo $emilio | awk -F "@" {'print $2'});

   if [ ! -z $emilio ] 
   then
       #suspendemos la cuenta de email
  	/nutscripts/suspend_mail_acct.sh $emilio
        echo -n > /etc/relayhosts;
        abusado=$(echo $emilio);
       #limpiamos queue
        /usr/sbin/exiqgrep -i -f  "$emilio" |  xargs /usr/sbin/exim -Mrm
       #enviamos reporte
        pais=$(grep $emilio $emailsvulnerados | awk '{print $4 "("$3")"}' | head -n 1);
        reportexterior;
       #seteamos para limpieza general
        cleanq=$((cleanq+1));
   fi
  done < $countvulnerados 
 fi

 ##verificacion de cantidad de envíos autorizados
 if [ -f $sentchart ]; then
  awk {'print $1'} $sentchart | sort | uniq -c > $countenviados
  cat $countenviados > /dev/null
  while read line
  do
   cantidad=$(echo $line | awk {'print $1'}); 
   emilio=$(echo $line | awk {'print $2'});
   dominio=$(echo $emilio | awk -F "@" {'print $2'});

   excludecheck=`grep $dominio /nutscripts/files/exclude.txt`
   exclude=$?

   if [ ! -z $emilio ] && [[ $exclude != 0 ]]
   then
    if [[ $cantidad -gt $limitesmtp  ]]
     then
       #echo $cantidad = $emilio;
       #suspendemos la cuenta de email
  	/nutscripts/suspend_mail_acct.sh $emilio
          echo -n > /etc/relayhosts
          abusado=$(echo $emilio);
       #limpiamos queue
  	/usr/sbin/exiqgrep -i -f  "$emilio" |  xargs /usr/sbin/exim -Mrm
          #seteamos para limpieza general
  	cleanq=$((cleanq+1));
       #enviamos reporte
       reportehora
    fi
   fi
  done < $countenviados 
 fi
}


#################################
#     Correo por Script		#
#################################
function scriptrelay {

  grep "P=local" $worklog | grep `hostname` | awk '{ print $5}' | awk -F "@" '{ print $1 }' | grep -v -E "<>|root" | sort | uniq -c | sort > /tmp/enviados_por_script.txt

  for i in $(cat /tmp/enviados_por_script.txt | awk '{ if ($1 > 120 ) print $2}'); 
  do 

    home=`cat /etc/passwd | grep -w $i | awk -F ":" '{ print $6 }'`
    dominio=`grep $i /etc/trueuserdomains | awk -F ":" '{ print $1 }'`
    path=`grep cwd $worklog | grep $home | awk '{ print$3 }' | awk -F "=" '{ print $2 }' | uniq -d`
    reportescript;
    
    ####suspendemos al usuario
    /scripts/suspendacct $i "hack y envio masivo" disallow
    if [[ -d $path ]] && [[ -w $path ]]; then
     borrados_u=`exim -bp | grep $i | awk '{print $3}' | xargs exim -Mrm | wc -l`
     echo
    fi;
    cleanq=$((cleanq+1));

done; 

}


#### ejecutamos los filtros

if [ "$carga" -lt "12" ]; 
then
  dn=$(date --date="-10 min" "+%Y-%m-%d %H:%M")
  d=${dn: : 15}

  grep "$d" /var/log/exim_mainlog > $worklog
  sed -i -- 's/dovecot_plain/dovecot_login/g' $worklog

  smtpemail;
  scriptrelay;
fi

###########################
#    Borrado de queue     #
###########################

if [[ $cleanq -gt 0  ]]
then 
 /sbin/service dovecot restart; /sbin/service exim restart
 /usr/sbin/exiqgrep -i -f  "<>" | xargs /usr/sbin/exim -Mrm
 #echo lala;
fi