Nous allons établir une règle qui ne va filtrer que le paquet qui nous intéresse, en l'occurence le premier contenant la requête HTTP (GET, POST...). Tous les autres paquets de la connexion seront ignorés.
Rappel concernant l'établissement d'une connexion TCP :
- le client se connecte au serveur en envoyant un paquet SYN (Synchronize).
- le serveur répond en envoyant un paquet SYN+ACK (Synchronize + Acknowledgement).
- le client répond avec un paquet ACK (Acknowledgement).
- la communication est dès lors établie, le client peut envoyer les données PSH+ACK (Push + Acknowledgement), le serveur va y répondre et ainsi de suite jusqu'à la fermeture de la connexion.
Concept :
- recherche élargie :
certain script-kiddies modifient la chaîne "GET /w00tw00t.at.ISC.SANS." avec un éditeur hexadécimal (ex : "GET /test.w00t:)"). Pour contrer cette limitation, le filtrage doit aussi porter sur le fait que la requête n'est pas conforme au protocole HTTP v1.1 et se baser sur la séquence "HTTP/1.1" + 2 retours à la ligne (CR/LF/CR/LF) qui sera convertie en hexadécimale avec le paramètre --hex-string. - blacklist de l'IP :
à chaque fois que DFind sera détecté, il sera blacklisté pendant 6 heures grâce au module ipt_recent d'iptables. Si l'attaquant revient avant la fin l'expiration de la période de bannissement, 6 heures seront à nouveau ajoutées à cette période (paramètres --update). - reset de la connexion :
le paquet est rejeté et la connexion immédiatement terminée (-p tcp -j REJECT --reject-with tcp-reset). Ici, l'utilisation de DROP n'est pas très intéressante car le blocage intervient après la séquence d'établissement de la connexion et de ce fait, le scanner sait qu'il y a un serveur HTTP connecté. Il est donc inutile de vouloir lui faire croire le contraire, ni même de perdre du temps.
Contenu du script anti-w00tw00t_rules.sh :
#!/bin/bash
# cette partie est à mettre au tout début de vos règles :
# 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 :
# accepte les connexions établies, etc :
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
iptables -A w00t -m recent -p tcp --tcp-flags PSH,ACK PSH,ACK --dport 80 --remove \
-m string --to 80 --algo bm --string "w00tw00t.at.ISC.SANS." -j w00tchain Vérifications :
Une fois les règles en place il est possible d'avoir un apperçu des paquets et nombres d'octets rejetés avec iptables : servername:~# iptables -L w00t -nvx servername:~# cat /proc/net/ipt_recent/w00tlist Source :
Utiliser iptables pour bloquer les chaines de caractères (1ere partie)
Utiliser iptables pour bloquer les chaines de caractères (2eme partie)
# man iptables# iptables [PARAMETRE] --help Ajouter un commentaire









