Entspricht Denyhosts, aber für HTTP-Anfragen?

7

Mein Webserver (apache2) wird ständig von böswilligen Bots heimgesucht und fragt nach URLs wie diesen:

   /blog/tag/pnphpbb2//index.php?name=PNphpBB2&file=posting&mode=quote/index.php?name=PNphpBB2&file=viewtopic&p=34004/viewtopic.php?p=15&sid=be4c914eb746ac7c96beea717fdfc692/&highlight=../../../../../../../../../../../../../etc/passwd%00 HTTP Response 301

   //index.php?name=PNphpBB2&file=posting&mode=quote/index.php?name=PNphpBB2&file=viewtopic&p=34004/viewtopic.php?p=15&sid=be4c914eb746ac7c96beea717fdfc692/&highlight=../../../../../../../../../../../../../etc/passwd%00 HTTP Response 200

   /wiki/index.php/Main:Some_Wiki_Pagename//index.php?name=PNphpBB2&file=posting&mode=quote/index.php?name=PNphpBB2&file=viewtopic&p=34004/viewtopic.php?p=15&sid=be4c914eb746ac7c96beea717fdfc692/&highlight=../../../../../../../../../../../../../etc/passwd%00 HTTP Response 200

   /wiki/index.php//index.php?name=PNphpBB2&file=posting&mode=quote/index.php?name=PNphpBB2&file=viewtopic&p=34004/viewtopic.php?p=15&sid=be4c914eb746ac7c96beea717fdfc692/&highlight=../../../../../../../../../../../../../etc/passwd%00 HTTP Response 200

   /blog/2009/01/title-of-post-here//index.php?name=PNphpBB2&file=posting&mode=quote/index.php?name=PNphpBB2&file=viewtopic&p=34004/viewtopic.php?p=15&sid=be4c914eb746ac7c96beea717fdfc692/&highlight=../../../../../../../../../../../../../etc/passwd%00 HTTP Response 301

Ich möchte, dass ein nächtlicher Cron-Prozess jeden Host findet, der eine "böswillige" URL anfordert, und sie einem HTTP hinzufügt, das hosts.deny entspricht.

Ich würde mir vorstellen, dass es eine Reihe von regulären Ausdrücken geben würde, die schädliche URLs definieren, sowie möglicherweise ein Apache-Plugin, mit dem der Host problemlos abgelehnt werden kann (ohne jeden Abend einen httpd-Neustart durchführen zu müssen).

Gibt es so etwas?

Slacy
quelle
Und nein, ich habe keine PNphpBB-Installation und habe überprüft, dass dies keine legitimen Sicherheitslücken in meinem Server sind.
Slacy
Es sieht so aus, als hätten zwei dieser "böswilligen" URLs funktioniert (Antwortcode 200).
David
Würde dies Sie nicht für einen bösen Denial-of-Service-Angriff öffnen? Wenn ich auf eine URL in Ihrer Sperrliste zugreife, kann niemand, der denselben Proxy wie ich verwendet, Ihre Website jetzt nicht erreichen.
David Schwartz
@ David: Die 200 bedeutet nur, dass er ihnen eine Seite zurückgegeben hat. Es handelt sich höchstwahrscheinlich um eine Fehlerseite (obwohl kein HTTP-Fehler), die besagt, dass die Anforderung nicht verstanden werden konnte oder dergleichen. (Weil er keine Versionen dieser Skripte ausführt, die anfällig sind, aber die Skripte existieren.)
David Schwartz

Antworten:

7

fail2ban scannt Protokolldateien wie / var / log / apache / error_log und verbietet IP, wodurch diese automatisierten Scans auf regulären Ausdrücken basieren (sogenannte Filter). Standardmäßig wird die Firewall (iptables) aktualisiert, um die fehlerhafte IP zu blockieren. Es ist sehr einfach, neue Aktionen zu schreiben, und die Implementierung einer Aktion zum Aktualisieren eines .htaccess sollte recht einfach sein. In der fail2ban-Distribution sind mehrere Beispiele verfügbar.

rkthkr
quelle
1

Ich werde zweitens fail2ban . Es funktioniert live, kann vorübergehend gesperrt werden und IP-Adressen zu Ihrer Firewall hinzufügen, sodass Apache keine Zeit damit verschwenden muss.

Noch effizienter in Verbindung mit dem ipset netfilter-Modul für iptables (das für die Verarbeitung großer Adressmengen schneller ist), und es kann sie sofort sperren, sodass sie nur ein oder zwei Anfragen stellen können, bevor sie blockiert werden.

Wenn Sie diese Leute wirklich hassen und Linux ausführen, können Sie auch versuchen, Tarpitting für iptables zu implementieren (eine schnelle Suche hat keine 2.6-kompatiblen Patches gefunden). Dies akzeptiert die Verbindung und setzt dann sofort die Fenstergröße auf 0 (verhindert, dass Daten übertragen werden), verhindert aber auch, dass das entfernte Ende die Verbindung überhaupt schließt, was bedeutet, dass jede App, die eine Verbindung herstellt, irgendwo zwischen drei und zwanzig warten muss ( !!) Minuten vor dem Ende der Verbindung am Ende.

Dies ist auch ideal, um Portscanner zu stoppen, da sie dadurch um Größenordnungen länger dauern als normalerweise.

Dan Udey
quelle
... würde das die Ressourcen Ihres Servers nicht genauso stark binden wie die eines Angreifers ...
Kzqai
0

Wenn es sich um Apache 2.0 handelt, können Sie mod_access ausprobieren: http://httpd.apache.org/docs/2.0/mod/mod_access.html

In Apache 2.2 ist es mod_authz_host: http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html

Es sieht jedoch so aus, als müssten Sie Apache signalisieren, dass die Konfiguration neu geladen werden soll, damit Änderungen an der Konfiguration des Moduls wirksam werden.

Bearbeiten: Modsecurity sieht wie gewünscht aus, im Gegensatz zum Erstellen statischer Verweigerungskonfigurationen, indem Sie Ihre Protokolldateien durchsuchen und eine der oben genannten verwenden. Ich werde diese Antwort jetzt positiv bewerten.

Evan Anderson
quelle
Ja, es sieht so aus, als würde mod_acess es mir ermöglichen, den Zugriff auf diese Benutzer manuell zu verweigern, aber ich suche nach etwas, das automatisch jede IP-Adresse verbietet, die versucht, eine URL anzufordern, die einem bestimmten Satz von regulären Ausdrücken entspricht. Mit anderen Worten, wenn die URL mit ". * / Etc / passwd. *" Übereinstimmt, wird der Anforderer dauerhaft (und sofort) gesperrt. Ich denke, ich könnte einige manuelle URL-Regeln dafür selbst erstellen und ausprobieren, aber ich hoffte auf etwas gut gepflegtes ...
Slacy
0

Eine andere Möglichkeit besteht darin, mod_rewite zu verwenden, um die URL abzugleichen, und dem Client eine 403 (oder einen beliebigen Code) zu senden. Beispiel:

RewriteEngine on
RewriteRule ^/.*passwd.*/ - [L,NC,G]

Oder zum Spaß:

RewriteEngine on
RewriteRule ^/(.*passwd.*)/ http://127.0.0.1/$1 [L,NC,R=301]
David
quelle
Reguläre Ausdrücke sind ziemlich umfangreich und ihre Ausführung für jede Anforderung ist nicht optimal. Es ist ineffizient, nur jemanden umzuleiten oder eine IP-Adresse zu blockieren. Wenn nichts anderes, ist eine 'Verweigern von'-Regel in einem <Location> -Block effizienter.
Dan Udey
0

Ich würde mir OSSEC auf jeden Fall ansehen. Es erkennt diese Muster und kann die IP-Adressen blockieren. Es sucht auch nach Scans (z. B. mehrere 404) und blockiert die IP des Täters.

Und ja, das macht es standardmäßig.

Link: http://www.ossec.net

sucuri
quelle
-1

Ein Beispiel wäre:

<Ort />
   Order Deny, Allow
   Verweigern von 123.123.123.123 231.213.123.0/24
   Erlaube von allen
</ location>

Ich würde empfehlen, dies in einer separaten Datei zu haben, die Sie aus Ihrer Hauptkonfiguration einschließen, und dieses kleine Fragment einfach neu zu schreiben. Sie können ein erneutes Laden durchführen, um die Änderung zu übernehmen, wodurch Ihr Server nicht wie bei einem Neustart gestoppt wird.

David Pashley
quelle
1
Ja, auf diese Weise kann der Zugriff verweigert werden, aber ich suche nach etwas, das schlechtes Verhalten anhand von URL-Zugriffsmustern erkennt und dann bestimmte IP-Adressen (oder Bereiche) basierend darauf verweigert.
Slacy