Das Problem
Wer ein System mit öffentlicher IP betreibt, kennt das: Kaum ist der Server online, hämmern Bots und Script Kiddies auf SSH, Postfix und alles, was nach Dienst aussieht. Fail2Ban sperrt die Adressen, meldet sie an AbuseIPDB und verteilt die Sperren auf die anderen Kisten. So weit, so automatisch.

Aber was ist mit dem Hoster oder ISP hinter der IP? Meistens steckt ein kompromittierter Root-Server oder VPS dahinter. Vielleicht weiß der Admin noch gar nichts davon. Im whois zur IP findet sich eine abuse-mailbox, an die man sich wenden kann.
➜ ~ whois 8.8.8.8|grep -i abuse OrgAbuseEmail: ipaddressing@level3.com OrgAbuseEmail: network-abuse@google.com
Ehrlich gesagt: Der Großteil dieser Abuse-Mails landet beim Empfänger in /dev/null. Rückmeldungen bekommt man fast nie, und oft hat es schlicht keinen Effekt. Hin und wieder hilft es aber jemandem. Deshalb schiebe ich ab und zu einen Abuse an, will dabei aber so wenig Arbeit wie moeglich reinstecken.
Abuse melden: Was gehört rein?
Damit der Empfänger etwas mit der Meldung anfangen kann, sollte sie folgende Informationen enthalten:
- Die IP-Adresse des eigenen Systems.
- Die IP-Adresse, von der die Angriffe kommen.
- Ein paar Zeilen aus dem Logfile, die das Problem zeigen.
- Die Zeitzone des eigenen Systems, damit die Zeitangaben im Log nutzbar sind.
- Eine kurze Beschreibung des Problems.
- Die Erlaubnis, die Kontaktdaten an den Kunden weiterzugeben.
Das Script
Da mich Fail2Ban direkt mit dem whois zur IP informiert, brauche ich nur noch etwas, das die restlichen Informationen einsammelt und die Mail generiert. Dafür habe ich folgendes Bash-Script geschrieben. Man übergibt die IP und die Abuse-Adresse, das Script validiert beides, sammelt die passenden Zeilen aus dem auth.log, baut die Mail zusammen und schickt sie nach einer Sichtkontrolle ab.
#!/usr/local/bin/bash
if [ "$1" == "-h" ] ; then
printf "You can add abuse ip and mail on start or interactive by request."
printf "Usage 1: abusemail.sh 1.2.3.4 example@example.org"
printf "Usage 2: abusemail.sh"
exit 0
fi
myip="1.2.3.4"
bcc="my@mail.com"
function validateMail()
{
local mail=$1
local stat=1
if [[ "$mail" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$ ]]; then
stat=0
fi
return $stat
}
function validateIP()
{
local ip=$1
local stat=1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS='.'
ip=($ip)
IFS=$OIFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
stat=$?
fi
return $stat
}
clear
printf "\x1b[31;1;4mCreate und send abuse e-mail!\x1b[0m\n\n"
printf "Enter IP Address"
if [ "$1" == "" ] ; then
read ip
else
ip=$1
fi
validateIP $ip
if [[ $? -ne 0 ]];then
printf "Invalid IP Address ($ip)"
exit 1
else
printf "$ip ==> \x1b[32;1;4mOK\x1b[0m\n\n"
fi
printf "\n"
printf "Enter Abuse E-Mail Address"
if [ "$1" == "" ] ; then
read mail
else
mail=$2
fi
validateMail $mail
if [[ $? -ne 0 ]];then
printf "Invalid Abuse E-Mail Address ($mail)"
exit 1
else
printf "$mail ==> \x1b[32;1;4mOK\x1b[0m"
fi
printf "Dear abuse team,\n\nI got some SSH connections from one of your IPv4 addresses. It seems to\nbe a bot or something....\n\nYes, you can forward this E-Mail with contact informations to your \ncustomer to solve this case, if necessary.\n\nMy timezone: Europe/Berlin\nMy IPv4: $myip\nYour IPv4: $ip\n\nSome log snippets:\n" > /tmp/abusemail
grep $ip /var/log/auth.log >> /tmp/abusemail
printf "\nBest regards\nSebastian van de Meer\n" >> /tmp/abusemail
printf "\n\n\n\x1b[31;1;4mCheck e-mail before sending!\x1b[0m\n\n"
printf "\x1b[32;1;4mRecipient:\x1b[0m $mail\n\n"
printf "\x1b[32;1;4mSubject:\x1b[0m Abuse against: $ip - Brute Force\n\n"
cat /tmp/abusemail
printf "\n\n"
while true
do
printf "\x1b[33;1;4mSend Abuse Mail? [Y/n]\x1b[0m\n"
read -r input
case $input in
[yY][eE][sS]|[yY])
cat /tmp/abusemail | /usr/local/bin/mailx -s "Abuse against: $ip - Brute Force" -r "My Name " -b $bcc $mail
printf "Abuse Mail is on it's way..."
break
;;
[nN][oO]|[nN])
printf "Abuse Mail aborted"
break
;;
*)
printf "Invalid input..."
;;
esac
done
Das Script ist alt, stumpf und einfach. Es tut genau das, was es soll: Arbeit abnehmen bei einer Aufgabe, die sich meistens sowieso nicht lohnt. Wer das Thema automatisierter weitertreiben will, kann sich mal SSH-Bruteforce und AbuseIPDB anschauen. Dort geht es darum, wie Fail2Ban und AbuseIPDB zusammenspielen.
Fazit
Abuse-Mails sind undankbar. Die meisten verpuffen, manche helfen. Wer trotzdem ab und zu eine rausschicken will, ohne jedes Mal alles von Hand zusammenzusuchen, hat mit so einem Script zumindest den Aufwand minimiert.
Fragen? Einfach melden.
Schreibe einen Kommentar