Werkzeuge » BotHunter

BotHunter jagt Bots, Crawler und Spider

Grundideen

Innerhalb einer Webanwendung ist es problematisch, Bots zu erkennen, weil die Anwendung bei jedem Zugriff neu gestartet wird. Ein ständig laufendes Programm kann eine Reihe von Adressen im Speicher halten und somit sehr viel schneller und flexibler agieren. Zudem ist ein eigenständig laufendes Programm im Entwurf unabhängig von der jeweiligen Anwendung.

Die Daten sollen von der Webanwendung kommen, dort muß also eine Funktion eingebunden werden, die IP-Adresse, User-Agent und andere Parameter an den BotHunter meldet. Die Kommunikation soll über UDP erfolgen, denn ich will vermeiden, dass die Anwendung warten muß. Wenn eine Meldung ausbleibt, ist der größtmögliche Schaden, dass die Anwendung normal reagiert und der BotHunter auf diesen Datensatz verzichten muß. Da ich keine 100%-Lösung anstrebe, ist dieses Manko vernachlässigbar. Die Auswirkungen in der Praxis können durch Vergleich mit den Weblogs ermittelt werden.

Client (z.B. Shop oder CMS)

Der Client soll minimal belastet werden, und das ist prinzipiell mit einem Zweizeiler möglich:

$socket = @fsockopen('udp://192.168.207.130:10000');
@fputs($socket, $_SERVER['REMOTE_ADDR']);

In der Praxis müssen für einen reibungslosen Programmablauf die übergebenen Parameter geprüft werden. Wesentliche Parameter ermittle ich über einen Honeypot, weitere werden durch Logfile-Analysen hinzukommen.

Server

Auch der Server ist prinzipiell äußerst einfach:

$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
 
if (!$socket) die('Unable to create socket');
if (!socket_bind($socket, '192.168.207.130', 10000)) die('Unable to bind socket');
 
while(true) {
    $data = @socket_read($socket, 100);
 
    echo $data . "n"; 
}

Zunächst wird ein Socket erzeugt, anschließend werden in einer Endlosschleife die eingehenden Nachrichten gelesen und im obigen Beispiel auf der Konsole ausgegeben. In der Praxis müssen die Nachrichten noch verarbeitet werden. Die Länge der Nachrichten ist im obigen Beispiel willkürlich gewählt.

 

Testdaten

Für die Entwicklung benutze ich zunächst reale Daten aus Apache-Protokollen. Das Log-Format ist wie folgt eingestellt:

 LogFormat "%v %h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i" %I %O" ispcplog

und wird mit column -t aufbereitet. Anschließend greife ich mir die Daten in einer kleinen Routine (sxBotClient.php)auf. Die Spalten des Logfiles gliedern sich wie folgt, wobei die Anfangsspalte vorgestellt ist:

Bei genauerer Betrachtung ist die Lösung über "column" nicht ideal, statt dessen fand ich im Netz eine Lösung, die letztlich auf O'Reilly zurückzuführen ist:

$socket = @fsockopen('udp://192.168.207.130:10000');
$fh = fopen('apache.log', 'r');
$m=array();

	while ($row = fgets($fh)) {
		if (preg_match("/^(S+) (S+) (S+)  "(S+) (.*?) (S+)" (S+) (S+) (".*?") (".*?")$/", $row, $m)){ 
			$ip = $m[1];
			$xUser = $m[2];
			$authUser = $m[3];
			$date = $m[4];
			$time = $m[5];
			$timeOffset = $m[6];
			$method = $m[7];
			$url = $m[8];
			$protocol = $m[9];
			$status = $m[10];
			$bytes = $m[11];
			$referer = $m[12];
			$browser = $m[13];
			@fputs($socket, $ip."t".$date."t".$method."t".$referer."t".$browser);
		}
	}

Datum und Zeit aus dem Logfile sollte ich wohl im Client aufbereiten, die echte Client-Funktion in der Applikation kann den Timestamp direkt liefern, und ich brauche auf dem Server eigentlich nur die Differenz zwischen den Zugriffen. Ein menschlicher Benutzer kann einfach nicht so schnell sein, wie ein Bot.

Logfile vs. Applikationsdaten

Für den Test kann ich die Logfiles einsetzen, muß aber beachten, dass sich die Daten im Detail doch erheblich unterscheiden. So kann man leicht feststellen, dass ein echter Zugriff durch einen regulären Browser im Logfile durch eine ganze Serie von Zugriffen dokumentiert ist. Der erste Zugriff betrifft in diesem Fall eine bestimmte Seite, unmittelbar darauf erfolgt eine Reihe weiterer Zugriffe, um die Komponenten der Seite (Bilder, CSS, JavaScript, ...) nachzuladen. Die Folgezugriffe enthalten in diesem Fall die Primärseite als Referrer, und das regelmäßig auch noch kaskadiert, z.B. durch ein Hintergrundbild im CSS.

Kommen die Daten dagegen aus einer Applikation, geht pro menschlichem Benutzer genau ein Datensatz pro Seite an den BotHunter

Entscheidungskriterien

Good Bots

Es gibt nur eine Handvoll nützlicher Bots, für sie kann eine Sonderbehandlung gelten. Allerdings müssen sie zuverlässig erkannt sein. Nicht überall, wo Google draufsteht ist auch Google drin. Also wird ein gethostbyaddr() zur Überprüfung herhalten müssen. Um mit derartigen Abfragen keine Zeit zu verschwenden, sollte eine bestätigte Info in einem Array vorgehalten werden.

Welche Bots der jeweilige Betreiber für nützlich hält, ist individuell verschieden. Daher gibt es eine Liste 'goodBots.csv', in der je Zeile die Kennzeichnung des Bots aus dem User-Agent, ein Semikolon und die Web-Adresse des Bots steht, z.B.:

googlebot;googlebot.com
msnbot;msn.com

WICHTIG
Schnittstellen der jeweiligen Software müssen unbedingt beachtet werden. So laufen beispielsweise auch XML-RPC oder SOAP-Schnittstellen zur Warenwirtschaft oder im Falle OXID auch eFire. Derartige Schnittstellen könnten ebenfalls Ziel von Angriffen sein, müssen aber für berechtigte User frei gehalten werden.

Bad Bots

Getreu dem Motto "Was mir nicht nützt, darf mir keine Kosten verursachen" ist jeder Bot, den ich nicht oben als nützlich erkannt habe, als Bad Bod zu klassifizieren. Auch für Bad Bots stellt eine einfache Liste die schnellste Möglichkeit dar, wenigstens diejenigen auszusortieren, die sich per User Agent ausweisen. Auch in diesem Falle erstelle ich eine Liste, wobei ich hier auf die Kontrolle des Hostnamens verzichten kann.

Anschließend muss ich mich um diejenigen kümmern, die sich nicht ausweisen. Meinetwegen darf jeder dreimal täglich kommen, aber dann sollte Schluß sein.

Erkennungsmerkmale

  1. hohe Frequenz (Achtung: Siehe auch Logfile vs. Applikationsdaten)
  2. kann keine Cookies
  3. kann kein JavaScript
  4. gibt sich per User Agent als Bot zu erkennen
  5. fordert robots.txt an
  6. nascht am Honigtopf
  7. Ist als Honigdieb beim Project Honey Pot bekannt

Bots bringen es fertig, viele Anfragen in äußerst kurzen Abständen zu stellen. Um dieses Merkmal zu nutzen, brauche ich mehrere Anfragen um den minimalen und den durchschnittlichen zeitlichen Abstand zwischen den Anfragen zu ermitteln. Falls die Frequenz das einzige auftretende Merkmal ist, werde ich etliche Seitenaufrufe zulassen müssen.

Die Kriterien Cookie und JavaScript sind recht sichere Merkmale für Bots. Wer im Netz einkaufen will, hat es schwer, wenn er seinem Browser diese Fähigkeiten abgewöhnt, Bots haben sie üblicherweise nicht. Daher wird hier mein nächster Schwerpunkt liegen.

User Agent: s.o.

Auch ein menschlicher Besucher könnte natürlich die Datei robots.txt anfordern, aber warum sollte er? Vielleicht weil er darin sehen kann, was ihn nichts angeht? Immerhin ist die Datei unter anderem dazu gedacht, bestimmte Verzeichnisse oder Dateimuster nicht in den Index der Suchmaschinen aufzunehmen. Gute (und auch graue) Bots halten sich an derlei Anweisungen, bösartige Bots oder böse Menschen finden gerade diese Bereiche interessant.

Der Honigtopf ist ein Verzeichnis, das per robots.txt für Bots verboten ist. Gute Menschen haben keinen Anlass, die Dateien im Honigtopf zu betrachten, sie werden auch nicht hinfinden, solange ich keine Links darauf setze. Wer also dennoch naschen will, fliegt raus.

Das Project Honey Pot stellt ein API zur Verfügung, mit der ich über eine spezielle DNS-Abfrage eine Punktzahl zwischen 0 und 100 bekomme, wobei 0 "unauffällig" und 100 "bitterböser Wiederholungstäter" bedeutet.

Sicherheit der Erkennung

Keins der genannten Kriterien ist 100% sicher. Deshalb denke ich an ein Punktesystem, ähnlich wie es auch gute Spamfilter oder das Project Honey Pot verwenden. So kann ich mehrere Kriterien erfassen, die Punkte aufaddieren und einen brauchbaren Schwellwert für die Sperre ermitteln.

Ausführung

Prototyp

Den Prototypen führe ich auf jeden Fall in PHP aus. Erste Versuche haben ergeben, dass die Verarbeitungsgeschwindigkeit hoch und die CPU-Last gering ist. Auf meiner höchstfrequentierten VE habe ich 160.000 Einträge im Log für 24 Stunden als Stichprobe ermittelt, das entspricht ungefähr 2 Einträgen pro Sekunde. Damit könnte PHP an die natürlichen Grenzen einer Scriptsprache stoßen. Da das Logfile aber nicht nur Seitenaufrufe enthält, sondern eben auch das Nachladen von Elementen wie CSS, Bildern oder Scripts, wird die Zahl der realen Zugriffe deutlich niedriger sein.

PHP hätte auf jeden Fall den Vorteil, allgemein verfügbar zu sein, allerdings neben der Geschwindigkeit auch den Nachteil, dass die Sourcen offen lägen und somit jedem Schädling die Umgehung der Kriterien erleichtert würden.

Parameter

Blacklist (badBots.csv)

Einfache Liste mit je einem Suchbegriff für den Vergleich mit dem User-Agent.

Whitelist (goodBots.csv)

Einfache Liste mit je einem Suchbegriff, Semikolon, URL des echten Bots

Konstanten im Server

SX_GOOD_BOTS für die Whitelist-Datei, SX_BAD_BOTS für die Blacklist-Datei

Logfiles

Ich tendiere dazu, eine Reihe von Logfiles zu erstellen, um hinterher gezielt auswerten zu können.

Sperren

Wie die Sperren letztendlich technisch ausgeführt werden, steht noch nicht fest. Möglicherweise kommen mehrere Optionen parallel zum Tragen. Die Programme iptables, fail2ban und die Konfigurationsdatei .htaccess bieten sich an. Nachfolgend eine .htaccess-Datei, die den Job alleine, aber nur mit reglemäßiger manueller Pflege erledigen kann:

	

    # Added by HackRepair.com, for Bad Bot protection
    Options -Indexes
    RewriteEngine on
    #Block comment spammers, bad bots and some proxies
    RewriteCond %{REMOTE_HOST} 12.226.240.248 [OR]
    RewriteCond %{REMOTE_HOST} 24.111.102.26 [OR]
    RewriteCond %{REMOTE_HOST} 24.117.121.113 [OR]
    RewriteCond %{REMOTE_HOST} 65.30.216.140 [OR]
    RewriteCond %{REMOTE_HOST} 67.87.64.23 [OR]
    RewriteCond %{REMOTE_HOST} 68.12.149.198 [OR]
    RewriteCond %{REMOTE_HOST} 69.139.167.203 [OR]
    RewriteCond %{REMOTE_HOST} 74.95.182.57 [OR]
    RewriteCond %{REMOTE_HOST} 91.121.3.29 [OR]
    RewriteCond %{REMOTE_HOST} 203.94.229.227 [OR]
    RewriteCond %{REMOTE_HOST} 208.96.122.142 [OR]
    RewriteCond %{REMOTE_HOST} 210.0.141.247 [OR]
    RewriteCond %{REMOTE_HOST} 210.197.97.67 [OR]
    RewriteCond %{REMOTE_HOST} 212.179.127.188 [OR]
    RewriteCond %{REMOTE_HOST} 216.246.60.183 [OR]
    RewriteCond %{REMOTE_HOST} 220.156.189.233 [OR]
    RewriteCond %{REMOTE_HOST} 222.36.12.42 [OR]
    # Abuse Agent Blocking
    RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Bolt 0 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Bot mailto:craftbot@yahoo.com [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} CazoodleBot [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^ChinaClaw [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Custo [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Default Browser 0 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^DIIbot [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^DISCo [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} discobot [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Download Demon [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^eCatch [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ecxi [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^EirGrabber [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^EmailCollector [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^EmailWolf [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Express WebPictures [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^ExtractorPro [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^EyeNetIE [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^FlashGet [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^GetRight [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^GetWeb! [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Go!Zilla [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Go-Ahead-Got-It [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^GrabNet [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Grafula [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} GT::WWW [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} heritrix [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^HMView [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} HTTP::Lite [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} HTTrack [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ia_archiver [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} IDBot [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} id-search [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} id-search.org [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Image Stripper [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Image Sucker [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} Indy Library [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^InterGET [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Internet Ninja [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^InternetSeer.com [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} IRLbot [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ISC Systems iRc Search 2.1 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Java [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^JetCar [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^JOC Web Spider [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^larbin [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^LeechFTP [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} libwww [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} libwww-perl [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Link [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} LinksManager.com_bot [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} linkwalker [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} lwp-trivial [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Mass Downloader [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Maxthon$ [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} MFC_Tear_Sample [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^microsoft.url [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} Microsoft URL Control [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^MIDown tool [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Mister PiX [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} Missigua Locator [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*Indy [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*NEWT [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^MSFrontPage [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Navroad [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^NearSite [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^NetAnts [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^NetSpider [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Net Vampire [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^NetZIP [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Nutch [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Octopus [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Offline Explorer [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Offline Navigator [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^PageGrabber [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} panscient.com [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Papa Foto [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^pavuk [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} PECL::HTTP [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^PeoplePal [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^pcBrowser [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} PHPCrawl [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} PleaseCrawl [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^psbot [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^RealDownload [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^ReGet [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Rippers 0 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} SBIder [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^SeaMonkey$ [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^sitecheck.internetseer.com [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^SiteSnagger [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^SmartDownload [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} Snoopy [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} Steeler [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^SuperBot [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^SuperHTTP [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Surfbot [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^tAkeOut [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Teleport Pro [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Toata dragostea mea pentru diavola [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} URI::Fetch [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} urllib [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} User-Agent [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^VoidEYE [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Web Image Collector [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Web Sucker [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} Web Sucker [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} webalta [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^WebAuto [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^[Ww]eb[Bb]andit [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} WebCollage [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^WebCopier [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^WebFetch [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^WebGo IS [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^WebLeacher [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^WebReaper [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^WebSauger [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Website eXtractor [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Website Quester [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^WebStripper [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^WebWhacker [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^WebZIP [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} Wells Search II [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} WEP Search [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Wget [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Widow [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^WWW-Mechanize [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Xaldon WebSpider [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} Yandex [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} zermelo [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Zeus [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Zeus.*Webster [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ZyBorg [NC]
    RewriteRule ^.* - [F,L]
    # Abuse bot blocking rule end
    order allow,deny
    allow from all
    # Start Custom Blocks
    # Bluecoat
    deny from 8.21.4.254
    deny from 65.46.48.192/30
    deny from 65.160.238.176/28
    deny from 85.92.222.0/24
    deny from 206.51.36.0/22
    deny from 216.52.23.0/24
    # cyveillance (already blocked 38.*)
    deny from 38.100.19.8/29
    deny from 38.100.21.0/24
    deny from 38.100.41.64/26
    deny from 38.105.71.0/25
    deny from 38.105.83.0/27
    deny from 38.112.21.140/30
    deny from 38.118.42.32/29
    deny from 65.213.208.128/27
    deny from 65.222.176.96/27
    deny from 65.222.185.72/29
    # Cyberpatrol
    deny from 38.103.17.160/27
    # Internet Identity - Anti-Phishing
    deny from 66.113.96.0/20
    deny from 70.35.113.192/27
    # Ironport
    deny from 204.15.80.0/22
    # Lightspeed Systems Security
    deny from 66.17.15.128/26
    deny from 69.84.207.32/27
    deny from 69.84.207.128/25
    # Layered Technologies
    deny from 72.36.128.0/17
    deny from 72.232.0.0/16
    deny from 72.233.0.0/17
    deny from 216.32.0.0/14
    # M86
    deny from 67.192.231.224/29
    deny from 208.90.236.0/22
    # McAfee-Secure-Computing
    deny from 69.48.241.64/26
    deny from 80.66.0.0/19
    deny from 192.55.214.0/24
    deny from 207.67.117.0/24
    # Phish-Inspector.com
    deny from 209.147.127.208/28
    # Prescient Software, Inc. Phishmongers
    deny from 198.186.190.0/23
    deny from 198.186.192.0/23
    deny from 198.186.194.0/24
    # urlfilterdb
    deny from 207.210.99.32/29
    # websense-in.car1.sandiego1.level3.net
    deny from 4.53.120.22
    # Websense
    deny from 66.194.6.0/24
    deny from 67.117.201.128/28
    deny from 69.67.32.0/20
    deny from 131.191.87.0/24
    deny from 204.15.64.0/21
    deny from 208.80.192.0/21
    deny from 212.62.26.64/27
    deny from 213.168.226.0/24
    deny from 213.168.241.0/30
    deny from 213.168.242.0/30
    deny from 213.236.150.16/28
    # Yandex
    deny from 77.88.0.0/18
    deny from 77.88.22.0/23
    deny from 77.88.24.0/21
    deny from 77.88.24.0/22
    deny from 77.88.28.0/22
    deny from 77.88.36.0/23
    deny from 77.88.42.0/23
    deny from 77.88.44.0/24
    deny from 77.88.50.0/23
    deny from 87.250.224.0/19
    deny from 87.250.230.0/23
    deny from 87.250.252.0/22
    deny from 93.158.128.0/18
    deny from 93.158.137.0/24
    deny from 93.158.144.0/21
    deny from 93.158.144.0/23
    deny from 93.158.146.0/23
    deny from 93.158.148.0/22
    deny from 95.108.128.0/17
    deny from 95.108.128.0/24
    deny from 95.108.152.0/22
    deny from 95.108.216.0/23
    deny from 95.108.240.0/21
    deny from 95.108.248.0/23
    deny from 178.154.128.0/17
    deny from 178.154.160.0/22
    deny from 178.154.164.0/23
    deny from 199.36.240.0/22
    deny from 213.180.192.0/19
    deny from 213.180.204.0/24
    deny from 213.180.206.0/23
    deny from 213.180.209.0/24
    deny from 213.180.218.0/23
    deny from 213.180.220.0/23
    # End Custom Blocks. Add a couple line breaks below this as well.
Powered by Etomite CMS.