Rendez-vous sur Arrakis

C'est lorsque nous croyons savoir quelque chose qu'il faut justement réfléchir un peu plus profondément. F. Herbert

Piège de bots malveillants pour son site web

Quand on analyse les journaux de son serveur web, on voit régulièrement des requêtes vers des “wp-login.php” afin de vérifier la présence d'un wordpress par exemple. On voit aussi d'autres choses qui n'aboutissent pas, mais qui indique qu'un robot titille le serveur en quête d'une faille.

Loin de moi l'idée de pouvoir toutes les déceler.

Cependant, j'ai mis en place un truc tout bête pour attirer les bots et les piéger. L'idée est un peu similaire à l'utilisation de vilain, sauf qu'on ne va utiliser que des outils déjà présents sur le système (pas besoin de python). On laisse trainer une URL piège, puis on regarde régulièrement qui essaie d'y accéder, et PAN, on blackliste dans le parefeu. C'est un chouïa moins efficace, mais le principe intéressera peut-être certains.

En passant, je rappelle que vous pouvez utiliser des listes d'IP à blacklister : ce sont celles qui sont tombées dans un piège similaire 😀.

Création du piège

Tout d'abord, créez dans la configuration d'httpd (/etc/httpd.conf) un dossier qui sera interdit. Pour l'exemple, je l'appellerai “/trap”.

    location "/trap/*" {
            authenticate "Password required" with "/trap.htpw"
    }

Pour accéder au dossier /trap, il faut entrer un mot de passe. Afin de créer le fichier /trap.htpw, utilisez cette commande :

htpasswd /var/www/trap.htpw

Ça vous demandera un mot de passe. Mettez un truc incompréhensible très long dont vous ne vous souviendrez pas avec un peu n'importe quoi dedans.

Modifiez les permissions sur ce fichier :

chown www /var/www/trap.htpw
chmod 400 /var/www/trap.htpw

Relancer httpd avec rcctl reload httpd puis essayer d'ouvrir /trap dans un navigateur. Si vous échouez pour le mot de passe, une erreur 401 apparaîtra dans les journaux d'httpd sous cette forme :

yoursite.net 140.205.205.23 - - [20/Jun/2018:21:34:00 +0200] "GET /trap/ HTTP/1.1" 401 0 "https://yoursite.net" "Scrapy/1.5.0 (+https://scrapy.org)"

Afin de “semer” le piège, ajoutez un lien caché dans vos pages web pour les bots. Par exemple ainsi :

<a rel="nofollow" style="display:none;" href="/trap/">Do NOT follow this link or you will be banned from the site!</a>

Amorcer le piège

Le parefeu

Pour piéger les robots trop curieux, créez une table dans votre parefeu qui contiendra les IP des vilains dans /etc/pf.conf :

table <trapped>
...
...
block quick from <trapped>

Puis rechargez pf : pfctl -f /etc/pf.conf.

Toutes les IP dans cette table seront simplement ignorées.

La surveillance des logs

Le script suivant va regarder dans vos journaux les essais vers le piège. Ce script pourrait être amélioré. Ici, il bloque ceux qui ont tenté un accès à plusieurs reprises.

#!/bin/sh
# trapbots

LOG=/var/www/logs/access.log
for ip in $(grep "/trap" "$LOG" | sort | uniq -d | uniq | cut -d' ' -f 2); do
    pfctl -t trapped -T add $ip
done

Créez une tâche cron pour l'utilisateur root en entrant crontab -e. Ajoutez une ligne qui appellera le script ci-dessus :

*/10 * * * *    /usr/local/bin/trapbots > /dev/null 2>&1

Ici, ce script est lancé toutes les 10 minutes.

Éviter les Faux-positifs

Pour ne pas bloquer les gentils robots qui référencent votre site, pensez à mettre dans un fichier “/robots.txt” quelque chose comme ça :

User-agent: *
Disallow: /trap/

Et tant pis pour les bots qui ne respectent pas cette demande.