Tarpit avec iptables

De Lea Linux
Aller à la navigation Aller à la recherche


tarpit avec iptables

Par Tony

Les tarpits (de l'anglais "tar", goudron, et "pit", une fosse) font partie des mécanismes de défense contre la propagation des vers, spams et autres. Le concept vient de LaBrea Tarpit développé par Tom Liston.

Principe d'utilisation des tarpits

Les tarpits servent à ralentir les connexions des personnes qui se branchent dessus. Le but étant de garder la connexion active le plus longtemps possible du côté de l'attaquant. Dans un monde où les tarpits seraient généralisés, un attaquant devrait alors ruser et ne pourrait plus s'attaquer à une IP au hasard pour faire propager des vers par exemple (la problèmatique de générer une IP à attaquer aléatoirement devrait disparaître avec l'IP v6, en effet, l'espace d'adresse sera moins saturé donc il y aura beaucoup moins de chance que l'adresse soit une adresse utilisée).

Quand Tom Liston présente pour la première fois la notion de tarpits, il explique qu'il cherchait une parade au vers CodeRed. Il constata qu'en général quand on se voit attribuer un bloc d'adresses publiques, il est rare de tout utiliser. Donc il pensa que tout trafic vers ses IP publiques non attribuées ne pouvait être qu'un trafic illicite. Il commença alors à écrire un petit service qui écoutait sur le port 80 de ces machines (le port où CodeRed attaquait) et qui répondait au SYN par un SYN/ACK avec une valeur de MSS très petite, ce qui avait pour effet de ralentir le vers (il ne pouvait plus envoyer que des paquets de petite taille, de plus, le service n'écoutait plus la session ensuite).

Finalement, le principe de tarpit pouvait être généralisé à n'importe quel port TCP. Il est conseillé de l'utiliser que sur des ports où l'on est sûr d'avoir aucun trafic "légal". Par exemple, le port 113, où identd est lié, est utilisé par certains serveurs IRC pour connaître le login de l'utilisateur. Si on "tarpitte" ce port, le serveur n'aura jamais sa réponse et l'utilisateur n'obtiendra jamais sa connexion. Au final, il faudra donc peser le pour et le contre de cette technique. Sur une IP qui n'est pas attribuée, on pourra "tarpiter" tous les ports sans problème, mais sur une IP attribuée, il faudra bien faire attention à ne pas être trop agressif dans les règles au risque de réduire connectivité du réseau.

L'implémentation dans le noyau Linux et dans Netfilter

L'installation

Sous Gentoo, il est possible d'activer les extensions d'iptables directement à partir de l'ebuild, on procéde de la manière suivante :

USE="extensions" emerge iptables

Néanmoins, le noyau par défaut n'est pas patché avec les extensions, il faut donc les récuperer sur le FTP de Netfilter : http://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/ Le mieux est d'y prendre la version la plus récente. Cette archive tar contient bien plus que l'extension tarpit. Il nous est alors offert deux choix pour activer le tarpit.

Utiliser le script "run-me" patch-o-matic

Une fois que vous avez récupéré l'archive des extensions sur le site de Netfilter, vous pouvez décompresser l'archive tar.

# dans mon cas, j'avais la version du 16 janvier 2007
tar xvzf patch-o-matic-ng-20070116.tar.bz2
cd patch-o-matic-ng-20070116

Et là, il suffit simplement de lancer le script runme :

./runme

Celui-ci vous pose quelques questions et rajoute finalement l'option TARPIT dans le noyau.

Faire l'installation de l'extension tarpit à l'intérieur du noyau à la main

Vous n'avez pas besoin de faire cette étape si vous avez déjà appliqué le patch avec la technique présentée au desssus.

Dans mon cas, je pouvais activer les extensions dans iptables sans avoir à patcher (c'était en natif dans mon système), donc je ne voulais pas avoir à recompiler iptables. De plus, je n'avais guère envie de rajouter toutes les extensions à mon noyau.

Attention, ce qui va suivre n'est pas la façon recommandée de procéder, cela marche chez l'auteur, mais ce n'est pas une méthode officielle suppportée.

La procédure suivante est pour un noyau 2.6. Il ne tiendra qu'à vous de l'adapter si vous voulez tester avec une autre version du noyau.

Je copie d'abord le module tarpit dans le noyau.

#ici, je suis à la racine de l'archive
#(il faut que /usr/src/linux corresponde au chemin des sources de votre noyau)
cp patchlets/TARPIT/linux-2.6/net/ipv4/netfilter/ipt_TARPIT.c /usr/src/linux/net/ipv4/netfilter

Et c'est là que c'est "sale", car on va ajouter les patch à la main sur les fichiers du noyau :

cat patchlets/TARPIT/linux-2.6/net/ipv4/netfilter/Kconfig.ladd 
config IP_NF_TARGET_TARPIT
        tristate 'TARPIT target support'
        depends on IP_NF_FILTER
        help
          Adds a TARPIT target to iptables, which captures and holds
          incoming TCP connections using no local per-connection resources.
          Connections are accepted, but immediately switched to the persist
          state (0 byte window), in which the remote side stops sending data
          and asks to continue every 60-240 seconds.  Attempts to close the
          connection are ignored, forcing the remote side to time out the
          connection in 12-24 minutes.
 
          This offers similar functionality to LaBrea
          <http://www.hackbusters.net/LaBrea/> but doesn't require dedicated
          hardware or IPs.  Any TCP port that you would normally DROP or REJECT
          can instead become a tarpit. 

On voit là le contenu du patch, il suffit d'ouvrir le fichier /usr/src/linux/net/ipv4/netfilter/Kconfig avec votre éditeur préféré et de rajouter les lignes en bleu au dessus. Collez le en dessous de la première entrée de type config.

On ouvre ensuite /usr/src/linux/net/ipv4/netfilter/Makefile et on se place à la ligne contenant :

obj-$(CONFIG_IP_NF_TARGET_REJECT) += ipt_REJECT.o

On rajoute en dessous la ligne :

obj-$(CONFIG_IP_NF_TARGET_TARPIT) += ipt_TARPIT.o

Maintenant, tout est prêt, on va pouvoir activer le TARPIT dans les options du noyau.

Activer le module TARPIT dans le noyau

On lance le make xconfig ou le make menuconfig de notre noyau et on va dans les menus suivants :

Networking ->
  Networking options ->
    Network packet filtering (replaces ipchains) ->
     IP: Netfilter Configuration ->
      TARPIT target support

Il est conseillé de le mettre en module (ne serait-ce que parce que l'on aura pas besoin de redémarrer le noyau pour pouvoir l'installer).

Ensuite :

make && make modules_install

Vous pouvez faire un modprobe sur le module pour vérifier qu'il est bien installé.

modprobe ipt_TARPIT

La mise en place

Il suffit de se servir d'iptables en créant des règles comme on le ferait normalement, mais en utilisant comme cible "TARPIT".

# une petite règle pour ralentir les spammeurs
iptables -A INPUT -p tcp --dport smtp -j TARPIT

On peut convertir un ensemble de règle de ce type (attention, très agressif, tous les ports non explicitement autorisés vont utiliser un tarpit) :

# ...
# ici plein de règles avec des ACCEPT
# ex: iptables -A INPUT -i mon_interface -p TCP -s ma_source --dport mon_port -j ACCEPT
# ...
iptables -A INPUT -p tcp -j DROP

en

# ...
# les mêmes règles
# ...
iptables -A INPUT -p tcp -j TARPIT

On peut aussi être plus souple. Imaginons que nous souhaitons autoriser les accès SSH à une machine que par un groupe de machines défini de manière explicite. Tout accès non listé est alors non autorisé (le serveur SSH étant souvent attaqué par des "zombies" qui tentent la force brute pour trouver un compte valide). On aurait alors une règle de la forme :

iptables -A INPUT -i ppp0 -p TCP -s hote1 --dport ssh -j ACCEPT
iptables -A INPUT -i ppp0 -p TCP -s hote2 --dport ssh -j ACCEPT
iptables -A INPUT -i ppp0 -p TCP -s hote3 --dport ssh -j ACCEPT
iptables -A INPUT -i ppp0 -p TCP --dport ssh -j TARPIT



@ Retour à la rubrique Sécurité et vie privée

Copyright

© 2007, 2010 Tony Cheneau

Tête de GNU Vous avez l'autorisation de copier, distribuer et/ou modifier ce document suivant les termes de la GNU Free Documentation License, Version 1.2 ou n'importe quelle version ultérieure publiée par la Free Software Foundation; sans section invariante, sans page de garde, sans entête et sans page finale.