Un enregistrement “GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1” dans vos logs Apache indique que quelqu'un tente de hacker votre site web. Cette entrée doit toujours indiquer une erreur “400” sur votre site, indiquant ainsi que la tentative à échoué.
Il ne s'agit en fait que d'un scanner de vulnérabilités (DFind) sans grand intérêt si ce n'est qu'il pollue en permanence vos logs. Il en existe plusieurs variantes.
Pour filtrer ces scans, on va utiliser l'excellent iptables.
Règles iptables trouvées sur http://spamcleaner.org/fr/misc/w00tw00t.html
Pour mettre en place les deux méthodes ci-dessous il est fortement recommandé de placer ces scripts dans un fichier qui sera relancé à chaque démarrage du serveur, exemple :
sudo vi /etc/init.d/firewall.sh
On va alors saisir le shebang et la déclaration LSB pour définir l'ordre de démarrage :
#!/bin/bash ### BEGIN INIT INFO # Provides: firewall # Required-Start: $all # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Mise en place des règles iptables # Description: Met en place les règles iptables, est exécuté après tous les autres scripts. ### END INIT INFO
Puis copiez à la suite le script d'une des deux méthodes ci-dessous.
On définit ensuite le fichier comme exécutable :
sudo chmod +x /etc/init.d/firewall.sh
Puis on ajoute ce script au démarrage de la machine :
sudo insserv firewall.sh
Par la suite pour le retirer
sudo insserv -r firewall.sh
Attention pour Lenny la commande insserv ne fonctionnera pas, voir ici.
Il s'agit de la méthode la plus simple, on va filtrer directement les paquets sur la chaine de caractères. Remplacez xxx.xxx.xxx.xxx par l'adresse ip publique de votre serveur :
iptables -I INPUT -d xxx.xxx.xxx.xxx -p tcp --dport 80 -m string --to 70 --algo bm --string 'GET /w00tw00t.at.ISC.SANS.' -j DROP # mettez ici vos propres règles iptables...
Cette méthode va surtout bloquer les scripts-kiddies et dépolluer vos logs, les hackers expérimentés pourront contourner cette méthode.
Cette méthode s'avère plus précise et effectuera une recherche élargie.
# accepte loopback iptables -A INPUT -i lo -j ACCEPT # Vérifie si l'IP est déjà présente dans la liste w00tlist. # Si c'est la cas, on la rejette immédiatement, met à jour la liste et l'attaquant est de nouveau blacklisté pour 6h : iptables -A INPUT -p tcp -m recent --name w00tlist --update --seconds 21600 -j DROP # Création de la chaine w00tchain qui rajoute l'IP # à la liste w00tlist et reset la connexion (ne pas oublier le paramètre # '-p tcp' indispensable pour l'utilisation de '--reject-with tcp-reset') : iptables -N w00tchain iptables -A w00tchain -m recent --set --name w00tlist -p tcp -j REJECT --reject-with tcp-reset # Création de notre chaîne w00t : iptables -N w00t # Redirige les paquets TCP sur notre chaîne : iptables -A INPUT -p tcp -j w00t ##################################################### # mettez ici vos propres règles iptables... iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ##################################################### # Chaîne w00t : recherche du premier SYN et création de la liste : iptables -A w00t -m recent -p tcp --syn --dport 80 --set # Recherche du paquet SYN,ACK et mise à jour la liste : iptables -A w00t -m recent -p tcp --tcp-flags PSH,SYN,ACK SYN,ACK --sport 80 --update # Recherche du paquet ACK et mise à jour la liste : iptables -A w00t -m recent -p tcp --tcp-flags PSH,SYN,ACK ACK --dport 80 --update # Recherche de la signature hexadécimale dans le prenier PSH+ACK. # Si elle est présente, on renvoie sur w00tchain pour blacklister et terminer la connexion. # On supprime la liste pour ne pas filtrer les paquets suivants : iptables -A w00t -m recent -p tcp --tcp-flags PSH,ACK PSH,ACK --dport 80 --remove -m string --to 80 --algo bm --hex-string '|485454502f312e310d0a0d0a|' -j w00tchain
Pour exécuter le filtrage et voir ce qui sera exécuté au démarrage du serveur :
sudo /etc/init.d/firewall.sh