Frage Umgang mit HTTP w00tw00t Attacken


Ich habe einen Server mit Apache und ich habe vor kurzem mod_security2 installiert, weil ich dadurch sehr angegriffen werde:

Meine Apache-Version ist Apache v2.2.3 und ich benutze mod_security2.c

Dies waren die Einträge aus dem Fehlerprotokoll:

[Wed Mar 24 02:35:41 2010] [error] 
[client 88.191.109.38] client sent HTTP/1.1 request without hostname 
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)

[Wed Mar 24 02:47:31 2010] [error] 
[client 202.75.211.90] client sent HTTP/1.1 request without hostname 
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)

[Wed Mar 24 02:47:49 2010] [error]
[client 95.228.153.177] client sent HTTP/1.1 request without hostname
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)

[Wed Mar 24 02:48:03 2010] [error] 
[client 88.191.109.38] client sent HTTP/1.1 request without hostname
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)

Hier sind die Fehler aus dem access_log:

202.75.211.90 - - 
[29/Mar/2010:10:43:15 +0200] 
"GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 392 "-" "-"
211.155.228.169 - - 
[29/Mar/2010:11:40:41 +0200] 
"GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 392 "-" "-"
211.155.228.169 - - 
[29/Mar/2010:12:37:19 +0200] 
"GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 392 "-" "-" 

Ich habe versucht, mod_security2 so zu konfigurieren:

SecFilterSelective REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind"
SecFilterSelective REQUEST_URI "\w00tw00t\.at\.ISC\.SANS"
SecFilterSelective REQUEST_URI "w00tw00t\.at\.ISC\.SANS"
SecFilterSelective REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind:"
SecFilterSelective REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind:\)"

Die Sache in mod_security2 ist, dass SecFilterSelective nicht verwendet werden kann, es gibt mir Fehler. Stattdessen verwende ich eine Regel wie diese:

SecRule REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind"
SecRule REQUEST_URI "\w00tw00t\.at\.ISC\.SANS"
SecRule REQUEST_URI "w00tw00t\.at\.ISC\.SANS"
SecRule REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind:"
SecRule REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind:\)"

Auch das funktioniert nicht. Ich weiß nicht mehr, was ich tun soll. Hat jemand einen Rat?

Update 1

Ich sehe, dass niemand dieses Problem mit mod_security lösen kann. Bisher scheint die Verwendung von ip-tables die beste Option dafür zu sein, aber ich denke, dass die Datei extrem groß werden wird, da die IP-Adresse mehrmals am Tag geändert wird.

Ich habe zwei andere Lösungen gefunden, kann jemand sagen, dass sie gut sind oder nicht.

  1. Die erste Lösung, die mir in den Sinn kommt, ist, diese Angriffe aus meinen Apache-Fehlerprotokollen auszuschließen. Dies macht es einfacher für mich, andere dringende Fehler zu erkennen, wenn sie auftreten, und nicht durch ein langes Protokoll zu spucken.

  2. Die zweite Option ist besser, denke ich, und das blockiert Hosts, die nicht auf die richtige Weise gesendet werden. In diesem Beispiel wird der Angriff w00tw00t ohne Hostnamen gesendet, also denke ich, dass ich die Hosts blockieren kann, die nicht in der richtigen Form sind.

Update 2

Nachdem ich die Antworten durchgelesen hatte, kam ich zu den folgenden Schlussfolgerungen.

  1. Eine benutzerdefinierte Protokollierung für Apache wird einige unnötige Ressourcen verbrauchen, und wenn es wirklich ein Problem gibt, sollten Sie sich das vollständige Protokoll ansehen, ohne dass etwas fehlt.

  2. Es ist besser, die Treffer einfach zu ignorieren und sich auf eine bessere Analyse der Fehlerprotokolle zu konzentrieren. Einen Filter für Ihre Protokolle zu verwenden ist ein guter Ansatz dafür.

Abschließende Gedanken zu diesem Thema

Der oben erwähnte Angriff wird Ihre Maschine nicht erreichen, wenn Sie zumindest ein aktuelles System haben, so dass es im Grunde keine Sorgen gibt.

Es kann schwierig sein, alle falschen Angriffe nach einer Weile aus den echten herauszufiltern, da sowohl die Fehlerprotokolle als auch die Zugriffsprotokolle extrem groß werden.

Dies zu verhindern, kostet Sie Ressourcen und es ist eine gute Übung, Ihre Ressourcen nicht für unwichtige Dinge zu verschwenden.

Die Lösung, die ich jetzt benutze, ist Linux Logwatch. Es sendet mir Zusammenfassungen der Protokolle und sie werden gefiltert und gruppiert. Auf diese Weise können Sie leicht das Wichtige vom Unwichtigen trennen.

Vielen Dank für die Hilfe, und ich hoffe, dass dieser Beitrag auch für jemand anderen hilfreich sein kann.


80
2018-03-24 05:33


Ursprung




Antworten:


Aus Ihrem Fehlerprotokoll senden sie eine HTTP / 1.1-Anfrage ohne den Host: Teil der Anfrage. Von dem was ich lese, antwortet Apache mit einem 400 (schlechte Anfrage) Fehler auf diese Anfrage, bevor er an mod_security übergeben wird. Es sieht also nicht so aus, als ob Ihre Regeln verarbeitet werden. (Apache, der sich damit beschäftigt, bevor er an mod_security übergeben werden muss)

Probieren Sie selbst:

telnet hostname 80
GET /blahblahblah.html HTTP / 1.1 (eingeben)
(eingeben)

Sie sollten den Fehler 400 erhalten und den gleichen Fehler in Ihren Protokollen sehen. Dies ist eine schlechte Anfrage und Apache gibt die richtige Antwort.

Richtige Anfrage sollte wie folgt aussehen:

GET /blahblahblah.html HTTP / 1.1
Gastgeber: blah.com

Eine Umgehung für dieses Problem könnte das Patchen von mod_uniqueid sein, um eine eindeutige ID sogar für eine fehlgeschlagene Anfrage zu erzeugen, damit apache die Anfrage an ihre Anforderungshandler weiterleitet. Die folgende URL ist eine Diskussion über dieses Problem und enthält einen Patch für mod_uniqueid, den Sie verwenden könnten:   http://marc.info/?l=mod-security-users&m=123300133603876&w=2

Konnte keine anderen Lösungen dafür finden und fragen, ob eine Lösung tatsächlich benötigt wird.


34
2018-03-29 13:17



Ich sehe das Problem jetzt. Empfiehlst du die Lösung, die in dem Artikel enthalten ist, oder denkst du, es ist besser, sie einfach so zu belassen wie sie ist? Es ist ein Scanner für alle Hintertüren im System. Wenn ich es nur scannen lasse, könnte ich eines Tages angegriffen werden. - Saif Bechan
Hallo Saif, ich denke, solange du deine Apache Installation mit deinen Distributions (oder manuellen) Sicherheits-Patches auf dem neuesten Stand hältst, sollte es dir gut gehen. Eine schlecht strukturierte HTTP / 1.1-Anfrage (wie Sie gesehen haben) sollte nichts anderes als einen 400-Fehler vom Apache zurückgeben. Es sieht so aus als ob kann Es wurde eine Art Schwachstellenscan bei DLink-Routern durchgeführt. (Nach einigen anderen Quellen) - Imo
Gibt es zumindest eine Möglichkeit, diese Felder aus meinem Apache error_log zu entfernen - Saif Bechan
Sie könnte sein kann es über mod_log :: httpd.apache.org/docs/2.2/mod/mod_log_config.html#customlog - Imo
Mein zusätzlicher Hinweis wäre: Konfigurieren Sie Ihre Standard virtualhost neben den tatsächlich verwendeten. Die oben genannten Versuche enden in den Protokollen für die Standard virtueller Host. - Koos van den Hout


Filtern von IPs ist keine gute Idee, imho. Warum versuchst du nicht die Zeichenfolge zu filtern, die du kennst?

Ich meine:

iptables -I INPUT -p tcp --dport 80 -m string --to 60 --algo bm --string 'GET /w00tw00t' -j DROP

15
2018-05-09 16:21



spamcleaner.org/de/misc/w00tw00t.html ähnliche Lösung, aber ein bisschen detaillierter. - Isaac
Ein Problem bei der String-Filterung in der Firewall ist, dass sie "ziemlich langsam" ist. - Alexis Wilke
@AlexisWilke haben Sie Beweise dafür, dass Iptables String-Filterung langsamer als das Filtern auf Apache-Ebene ist? - jrwren


Ich habe auch begonnen, diese Art von Nachrichten in meinen Protokolldateien zu sehen. Eine Möglichkeit, diese Art von Angriffen zu verhindern, ist das Einrichten von fail2ban ( http://www.fail2ban.org/ ) und richten Sie spezifische Filter ein, um diese IP-Adresse in Ihren iptables-Regeln aufzulisten.

Hier ein Beispiel für einen Filter, der die IP-Adresse blockiert, die mit der Erstellung dieser Nachrichten verbunden ist

[Di Aug 16 02:35:23 2011] [Fehler] [Client] Datei existiert nicht: /var/www/skras/w00tw00t.at.blackhats.romanian.antisec :) === Apache W00T W00T Nachrichten Gefängnis - Regex und Filter === Gefängnis

 [apache-wootwoot]
 enabled  = true
 filter   = apache-wootwoot
 action   = iptables[name=HTTP, port="80,443", protocol=tcp]
 logpath  = /var/log/apache2/error.log
 maxretry = 1
 bantime  = 864000
 findtime = 3600

Filter

 # Fail2Ban configuration file
 #
 # Author: Jackie Craig Sparks
 #
 # $Revision: 728 $
 #
 [Definition]
 #Woot woot messages
 failregex = ^\[\w{1,3} \w{1,3} \d{1,2} \d{1,2}:\d{1,2}:\d{1,2} \d{1,4}] \[error] \[client 195.140.144.30] File does not exist: \/.{1,20}\/(w00tw00t|wootwoot|WootWoot|WooTWooT).{1,250}
 ignoreregex =

11
2017-08-19 17:46



Es ist wahr, dass Sie sie blockieren können, aber es gibt keine Notwendigkeit, weil sie nur schlechte Anfragen sind. Es ist besser, sie einfach zu ignorieren, zu speichern, und Sie werden Ressourcen freisetzen. - Saif Bechan
Richtig @Saif Bechan, wenn jemand sich über das "Testen von Angriffen" Sorgen macht, um erfolgreich zu sein, sollte er / sie lieber die eigene Anwendung reparieren, anstatt Zeit zu verschwenden, um einen Weg zu finden, dies zu blockieren. - Thomas Berger
Gab dir +1, danke für die Antwort. - Saif Bechan
@SaifBechan, stimme ich nicht zu. w00tw00t ist ein Schwachstellenscanner, und ein Rechner, der solche Anfragen absetzt, kann nicht mit dem Versuch anderer Arten von Anfragen vertraut werden. Wenn ich also ein Systemadministrator bin und es zwei Minuten dauert, solche Clients tagelang zu sperren, kann ich würde es tun. Ich würde meine gesamte Sicherheitsimplementierung jedoch nicht auf eine solche Vorgehensweise stützen. - Isaac


w00tw00t.at.blackhats.romanian.anti-sec ist ein Hacker-Versuch und verwendet gefälschte IPs, so dass Nachschlagewerke wie VisualRoute aus China, Polen, Dänemark usw. berichten, je nachdem, welches IP zu diesem Zeitpunkt abgeordnet wurde. Das Einrichten einer Deny-IP oder eines auflösbaren Host-Namens ist also nahezu unmöglich, da es sich innerhalb einer Stunde ändert.


3
2018-06-01 11:20



Diese Schwachstellen-Scans verwenden keine gefälschten IP-Adressen. Wenn dies der Fall wäre, wäre der TCP-3-Wege-Handshake nicht abgeschlossen und Apache würde die Anfrage nicht protokollieren. Für Vorbehalte (Rogue ISP, Router-Betreiber, etc.), siehe security.stackexchange.com/q/37481/53422 - Anthony Geoghegan


Ich habe persönlich ein Python-Skript geschrieben, um IPtables-Regeln automatisch hinzuzufügen.

Hier ist eine leicht gekürzte Version ohne Logging und anderen Müll:

#!/usr/bin/python
from subprocess import *
import re
import shlex
import sys

def find_dscan():
        p1 = Popen(['tail', '-n', '5000', '/usr/local/apache/logs/error_log'], stdout=PIPE)
        p2 = Popen(['grep', 'w00t'], stdin=p1.stdout, stdout=PIPE)

        output = p2.communicate()[0].split('\n')

        ip_list = []

        for i in output:
                result = re.findall(r"\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b", i)
                if len(result):
                        ip_list.append(result[0])

        return set(ip_list)

for ip in find_dscan():
        input = "iptables -A INPUT -s " + ip + " -j DROP"
        output = "iptables -A OUTPUT -d " + ip + " -j DROP"
        Popen(shlex.split(input))
        Popen(shlex.split(output))

sys.exit(0)

2
2018-03-24 07:06



Soll das der w00tw00t Angriff verhindern? - Saif Bechan
Ja, ich lasse die Apache-Fehlerprotokolle nach "w00tw00t" -IPs scannen und füge sie hinzu, wenn sie nicht existieren, obwohl ich der Einfachheit halber die Überprüfung auf Duplikate nicht hinzugefügt habe. - Xorlev
Dieses Skript sollte wahrscheinlich eine Tabelle verwenden, indem man den iptables-Ketten eine Menge zusätzlicher Regeln hinzufügt, wird die Verarbeitung ziemlich verlangsamt. - Eric
Es verwendet eine Tabelle. Allerdings habe ich eine Menge davon vereinfacht, da es auf mein System zugeschnitten war. - Xorlev
Denkst du, dass dies eine bessere Lösung ist, um mod_security zu verwenden? - Saif Bechan


Ich glaube, der Grund, warum mod_security nicht funktioniert, ist, dass Apache nicht in der Lage war, die Anfragen selbst zu analysieren, weil sie nicht der Spezifikation entsprechen. Ich bin mir nicht sicher, dass du hier ein Problem hast - Apache protokolliert seltsame Scheiße, die im Netz passiert, wenn es nicht loggt, wirst du nicht merken, dass es überhaupt passiert. Die zum Protokollieren der Anforderungen erforderlichen Ressourcen sind wahrscheinlich minimal. Ich verstehe, dass es frustrierend ist, dass jemand Ihre Logs auffüllt - aber es wird frustrierender sein, wenn Sie die Logging-Funktion deaktivieren, nur um herauszufinden, dass Sie sie wirklich brauchen. Wie jemand in Ihren Webserver eingebrochen ist und Sie die Protokolle benötigen, um zu zeigen, wie sie einbrachen.

Eine Lösung besteht darin, ErrorLogging über Syslog einzurichten, und dann mithilfe von rsyslog oder syslog-ng diese RFC-Verstöße in Bezug auf w00tw00t gezielt zu filtern und zu verwerfen. Alternativ können Sie sie auch in eine separate Protokolldatei filtern, sodass Ihr Haupt-ErrorLog einfach zu lesen ist. Rsyslog ist in dieser Hinsicht unglaublich mächtig und flexibel.

In der httpd.conf könntest du folgendes tun:

ErrorLog syslog:user 

dann in rsyslog.conf hast du vielleicht:

:msg, contains, "w00tw00t.at.ISC.SANS.DFind" /var/log/httpd/w00tw00t_attacks.log

Beachten Sie, dass dieser Ansatz tatsächlich viele Male verwendet wird mehr Ressourcen als ursprünglich verwendet, logging direkt in eine Datei. Wenn Ihr Webserver sehr beschäftigt ist, könnte dies ein Problem werden.

Es empfiehlt sich, alle Logs so schnell wie möglich an einen entfernten Logging-Server zu senden, und das wird Ihnen von Vorteil sein, sollten Sie sich jemals damit auseinandersetzen, da es viel schwieriger ist, den Audit-Trail von dem, was getan wurde, zu löschen.

IPTables-Blockierung ist eine Idee, aber Sie können mit einer sehr großen Iptables-Block-Liste enden, die Auswirkungen auf die Leistung in sich haben kann. Gibt es ein Muster in den IP-Adressen oder stammt es von einem großen verteilten Botnetz? Es wird X% der Duplikate geben müssen, bevor Sie von iptables profitieren können.


2
2018-03-30 11:09



Schöne Antwort, ich mag die verschiedenen Ansätze. Wenn Sie darüber nachdenken, wird die benutzerdefinierte Protokollierung zu mehr Regressverwendung führen, da alles zuerst überprüft werden muss, denke ich, dass diese Option ebenfalls abfällt. Ich habe jetzt Logwatch aktiviert. Dies sendet mir einen Bericht zweimal am Tag mit Zusammenfassungen der ganzen Systeme. Die Apache-Logs werden auch überprüft und es heißt nur 300 Versuche 300 Versuche. Ich denke, ich werde das Setup so lassen, wie es vorerst ist. - Saif Bechan


Sie sagen in Update 2:

Problem, das immer noch besteht   Das Problem, das immer noch besteht, ist wie folgt. Diese Angriffe stammen von Bots, die nach bestimmten Dateien auf Ihrem Server suchen. Dieser spezielle Scanner sucht nach der Datei /w00tw00t.at.ISC.SANS.DFind :).

Jetzt können Sie einfach ignorieren, was am meisten empfohlen wird. Das Problem bleibt, dass, wenn Sie diese Datei irgendwie auf Ihrem Server haben, Sie sich in Schwierigkeiten befinden.

Aus meiner vorherigen Antwort haben wir festgestellt, dass Apache eine Fehlermeldung aufgrund einer schlecht formatierten HTML 1.1-Abfrage zurückgibt. Alle Webserver, die HTTP / 1.1 unterstützen, sollten wahrscheinlich einen Fehler zurückgeben, wenn sie diese Nachricht erhalten (ich habe den RFC nicht doppelt geprüft - vielleicht sagt uns RFC2616).

Mit w00tw00t.at.ISC.SANS.DFind: auf Ihrem Server einige, wo nicht mystisch bedeutet "Sie sind in Schwierigkeiten" ... Wenn Sie die w00tw00t.at.ISC.SANS.DFind: Datei in Ihrem DocumentRoot oder sogar erstellen DefaultDocumentRoot ist egal ... der Scanner sendet eine defekte HTTP / 1.1-Anfrage und Apache sagt "Nein, das ist eine schlechte Anfrage ... auf Wiedersehen". Die Daten in der Datei w00tw00t.at.ISC.SANS.DIND: werden nicht geliefert.

Die Verwendung von mod_security für diesen Fall ist nicht erforderlich, es sei denn, Sie möchten wirklich (kein Punkt?) ... in diesem Fall können Sie es manuell patchen (Link in anderer Antwort).

Eine andere Sache, die Sie möglicherweise verwenden könnten, ist die RBL-Funktion in mod_security. Vielleicht gibt es eine RBL online, wo das w00tw00t IPs (oder andere bekannte bösartige IPs) zur Verfügung stellt. Dies würde jedoch bedeuten, dass mod_security für jede Anfrage eine DNS-Suche durchführt.


1
2018-03-31 08:52



Ich denke nicht, dass Apache sie ablehnt, es wirft nur den Fehler, aber die Suche läuft noch. Ich habe das selbe w00tw00t.at.ISC.SANS.DFind im Zugriffsprotokoll. Es macht ein GET. Also ist die Suche abgeschlossen und wenn Sie die Datei auf Ihrem Rechner haben, wird sie ausgeführt. Ich kann die Zugriffsprotokolleinträge posten, aber sie sehen genauso aus wie das Fehlerprotokoll nur mit einem GET vor ihnen. Apache löst den Fehler aus, aber die Anforderung wird übergeben. Deshalb habe ich gefragt, ob es eine gute Idee wäre, diese Anfrage ohne Hostnamen zu blockieren. Aber ich möchte normale Benutzer nicht blockieren. - Saif Bechan
Sicher, Sie erhalten den gleichen Eintrag im Zugriffsprotokoll, aber schauen Sie sich den Fehlercode an ... 400. Er wird nicht verarbeitet. HTTP / 1.1 (Hostname) wird verwendet, um dem Apache mitzuteilen, an welchen virtuellen Host die Anfrage gesendet werden soll ... Ohne den Hostnamen-Teil der HTTP / 1.1-Anfrage weiß der Apache nicht, wohin er die Anfrage senden soll und gibt den Fehler "400 ungültige Anfrage" zurück zurück zum Kunden. - Imo
Probieren Sie es selbst ... Erstellen Sie sich eine HTML-Seite auf Ihrem Webserver und versuchen Sie es manuell mit "telnet hostname 80" zu erreichen ... die anderen Schritte sind in meiner ersten Antwort. Ich würde ein großes Kopfgeld darauf legen, dass Sie die HTML-Datei nicht mit HTTP / 1.1 ohne den Hostnamen anzeigen lassen können. - Imo
Ah ja, ja, dass, um es mir zu zeigen. Ich dachte immer, dass die access_log Einträge waren, die durch das Fehlerprotokoll weitergegeben wurden und tatsächlich in Ihren Computer eingegeben wurden. Danke, dass Sie mich darauf hingewiesen haben und ich werde meinen Beitrag bearbeiten. Ich schätze deine Hilfe sehr. - Saif Bechan
Hi Saif, keine Probleme, froh, dass ich geholfen habe. Grüße, Imo - Imo


Wie wäre es, eine Regel zu ModSecurity hinzuzufügen? Etwas wie das:

   SecRule REQUEST_URI "@rx (?i)\/(php-?My-?Admin[^\/]*|mysqlmanager
   |myadmin|pma2005|pma\/scripts|w00tw00t[^\/]+)\/"
   "severity:alert,id:'0000013',deny,log,status:400,
   msg:'Unacceptable folder.',severity:'2'"

1
2017-08-09 08:23





Ich sehe, dass die meisten der Lösungen oben bereits abgedeckt sind, aber ich möchte darauf hinweisen, dass nicht alle Der Client hat eine HTTP / 1.1-Anfrage ohne Hostnamen gesendet Angriffe richten sich direkt auf Ihren Server. Es gibt viele verschiedene Versuche, das Ihrem Server vorausgehende Netzwerksystem zu erfassen und / oder zu nutzen, d.h.

client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /tmUnblock.cgi

Ziel ist es, den Fokus auf die Linksys zu legen und die Verteidigungsbemühungen auf alle Systeme mit gleichem Anteil zu verteilen, dh Routerregeln zu implementieren, Firewallregeln zu implementieren (hoffentlich hat Ihr Netzwerk einen), Firewall / IP-Tabelle zu implementieren Regeln und zugehörige Dienste, zB mod_security, fail2ban und so weiter.


1
2017-10-08 18:10