Abwehr des Botnets PushDo/Cutwail (EHLO ylmf-pc) mit IPTABLES String Recent SMTP

Abstract

In letzter Zeit wurden unsere Postfix-Logs von Meldungen mit dem EHLO-String ylmf-pc überschwemmt, verursacht durch das PushDo/Cutwail-Botnet. Die hier gezeigte Lösung besteht darin, nun schon auf Firewall-Ebene zu filtern.

In letzter Zeit wurden unsere Postfix-Logs von Meldungen mit dem EHLO-String ylmf-pc überschwemmt, verursacht durch das Botnet PushDo/Cutwail .

Im Log sieht das folgendermaßen aus:

mail postfix/postscreen[23406]: PREGREET 14 after 0.3 from [x.x.x.x]:3677: EHLO ylmf-pc\r\n

Das Postscreen-Programm von Postfix wehrt den Angriff erfolgreich ab. Die vielen Log-Einträge sind allerdings sehr störend, und es besteht kein Anlass, sie im Log zu sammeln.

Hier nun eine mögliche Abwehr mit iptables <https://www.netfilter.org/projects/iptables/index.html>.

Note

Das String Module von iptables wertet live alle Strings aus, die im Datenstrom vorbeifliegen. Das kann den Server bei sehr viel Verkehr überlasten!

iptables -I INPUT -p tcp --dport 25 -m string --to 90 \
    --string "EHLO ylmf-pc" --algo bm -m recent \
    --name SMTP_ERROR --set
iptables -I INPUT -m recent --name SMTP_ERROR \
    --rcheck --seconds 180 --hitcount 3 -j DROP
iptables -I INPUT -p tcp --dport 25 -m string --to 90\
    --string "EHLO ylmf-pc" --algo bm -j LOG \
    --log-level info --log-prefix "SMTP_ERROR "

Diese Policy bewirkt, dass eine IP-Adresse, die über SMTP (siehe: --dport 25) den String EHLO ylmf-pc dreimal sendet, für 180 Sekunden geblockt wird.

Etwas einfacher ist folgende Regel:

iptables -I INPUT -p tcp --dport 25 -m string --algo bm --string 'ylmf-pc' -j DROP

Im Log der Firewall ( kern.log ) findet man dann etwas in dieser Art:

SMTP_ERROR IN=eth0 OUT= MAC=..:..:..:..:..:..:..:..:..:..:..:..:..:.. SRC=x.x.x.x DST=x.x.x.x LEN=54 TOS=0x00 PREC=0x00 TTL=111 ID=3363 DF PROTO=TCP SPT=3677 DPT=25 WINDOW=65501 RES=0x00 ACK PSH URGP=0

Live findet sich das in der Recent-Tabelle:

cat /proc/net/xt_recent/SMTP_ERROR
src=x.x.x.x ttl: 111 last_seen: 6022806860 oldest_pkt: 2 6022770010, 6022806860

Note

Die Anzahl der Einträge ist beschränkt, lässt sich aber vergrößern.

chmod 600 /sys/module/xt_recent/parameters/ip_list_tot
echo 10000000 > /sys/module/xt_recent/parameters/ip_list_tot
chmod 400 /sys/module/xt_recent/parameters/ip_list_tot

Es hilft übrigens auch ein Flush der iptables-Regeln, um die Tabelle zu leeren.

Robert Schetterer,07. November 2015