????
Current Path : /nutscripts/ |
Current File : //nutscripts/control_exim.sh.original |
#!/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.|\[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