Si revisamos los logs del servidor web, de vez en cuando aparecen toda una serie de peticiones del tipo:
193.108.81.203 - - [12/Jan/2011:16:48:31 +0100] "GET /w00tw00t.at.blackhats.romanian.anti-sec:) HTTP/1.1" 404 488 "-" "ZmEu"
193.108.81.203 - - [12/Jan/2011:16:48:34 +0100] "GET /db/scripts/setup.php HTTP/1.1" 404 471 "-" "ZmEu"
193.108.81.203 - - [12/Jan/2011:16:48:35 +0100] "GET /mysql/scripts/setup.php HTTP/1.1" 404 473 "-" "ZmEu"
193.108.81.203 - - [12/Jan/2011:16:48:35 +0100] "GET /typo3/phpmyadmin/scripts/setup.php HTTP/1.1" 404 480 "-" "ZmEu"
193.108.81.203 - - [12/Jan/2011:16:48:38 +0100] "GET /phpmyadmin/scripts/setup.php HTTP/1.1" 404 477 "-" "ZmEu"
193.108.81.203 - - [12/Jan/2011:16:48:38 +0100] "GET /pma/scripts/setup.php HTTP/1.1" 404 472 "-" "ZmEu"
193.108.81.203 - - [12/Jan/2011:16:48:39 +0100] "GET /web/phpMyAdmin/scripts/setup.php HTTP/1.1" 404 479 "-" "ZmEu"
193.108.81.203 - - [12/Jan/2011:16:48:39 +0100] "GET /xampp/phpmyadmin/scripts/setup.php HTTP/1.1" 404 480 "-" "ZmEu"
193.108.81.203 - - [12/Jan/2011:16:48:39 +0100] "GET /web/scripts/setup.php HTTP/1.1" 404 472 "-" "ZmEu"
193.108.81.203 - - [12/Jan/2011:16:48:39 +0100] "GET /websql/scripts/setup.php HTTP/1.1" 404 474 "-" "ZmEu"
193.108.81.203 - - [12/Jan/2011:16:48:40 +0100] "GET /webadmin/scripts/setup.php HTTP/1.1" 404 476 "-" "ZmEu"
193.108.81.203 - - [12/Jan/2011:16:48:40 +0100] "GET /sqlweb/scripts/setup.php HTTP/1.1" 404 474 "-" "ZmEu"
193.108.81.203 - - [12/Jan/2011:16:48:40 +0100] "GET /websql/scripts/setup.php HTTP/1.1" 404 474 "-" "ZmEu"
En este caso, la IP parece ser del Reino Unido, pero va variando, así como
la petición característica que hace al principio y el user agent del
final, "Zemu". En otras ocasiones, la petición es
/w00tw00t.at.ISC.SANS.DFind:)
.
Es algo que ya lleva un tiempo por el mundo, ya que se pueden encontrar referencias en Google de cómo mínimo un par de años. Podemos filtrar y bloquear esta clase de escaneos de varias maneras.
iptables
Con iptables
, a través de un script que bloquea la IP automáticamente,
aunque se deben crear una reglas previamente y programar su ejecución periódica
en el cron
.
Con iptables
, para bloquear una IP concreta, ejecutamos:
$ sudo iptables -I INPUT -s 193.108.81.203 -j DROP
Ahora vamos a crear las reglas que necesita el script:
$ sudo iptables -N drop_w00t
$ sudo iptables -A INPUT -j drop_w00t
$ sudo iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
Guardaremos las reglas y las haremos permanentes ejecutando:
$ sudo iptables-save
También podemos incluir una IP en la cadena que acabamos de crear:
$ sudo iptables -A drop_w00t -s 211.94.188.52 -j DROP
Podemos ver las IP bloqueadas en este momento (el argumento -n
nos muestra
las IPs, si no lo ponemos nos saldrá el dominio al que resuelve la IP, si es
que lo hay):
$ sudo iptables -L drop_w00t -n
Chain drop_w00t (1 references)
target prot opt source destination
DROP all -- 193.108.81.203 0.0.0.0/0
DROP all -- 62.215.201.252 0.0.0.0/0
DROP all -- 80.232.176.202 0.0.0.0/0
DROP all -- 92.243.22.73 0.0.0.0/0
DROP all -- 211.94.188.52 0.0.0.0/0
DROP all -- 116.255.163.100 0.0.0.0/0
Si queremos borrar una regla, primero averiguamos qué número tiene:
$ sudo iptables -L INPUT -n --line-numbersbash
Y después borramos la regla usando ese número:
$ sudo iptables -D INPUT [número]bash
Podemos borrar una IP bloqueada dentro de una regla:
$ sudo iptables -D drop_w00t [número]bash
fail2ban
También se puede filtrar con fail2ban
, añadiendo una nueva opción.
A partir de la versión 0.8.1 ya están definidas las acciones necesarias a
llevar a cabo con iptables
. Si tenemos una versión anterior, podemos seguir
los pasos previos definidos en el enlace anterior.
Lo primero es crear un filtro, /etc/fail2ban/filter.d/apache-w00tw00t.conf
:
# 193.108.81.203 - - [12/Jan/2011:16:48:31 +0100] "GET /w00tw00t.at.blackhats.romanian.anti-sec:) HTTP/1.1" 404 488 "-" "ZmEu"
[Definition]
# Option: failregex
# Notes.: regex to match the w00tw00t scan messages in the logfile. The
# host must be matched by a group named "host". The tag "" can
# be used for standard IP/hostname matching.
# Values: TEXT
failregex = ^ -._"GET \/w00tw00t\.at.*"._
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
ignoreregex =
Declaramos el filtro en /etc/fail2ban/jail.conf
para que si detecta el
escaneo en el fichero de log del Apache, banee al usuario durante un tiempo:
[apache-w00tw00t]
enabled = true
filter = apache-w00tw00t
action = iptables-allports[name=w00tw00t]
mail-whois[name=w00tw00t, dest=]
logpath = /var/log/apache2/other_vhosts_access.log
maxretry = 1
bantime = 86400
mod_security
Y por último, también se puede utilizar mod_security
, añadiendo las
siguientes reglas:
SetEnvIfNoCase Request_URI "w00tw00t.at.blackhats.romanian.anti-sec" drop
SetEnvIfNoCase Request_URI "w00tw00t.at.ISC.SANS.DFind" drop
SetEnvIfNoCase Request_URI "w00tw00t.at.ISC.SANS.test0" drop
Lo malo es que mod_security
no nos protegerá de esa IP contra otros
servicios.