Kickban! für Spammer - Tobi's Welt

Kickban! für Spammer

Ich hatte gerade ein wenig Langeweile, kombiniert mit Spaß in den Backen. Was kam raus?

Eine PHP & Shellscript Kombination die Spammer von unserem Server bannt. Dazu habe ich zuerst den Spamfilter des XG-GuildCMS erweitert, so das die Ursprungs-IP eines Spamautors geloggt wird (in die Datenbank). Zusätzlich wird vermerkt wie oft diese IP schon gespammt hat. Als weitere Quelle für zu blockende IPs dient mein Blog hier, dazu wird die IP Adresse des Autoren von Kommentaren abgerufen bei denen Akismet der Meinung ist das es Spam ist.

Dazu habe ich mir zum einen ein kleines Shellskript geschrieben das IPs aus /root/blocked.ips ausliest und diese als DROP Regel in eine eigene iptables Chain ablegt. Dieses Skript ist abgeleitet von dem aus diesem Blogpost.

  1. #!/bin/bash
  2. IPT=/sbin/iptables
  3. SPAMLIST="spamlist"
  4. SPAMDROPMSG="SPAM LIST DROP"
  5. BADIPS=$(cat /root/blocked.ips)
  6. $IPT -N $SPAMLIST
  7.  
  8. for ipblock in $BADIPS
  9. do
  10.     $IPT -A $SPAMLIST -s $ipblock -j LOG –log-prefix "$SPAMDROPMSG"
  11.     $IPT -A $SPAMLIST -s $ipblock -j DROP
  12. done

 

Aber die eigentliche Arbeit erledigt das (CLI-)PHP Skript, es ruft alle IP Adressen aus der XG-GuildCMS Datenbank ab die mehr als 5 mal als Spamautoren „aufgefallen“ sind sowie dasselbe noch einmal für die Kommentare in diesem Blog.

  1. <?php
  2. $dbhost = ‚localhost‘;
  3. $dbuser = ‚**********‘;
  4. $dbpass = ‚**********‘;
  5. $dbname1 = ‚**********‘;
  6. $dbname2 = ‚**********‘;
  7. $treshold = 5;
  8. $blacklist = "/root/blocked.ips";
  9. $iptablesChain = "spamlist";
  10.  
  11. $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die (‚Error connecting to mysql‘);
  12. echo "Starting collecting of spam sources for iptables blacklisting (treshold: $treshold) into $blacklist\n\n";
  13.  
  14. // grab XG-GuildCMS spammer
  15. mysql_select_db($dbname1);
  16. echo "Collecting XG-GuildCMS (www.berserks.org) spammers…\n";
  17. $res  = mysql_query("SELECT `ip_adress` FROM `flyff_spamfilter_ips` WHERE `count` > ".$treshold);
  18. while($row = mysql_fetch_array($res)) { $spammerIPs[] = $row[‚ip_adress‘]; }
  19.  
  20. // grab WordPress spammer
  21. mysql_select_db($dbname2);
  22. echo "Collecting WordPress (blog.mcdope.org) spammers…\n";
  23. $res  = mysql_query("SELECT `comment_author_IP` AS `ip`, count(`comment_author_IP`) AS `count` FROM `wp_comments` WHERE `comment_approved` = ’spam‘ GROUP BY `comment_author_IP`");
  24. while($row = mysql_fetch_array($res)) { if($row[‚count‘] > $treshold) { $spammerIPs[] = $row[‚ip‘]; } }
  25.  
  26. if(is_array($spammerIPs) and count($spammerIPs) > 0) {
  27.     echo "Finished collection – collected ".count($spammerIPs)." IP addresses, now going to write blacklist file…\n";
  28.     $handle = fopen($blacklist, "w");
  29.     foreach($spammerIPs as $ip) { fwrite($handle, $ip."\n"); }
  30.     fclose($handle);
  31.     echo "Dropping old iptables chain and create the updated one…\n";
  32.     system("iptables -F ".$iptablesChain);
  33.     system("iptables -X ".$iptablesChain);
  34.     system("/root/create_antispam_iptables_rules.sh");
  35.     echo "Finished!\n\n";
  36. }
  37.  
  38. mysql_close($conn);
  39. ?>

 

Da WordPress möglicherweise einige Sonderzeichen ruiniert bei der Anzeige hier nochmal beide Scripts zum Download: iptables_skripts.tar.bz2

Das „collect“ Skript ist zwar jetzt sehr speziell, sollte aber für Inspiration sorgen. Getestet ist das ganze bislang nur auf Ubuntu 8.04, sollte aber eigentlich keine Probleme auf anderen Systemen machen.

Update: In dem Code fehlte eine Variable am Anfang des PHP Skripts, im Code oben ist es jetzt ausgebessert. Die Skripte im Download-Archiv enthalten den Fehler noch. Dort muss in Zeile 9 der PHP Datei noch folgendes eingefügt werden:

  1. $iptablesChain = "spamlist";

29. Juni 2009 von Tobias
Kategorien: Allgemein, Linux, Programmierung, Ubuntu
Schlagwörter: , , , , ,
Schreibe einen Kommentar

Gelesen: 5423 · Heute: 2 · Zuletzt: 13. December 2018

Kommentar verfassen

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Follow

Get every new post delivered to your Inbox

Join other followers: