Mailinglisten-Archive |
Vor einer Weile schrieb ich:
> Ich habe die "Teergrube" nun im Testbetrieb laufen und ergänze den
> "Erfolgsfall" um
>
> error_log("[info] Teergrube: IP = ".$_SERVER['REMOTE_ADDR']." (".gethostbyaddr($_SERVER['REMOTE_ADDR']).") / FILE = ".$_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'], 0);
>
> damit ich im error.log sehe, wann und wie diese Funktionalität greift.
Für die, die es interessiert, ein kleiner Statusbericht:
- Im laufenden Monat hat die Teergrube gut 50-mal zugeschlagen.
- Unter der Annahme, dass jeder "Angreifer" eine Liste mit mehr als
5 Adressen abklappert, kam es zu folgendem Verhalten:
- Abbruch nach 1 fehlgeschlagenem Zugriff: 7
- Abbruch nach 2 fehlgeschlagenen Zugriffen: 3
- Abbruch nach 5 fehlgeschlagenen Zugriffen: 2
- Abbruch nach 8 oder mehr fehlgeschlagenen
Zugriffen (d. h. vermutlich kein Abbruch): 3
- Von den Angreifern, die es trotz Teergrube mehrfach probiert haben,
haben nur zwei die vollen 2 Minuten "Zwangspause" eingehalten; alle
anderen haben nach 6 bis 40 Sekunden Timeout die nächste Anfrage
geschickt.
- Einige der Angreifer, die nach 1 oder 2 fehlgeschlagenen Zugriffen
abgebrochen haben, haben es nach einer Pause von 15 Minuten bis
mehreren Stunden noch einmal probiert.
Ich bin recht zufrieden und werde das Konzept fortsetzen. Das Prak-
tische daran: Da es in dem Skript zur 404-Fehler-Verarbeitung inte-
griert ist, kann man unbedenklich die Textmuster für die Links er-
weitern, da tatsächlich vorhandene Seiten niemals eine Teergruben-
Antwort zur Folge haben können.
Hier der volle Code aus dem 404-Fehler-Skript:
if (file_exists("meineteergrube.txt")) {
foreach (file("meineteergrube.txt") as $line) {
if (preg_match("|".trim($line)."|", $_SERVER['REQUEST_URI']))
{ $attack = str_replace(array(".*", "\."), array("[...]", "."), trim($line)); }
}
if (isset($attack)) {
$address = gethostbyaddr($_SERVER['REMOTE_ADDR']);
if ($address == $_SERVER['REMOTE_ADDR'])
{ $address = "ohne Adresse"; }
error_log("[info] Teergrube (".$attack."): IP = ".$_SERVER['REMOTE_ADDR']." (".$address.") / FILE = ".$_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'], 0);
sleep(120); // 120 Sekunden = 2 Minuten
// Nur einen der folgenden Header auswählen:
// header("HTTP/1.0 402 Payment Required");
// header("HTTP/1.0 403 Forbidden");
// header("HTTP/1.0 406 Not Acceptable");
header("HTTP/1.0 421 There are too many connections from your internet address");
// header("HTTP/1.0 424 Failed Dependency");
// header("HTTP/1.0 501 Not Implemented");
// header("HTTP/1.0 509 Bandwidth Limit Exceeded");
} else {
// normale 404-Behandlung...
}
Die Datei "meineteergrube.txt" enthält pro Zeile einen regulären
Ausdruck, z. B.
/admin/file_manager\.php
phpmyadmin
der mit der aufgerufenen URL verglichen wird. Bei einem Treffer wird
der Eintrag im error.log um eine Information ergänzt, z. B.
[Sun Apr 11 08:38:32 2010] [error] dibujo6.montes.upm.es File does not exist: /phpmyadmin/main.php
[Sun Apr 11 08:38:32 2010] [error] [info] Teergrube (phpmyadmin): IP = 138.100.127.186 (dibujo6.montes.upm.es) / FILE = /phpmyadmin/main.php
Die Rückmeldung an den Angreifer wird verzögert, und dann wird eine
ungewöhnliche Fehlermeldung zurückgeliefert.
Viele Grüße,
Mario Haßler
php::bar PHP Wiki - Listenarchive